我在理解gluLookAt的规范时遇到了一些问题。例如,z轴定义为:
F=( centerX - eyeX,centerY - eyeY,centerZ - eyeZ )
中心是相机看的点,眼睛是相机所在的位置。
F=F/ |F|
并且视图矩阵M被定义为:
( 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有什么意义呢?
发布于 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矩阵是:
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),矩阵是:
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‘为正值,摄像机看不到它。
发布于 2022-01-11 09:47:38
我知道这不是对这个问题的直接回答,但它可能会帮助那些在不使用GLU的情况下寻找等效功能的人,例如,如果他们正在将旧的OpenGL2代码移植到现代的OpenGL上。
下面是一个与gluLookAt(...)等效的函数
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);
}https://stackoverflow.com/questions/42977477
复制相似问题