OpenGL:当应用我自己的 lookAt 函数时,屏幕是空白的

OpenGL: When applying my own lookAt function the screen is blank

我正在编写我自己的 gluLookAt 版本。我相信我有正确的实现,但是返回的矩阵通常充满了 nan。

这是我的函数:

mat4 look_at(vec4 eye, vec4 at, vec4 up)
{
  vec4 vpn = vec4_sub(eye, at);
  vec4 n = vec4_norm(vpn);
  vec4 u = vec4_norm(vec4_cross(up, n));
  vec4 v = vec4_norm(vec4_cross(n, u));
  vec4 p = { eye.x, eye.y, eye.z, 1 };

  mat4 m;
  m.x.x = u.x; m.y.x = u.y; m.z.x = u.z; m.w.x = u.w;
  m.x.y = v.x; m.y.y = v.y; m.z.y = v.z; m.w.y = v.w;
  m.x.z = n.x; m.y.z = n.y; m.z.z = n.z; m.w.z = n.w;
  m.x.w = p.x; m.y.w = p.y; m.z.w = p.z; m.w.w = p.w;

  mat4 m_t = mat4_trans(m);
  mat4 m_t_inv= mat4_inv(m_t);

  return m_t_inv;
}

我目前正在尝试查看我制作的立方体的顶部。立方体为 1x1x1,以原点为中心。我像这样设置 model_view:

vec4 e = {0, 1, 0, 1};
vec4 a = {0, 0, 0, 0};
vec4 u = {0, 0, 1, 0};
model_view = look_at(e, a, u);

我相信我的参数是正确的。我想从y=1往下看原点。 问题似乎出在我的职能上吗?还是我误解了参数?

轴向量 uvp 的第四个分量必须为零。在您的情况下,vpn 的第四个分量不为零,因为 eye{0, 1, 0, 1}.
我建议使用 vec3 而不是 vec4 来计算 uvp。但是,您可以通过设置 vpn[3] = 0:

来解决问题
vec4 vpn = vec4_sub(eye, at);
vpn[3] = 0