繁体   English   中英

计算3d相机矩阵

[英]Calculate a 3d camera matrix

这是家庭作业,但我一直在为我们的尝试,我只是不知道我做错了什么。 我们的想法是从三个给定的矢量创建一个摄像机,中心(摄像机位置)向上(世界向上,这一个是(0,1,0))和lookAt(这是世界坐标中要看的点) 。

当我在x和z轴上移动相机时,Everythinig正常工作,但是当我在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可能/应该包含我使用的相同方法。 虽然如果它不把它写成评论,我也可以提供它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM