LookAt函数:我快疯了

9

我必须完成一份作业,尝试实现lookAt函数。我已经尝试了很多种方法,但唯一得到的结果就是一个蓝屏。我的程序的其余部分运行良好,事实上,如果我使用glm :: lookAt,则一切都很好。这是我的代码:

mat4 Transform::lookAt(const vec3 &eye, const vec3 &center, 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;
1个回答

16

我看到你在使用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 是右方向)。然后,为了确保上向量垂直于方向右向量,您可以通过重新计算它们的叉积来实现,因为当您给出一个上向量时,无法确保其与视线中心向量(视图方向)垂直,它们只是形成一个平面,从而给您提供了右向量
该矩阵由这些向量构建而成。要了解更多详细信息,请查看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所需的,或者对它们进行转置。

希望这可以帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接