如何解决OpenGL:使用lookAt函数时,相机未按预期移动
我目前正试图绕着我创建的迷宫的外围飞行。这是我调用idle
函数的lookAt
函数的代码:
void idle()
{
GLfloat angle_radian = D2R*angle;
float eye_x = 10 * -1*cos(angle_radian);
float eye_z = 10 * sin(angle_radian);
vec4 eye = {eye_x,12,eye_z,0};
vec4 at = {5,5,0};
vec4 up = {0,1,0};
model_view = look_at(eye,at,up);
angle += 0.5;
glutPostRedisplay();
}
相机正确地绕迷宫盘旋,但是,相机似乎也改变了旋转过程中向下看的角度。这使我感到困惑,因为我所看的位置的Y坐标没有改变(迷宫构造在y = 0平面上)。我相当确定lookAt
函数的实现是正确的,但是如果我忽略了某些内容,则可以使用以下代码:
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;
}
解决方法
您没有看(0,0,0),但是您看了(5,0,5)。因此,您需要根据目标(5,0,5):
计算旋转vec4 at = {5,5,0};
float eye_x = 10 * -cos(angle_radian) + at[0];
float eye_y = 12 + at[1];
float eye_z = 10 * sin(angle_radian) + at[1];
vec4 eye = {eye_x,eye_y,eye_z,0};
vec4 up = {0,1,0};
model_view = look_at(eye,at,up);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。