【问题标题】:LWJGL Matrix lookAt methodLWJGL 矩阵查看方法
【发布时间】:2016-02-06 19:42:46
【问题描述】:

我在计算 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)); 就结束了,相机正在向前看。你能帮忙吗?

附:对不起我的英语

【问题讨论】:

    标签: java opengl matrix lwjgl


    【解决方案1】:

    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)
    

    由于这里已经很晚了,并且根据您使用的符号,可能需要转置旋转矩阵并且必须调整一些符号。

    【讨论】:

    • 好的,那么如何为矩阵制作方法呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多