我必须做一个功课,然后尝试实现lookAt功能。我试过很多方面,但我得到的唯一结果是蓝屏。我的程序的其余部分工作很大,事实上,如果我使用glm :: lookAt一切都很好。这是我的代码:
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;
答案 0 :(得分:11)
我看到你使用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 向上, s 是正确的向量)。然后确保向上矢量垂直于方向和右向量,您将其重新计算为其叉积,因为当您给出< strong>向上你不能确定它与眼睛中心向量(视图方向)垂直,它们只是形成一个平面,它给你右向量强>
矩阵由这些构成。有关其工作原理的详细信息,请查看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)相乘,顺序很重要。 编写实现时,请确保使用coloumn主矩阵,因为有opengl或转置它们。
我希望它有所帮助。