gpt4 book ai didi

opengl - LookAt函数: I'm going crazy

转载 作者:行者123 更新时间:2023-12-04 06:03:41 24 4
gpt4 key购买 nike

我必须做作业,然后尝试实现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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com