我需要帮助计算lookAt方法 这是我的方法
public void lookAt(Vector3f position, Vector3f direction, Vector3f up) {
Vector3f f = new Vector3f();
Vector3f u = new Vector3f();
Vector3f s = new Vector3f();
Vector3f.sub(direction, position, f);
f.normalise(f);
up.normalise(u);
Vector3f.cross(f, u, s);
s.normalise(s);
Vector3f.cross(s, f, u);
this.setIdentity();
this.m00 = s.x;
this.m10 = s.y;
this.m20 = s.z;
this.m01 = u.x;
this.m11 = u.y;
this.m21 = u.z;
this.m02 = -f.x;
this.m12 = -f.y;
this.m22 = -f.z;
this.m30 = -Vector3f.dot(s, position);
this.m31 = -Vector3f.dot(u, position);
this.m32 = Vector3f.dot(f, position);
}
但是当我像这样camera.lookAt(position, new Vector3f(1, 0 ,0), new Vector3f(0, -1, 0));
测试时,我的相机向下看,如果我只是这样做camera.lookAt(position, new Vector3f(10000, 0 ,0), new Vector3f(0, -1, 0));
,相机就会向前看。你能帮忙吗?
P.S。对不起我的英文
答案 0 :(得分:0)
lookAt函数的第二个参数通常不是您想要查看的方向,而是您要查看的点。据我所知,你的方法的计算也需要第二个点,而不是一个方向(从两点计算并存储在f中)。
总之,除非您将错误的参数传递给函数,否则您看起来的结果是正确的。
如何创建一个从点和方向创建矩阵的函数
所需的旋转是将负z方向映射到视图矢量的旋转。另外,我们希望映射x向量,使其垂直于视图和向上矢量所跨越的平面。通过在3x3矩阵的第三行中写入-view,可以相对容易地实现这一点。然后可以将另外两个向量计算为视图和向上向量的叉积,其产生应该映射x轴的右向量。然后通过视图和右矢量的叉积计算最后的矢量(y轴的目标映射)。使用最后一个向量的叉积,因为我们知道所有旋转矩阵都有垂直的基向量:
viewv = normalize(-view)
rightv = normalize(cross(view, up))
upv = normalize(cross(view, up))
-- rightv --
rotation_matrix = [ -- upv -- ]
-- viewv --
当相机位于原点时,我们现在就完成了。但由于通常情况并非如此,我们必须添加一个转换部件,以转换场景,使相机成为原点。因此t = -camera
。
现在通过首先平移空间然后根据我们计算的矩阵旋转它来组成最终矩阵:
lookat_matrix = rotation_matrix * translate(-camera)
由于这里相当晚,根据您使用的符号,可能需要调整旋转矩阵,并且必须调整一些符号。