Java 计算三维摄影机矩阵

Java 计算三维摄影机矩阵,java,3d,Java,3d,这是家庭作业,但我一直在努力,我只是不明白我做错了什么。其思想是从三个给定向量创建一个摄影机,即中心(摄影机位置)、向上(世界向上,这一个是(0,1,0))和注视(世界坐标中要注视的点) 当我在x轴和z轴上移动相机时,一切正常,但是当我在y轴上移动相机时(上/下)。。它只是不一直看(0,0,0) 我有以下代码,Vector3f和Matrix4f来自javax.vecmath* private void updateCameraMatrix() { Vector3f z = new Vec

这是家庭作业,但我一直在努力,我只是不明白我做错了什么。其思想是从三个给定向量创建一个摄影机,即中心(摄影机位置)、向上(世界向上,这一个是(0,1,0))和注视(世界坐标中要注视的点)

当我在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
    }));
}

提前感谢您的帮助

我不明白你为什么要这样计算x,y,z,。虽然要计算4x4矩阵并对其应用摄影机观察,但我会这样做:

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)


如您所见,我编写了
Vector3
Matrix4
而不是
Vector3f
Matrix4f
,这是因为我没有使用
javax.vecmath.
类。我已经创建了用于计算以下内容的自定义类,尽管它基本上是相同的,并且vecmath可能/应该包含我使用的相同方法。不过如果它不是作为评论写的,我也可以提供它们。

非常感谢,这就像一个魅力。我试图实现讲座幻灯片中的公式…;-)。知道javax.vecmath等价于matrix.rotate(…)调用是什么吗?另外,我假设上面的变量“camera_matrix”实际上应该是“matrix”。