首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gluLookAt规范

gluLookAt规范
EN

Stack Overflow用户
提问于 2017-03-23 21:28:46
回答 2查看 530关注 0票数 0

我在理解gluLookAt的规范时遇到了一些问题。例如,z轴定义为:

F=( centerX - eyeX,centerY - eyeY,centerZ - eyeZ )

中心是相机看的点,眼睛是相机所在的位置。

F=F/ |F|

并且视图矩阵M被定义为:

代码语言:javascript
复制
( x[0]   x[1]   x[2]  0 )
( y[0]   y[1]   y[2]  0 )
(-f[0]  -f[1]  -f[2]  0 )
( 0        0      0   1 )

X和y是x,y轴,f是z轴。

如果我的相机定位在(0,0,5),相机看起来在中心。然后f将沿着负z轴看,因为第一个方程(中心眼)f向量将是:(0,0,0) - (0,0,5) = (0,0,-5)

到目前为止,对我来说一切都是有意义的,但是在上面的M矩阵中,f向量乘以-1。这样,f向量看起来就是沿着正z轴,远离中心。

我发现透视矩阵gluPerspective还会将camrea的z轴乘以-1,这会再次旋转z轴,使其朝向世界的负z轴。

那么乘以-1有什么意义呢?

EN

回答 2

Stack Overflow用户

发布于 2017-03-23 21:43:48

因为gluLookAt是右手系统的视图矩阵。在此空间中,当Z坐标移出屏幕或位于相机后面时,它会递增。因此,摄像机可以看到的所有对象在视图空间中都具有负Z。

编辑

你应该复习一下你的数学。您暴露的矩阵缺少从到相机位置的转换。

遵循这个notation,让我们这样做:

获取 f normalized、up normalized、s normalized和u=sn x f。请注意,s< length=1 >e212必须标准化,因为f和up可能不是垂直的,因此它们的叉积不是length=1的向量。这在上面的链接中没有提到。

形成矩阵并预乘以到相机位置的平移,L= M·T

得到的lookAt矩阵是:

代码语言:javascript
复制
 s.x   s.y   s.z  -dot(s, eye)
 u.x   u.y   u.z  -dot(u, eye)
-f.x  -f.y  -f.z  dot(f, eye)
  0     0     0      1

对于您的数据:camera=(0,0,5)target=(0,0,0)up=(0,1,0),矩阵是:

代码语言:javascript
复制
1  0  0  0
0 -1  0  0
0  0  1 -5
0  0  0  1

让我们将这个变换应用于点A=(0,0,4)。我们得到A'=(0,0,-1)。

同样对于B=(0,0,20),B'=(0,0,15)。

A‘有一个负的Z,所以相机能看到它。B‘为正值,摄像机看不到它。

票数 1
EN

Stack Overflow用户

发布于 2022-01-11 09:47:38

我知道这不是对这个问题的直接回答,但它可能会帮助那些在不使用GLU的情况下寻找等效功能的人,例如,如果他们正在将旧的OpenGL2代码移植到现代的OpenGL上。

下面是一个与gluLookAt(...)等效的函数

代码语言:javascript
复制
void gluLookAt(float eyeX, float eyeY, float eyeZ,
               float centreX, float centreY, float centreZ,
               float upX, float upY, float upZ) {
    GLfloat mat[16];
    float forwardX = centreX - eyeX;
    float forwardY = centreY - eyeY;
    float forwardZ = centreZ - eyeZ;

    glm::vec3 forward = glm::normalize(glm::vec3(forwardX, forwardY, forwardZ));

    glm::vec3 right = glm::cross(glm::vec3(forwardX, forwardY, forwardZ),
                                 glm::vec3(upX, upY, upZ));
    right = glm::normalize(right);

    mat[0] = right.x;
    mat[1] = right.y;
    mat[2] = right.z;
    mat[3] = 0.0f;
    mat[4] = upX;
    mat[5] = upY;
    mat[6] = upZ;
    mat[7] = 0.0f;
    mat[8] =  -forward.x;
    mat[9] =  -forward.y;
    mat[10] =  -forward.z;
    mat[11] = 0.0f;
    mat[12] =  0.0f;
    mat[13] =  0.0f;
    mat[14] =  0.0f;
    mat[15] = 1.0f;

    glMultMatrixf(mat);
    glTranslatef (-eyeX, -eyeY, -eyeZ);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42977477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档