游戏开发论坛

 找回密码
 立即注册
搜索
123
返回列表 发新帖
楼主: jxk

请问OpenGL的投影平面--

[复制链接]

24

主题

110

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2005-10-28 15:17:00 | 显示全部楼层

Re:请问OpenGL的投影平面--

mesa  的实现里面,投影平面在 znear处(经过证实),,opengl官方的实现应该在znear书,刚刚再一本书上看到,,不过这个问题确实无所谓...呵呵,
mesa的实现.....
gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
{
    GLdouble m[4][4];
    double sine, cotangent, deltaZ;
    double radians = fovy / 2 * __glPi / 180;

    deltaZ = zFar - zNear;
    sine = sin(radians);
    if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) {
        return;
    }
    cotangent = COS(radians) / sine;

    __gluMakeIdentityd(&m[0][0]);
    m[0][0] = cotangent / aspect;
    m[1][1] = cotangent;
    m[2][2] = -(zFar + zNear) / deltaZ;
    m[2][3] = -1;
    m[3][2] = -2 * zNear * zFar / deltaZ;
    m[3][3] = 0;
    glMultMatrixd(&m[0][0]);
}

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2005-12-7 20:36:00 | 显示全部楼层

Re:请问OpenGL的投影平面--

我靠,搞了半天不就是坐标变换么,modelview变换---投影变换---视口变换就可以得到3维空间某个点在屏幕上的位置.
vec4 pos=gl_ModeViewMatrix*gl_ProjectionMatrix*gl_Vertex;
这里gl_ModelViewMatrix是modelview矩阵,gl_projectionMatrix是投影矩阵,gl_vertex是顶点坐标
然后vec2 tmp=vec2(pos.x,pos.y)/pos.w
则tmp.x,tmp.y在-1到1之间
然后根据屏幕大小width和height,进行视口变换可以得到:
screenx=((tmp.x+1)/2)*width;screeny=((1-tmp.y)/2)*height;
这里假定视口函数是glViewPort(0,0,width,height)
---------------------------------------------------------------------------------------------------------
我计算出来的gl_ModelView_Matrix为单位矩阵,gl_Projection_Matrix的最后一个元素为0,
glVertex=(0,0,0,1);结果计算出的pos.w=0;
这个怎么拿来做除法?

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2005-12-8 14:19:00 | 显示全部楼层

Re:请问OpenGL的投影平面--

dfq19好久不来了哇?
各位知道的请指点一二哈

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-12-15 21:24:00 | 显示全部楼层

Re:请问OpenGL的投影平面--

OpenGL的投影平面确实在near初,你只要在near处画一个平面,然后微微改变near值,看平面在不在窗口中出现就可以证明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 23:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表