java - 计算 3d 相机矩阵

标签 java 3d

这是家庭作业,但我一直在努力做我们的家庭作业,但我只是不明白我做错了什么。这个想法是从三个给定的 vector 创建一个相机,中心(相机位置)向上(世界向上,这个是(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
    }));
}

感谢您提前提供的任何帮助!

最佳答案

我不明白你为什么要这样计算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)

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

关于java - 计算 3d 相机矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411802/

相关文章:

c# - WPF ModelVisual3D 的可见 2D 内容边界

c++ - 在真实 3D 环境(例如建筑物)中寻路

java - 在复合 Material 中调整复合 Material 的大小

c++ - 从 2D 纹理上的位置 (x,y) 计算 .obj 文件中的 vt (u,v) 坐标

java - 根据 2 个属性对 ArrayList 进行排序

java - 上传文件的最佳位置

c++ - gluPickMatrix - 出了点问题,一个对象总是在现场

opengl - 如何在游戏循环中计算直到最后一刻

java - 如何使用 fabric8 kubernetes Java 和 Scala 客户端 API 在容器上设置资源需求

java - 通过 BitcoinJ 使用 zCash