【问题标题】:Calculate a 3d camera matrix计算 3d 相机矩阵
【发布时间】:2013-10-17 11:48:26
【问题描述】:

这是家庭作业,但我一直在努力完成我们的作业,但我不明白我做错了什么。这个想法是从三个给定的向量创建一个相机,中心(相机位置)向上(世界向上,这个是(0,1,0))和lookAt(这是世界坐标中要查看的点) .

当我在 x 和 z 轴上移动相机时,一切工作正常,但是当我在 y 轴(上/下)上移动它时,它只是不会一直看着 (0, 0, 0)。

我有以下代码,Vector3f 和 Matrix4f 来自 javax.vecmath.*

private void updateCameraMatrix() {
    Vector3f z = new Vector3f();
    z.sub(center, lookAt);
    z.normalize();

    Vector3f x = new Vector3f();
    x.cross(z, up);
    x.normalize();

    Vector3f y = new Vector3f();
    y.cross(x, z);
    y.normalize();



    cameraMatrix.set(new float[] {
        x.x, y.x, z.x, 0.0f,
        x.y, y.y, z.y, 0.0f,
        x.z, y.z, z.z, 0.0f,
        0.0f, 0.0f, 0.0f, 1.0f
    });

    cameraMatrix.mul(new Matrix4f(new float[] {
        1.0f, 0.0f, 0.0f, -center.x,
        0.0f, 1.0f, 0.0f, -center.y,
        0.0f, 0.0f, 1.0f, -center.z,
        0.0f, 0.0f, 0.0f, 1.0f
    }));
}

提前感谢您的帮助!

【问题讨论】:

    标签: java 3d


    【解决方案1】:

    我不明白你为什么以你的方式计算x, y, z,。虽然要计算 4x4 矩阵并对其应用 Camera Look At,但我会这样做:

    public final Matrix4 lookAt(Vector3 eye, Vector3 center)
    {
        float dx = eye.x - center.x;
        float dy = eye.y - center.y;
        float dz = eye.z - center.z;
    
        float pitch = (float) Math.atan2(dy, Math.sqrt(dx * dx + dz * dz));
        float yaw = (float) Math.atan2(dz, dx);
    
        pitch = -pitch;
        yaw = yaw - 1.57079633f;
    
        Matrix4 camera_matrix = new Matrix4();
    
        matrix.identity();
    
        matrix.rotate(pitch, -1f, 0f, 0f);
        matrix.rotate(yaw, 0f, 1f, 0f);
    
        matrix.translate(-eyex, -eyey, -eyez);
    
        return matrix;
    }
    

    这里的函数默认“使用”up,即(0, 1, 0)

    如你所见,我写的是Vector3Matrix4 而不是Vector3fMatrix4f,这是因为我不使用javax.vecmath.* 类。我已经制作了用于计算以下内容的自定义类,尽管它基本相同,并且 vecmath 可能/应该包含我使用的相同方法。虽然如果它不把它写成评论,我也可以提供它们。

    【讨论】:

    • 非常感谢,这很有魅力。我试图从演讲幻灯片中实现公式... ;-)。
    • 知道与 matrix.rotate(...) 调用等效的 javax.vecmath 是什么吗?另外,我假设上面的变量“camera_matrix”实际上应该是“matrix”。
    猜你喜欢
    • 1970-01-01
    • 2023-02-02
    • 2017-10-15
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多