我必须做作业,然后尝试实现lookAt函数。我尝试了很多方法,但是唯一得到的结果是蓝屏。我程序的其余部分都可以很好地工作,如果我使用glm::look实际上就很好。这是我的代码:
mat4 Transform::lookAt(const vec3 &eye, const vec3 ¢er, const vec3 &up)
{
vec3 w(glm::normalize(eye - center)) ;
vec3 u(glm::normalize(glm::cross(up, w)));
vec3 v(glm::cross(w, u)) ;
mat4 ret = mat4 (
vec4 (u.x,v.x,w.x,0),
vec4 (u.y,v.y,w.y,0),
vec4 (u.z,v.z,w.z,0),
vec4 (-u.x*eye.x-u.y*eye.y-u.z*eye.z,
-v.x*eye.x-v.y*eye.y-v.z*eye.z,
-w.x*eye.x-w.y*eye.y-w.z*eye.z,
1)
);
return ret;
最佳答案
我看到您将glm库用于矩阵运算,因此从glm代码中,lookat实现如下所示:
mat4x4 lookAt(vec3 const & eye, vec3 const & center, vec3 const & up)
{
vec3 f = normalize(center - eye);
vec3 u = normalize(up);
vec3 s = normalize(cross(f, u));
u = cross(s, f);
mat4x4 Result(1);
Result[0][0] = s.x;
Result[1][0] = s.y;
Result[2][0] = s.z;
Result[0][1] = u.x;
Result[1][1] = u.y;
Result[2][1] = u.z;
Result[0][2] =-f.x;
Result[1][2] =-f.y;
Result[2][2] =-f.z;
Result[3][0] =-dot(s, eye);
Result[3][1] =-dot(u, eye);
Result[3][2] = dot(f, eye);
return Result;
}
首先,将要使用的向量归一化( f 是您查看的方向, u 向上,的是正确的向量)。然后,要确保向上矢量垂直于方向,和正确正确矢量,则将其重新计算为叉积,因为当您提供向上矢量时,您不能确保其垂直于眼睛-中心矢量(查看方向),它们只是形成一个平面,为您提供右侧矢量。
矩阵是由这些构成的。有关更多详细信息,请检查http://www.songho.ca/opengl/gl_transform.html页面。
简而言之:这是一个矩阵,可为您创建一个新的坐标系,因此列为轴。然后,在最后一个列中应用转换矩阵。
(看一下身份矩阵:
AXIS TRANSFORM
x y z transl.
1, 0, 0, 0
0, 1, 0, 0,
0, 0, 1, 0
0, 0, 0, 1
这将为您提供标准坐标系,而无需平移。)
然后将其与投影矩阵和模型矩阵(p * v * m)相乘,顺序很重要。
编写实现时,请确保使用因opengl导致的主要矩阵或转置矩阵。
希望对您有所帮助。
关于opengl - LookAt函数: I'm going crazy,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19740463/