java - 3D 相机类无法正常工作

标签 java math opengl vector matrix

有人可以告诉我为什么我的相机类无法正常工作吗?我将位置 vector 设置为 (0,0,-10),将观察 vector 设置为 (0,0,0),但是当我在 (0,0,0) 上绘制某些内容时,它不在那里。我对 vector 数学和矩阵很陌生,所以我打赌问题出在 LookThrough() 上。

import org.lwjgl.opengl.GL11;
import org.lwjgl.util.vector.Matrix3f;
import org.lwjgl.util.vector.Vector3f;

public class Camera {
     //3d vector to store the camera's position in
    Vector3f position = null;
    Vector3f lookAt = null;
    //the rotation around the Y axis of the camera
    float yaw = 0;

    //the rotation around the X axis of the camera
    float pitch = 0;

    //the rotation around the Z axis of the camera
    float roll = 0;

    public Camera(float x, float y, float z)
    {
        //instantiate position Vector3f to the x y z params.
        position = new Vector3f(x, y, z);
        lookAt = new Vector3f();
    }

    public void lookThrough()
    {
        Matrix3f m = new Matrix3f();



        Vector3f out = new Vector3f();
        Vector3f.sub(position, lookAt, out);
        out.normalise();
        //set forward vector
        m.m00 = out.x;
        m.m01 = out.y;
        m.m02 = out.z;

        //set right vector
        m.m10 = 1;
        m.m11 = 0;
        m.m12 = 0;

        //set up vector
        m.m20 = 0;
        m.m21 = 1;
        m.m22 = 0;

        yaw = (float) -(Math.tan(m.m10/m.m00));
        pitch = (float) -(Math.tan((-m.m20)/(Math.sqrt(Math.pow(m.m21, 2) + Math.pow(m.m22, 2)))));
        roll = (float) -(Math.tan(m.m21/m.m22));

        //roatate the pitch around the X axis
        GL11.glRotatef(pitch, 1.0f, 0.0f, 0.0f);
        //roatate the yaw around the Y axis
        GL11.glRotatef(yaw, 0.0f, 1.0f, 0.0f);
        //roatate the yaw around the Y axis
        GL11.glRotatef(roll, 0.0f, 0.0f, 1.0f);
        //translate to the position vector's location
        GL11.glTranslatef(position.x, position.y, position.z);
    }
}

最佳答案

我想强调一下关于您的类(class)的一些事情:

1) 您正在修复“右”和“上” vector ,只留下一个旋转自由度。当相机在 3D 空间中重新定向时,这些都需要改变。就目前情况而言,俯仰计算结果始终为 0,而滚动计算结果始终为 tan(1/0)。

2)虽然我不熟悉Java,但您似乎正在使用计算(位置-lookAt)来导出您的前向 vector 。难道不应该反过来吗?前向 vector 指向远离观看者位置的方向。

3)同样 - 不熟悉 java - 但调用 pow() 进行单个乘法可能有点过分了。

1 和 2 可能是造成您困境的原因。最后我建议看看 gluLookAt - 假设 GLU 库在 Java 中可用。如果不是,请查看 gluLookAt 的源代码(有一个变体 here )。

关于java - 3D 相机类无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6091658/

相关文章:

从离散分布生成随机数的算法?

c++ - 警告 : format ‘%5f’ expects type ‘double’ , 但参数 3 的类型为 ‘int’

c++ - 使用 C++ 在游戏循环中模拟时间

c++ - 将 OpenGL 渲染保存到图像文件

Java 泛型 - 什么时候需要参数化?

java - 为什么 Hibernate 没有将 session 设置为可自动关闭?

java - 复杂的属性绑定(bind)

java - 将 ArrayLists 用于一组类的更有效方法?

algorithm - 有效地将相似的数字组合在一起

algorithm - 检查 2 的幂数