opengl - LookAt函数: I'm going crazy

标签 opengl vector matrix fragment-shader glulookat

我必须做作业,然后尝试实现lookAt函数。我尝试了很多方法,但是唯一得到的结果是蓝屏。我程序的其余部分都可以很好地工作,如果我使用glm::look实际上就很好。这是我的代码:

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;

最佳答案

我看到您将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/

相关文章:

c - Visual Studio : Won't draw rectangle in a subwindow

c++ - 如果我在 std::remove 函数中直接传递数组元素 ar[0] 而不是 x,为什么会得到不同的结果?

c++ - 将 c++ vector<float> 复制到 Obj-C Float32 数组的最快方法

java - 我在 Asteroids 游戏中使用 Vector2d 类是否多余?

c - 在c中打印出变量会改变变量的值

matrix - 我可以在四元数中切换X Y Z吗?

opengl - 在 GLSL 中如何判断事件纹理是否为纹理 id 0?

c++ - 绕错误的轴旋转

c++ - OpenGL命令的执行顺序

c - 旋转存储像素的矩阵