java - 在Java中手动为opengl创建 View (lookat)矩阵

标签 java opengl matrix

我正在使用JOGLBox2d编写一个简单的基于物理的游戏。

但是我正在努力创建一个View(LookAt)矩阵。我试图避免将任何数学库依赖项添加到项目中。

谁能分享一个有关如何创建View矩阵的示例?因此,我可以进行修改以使用自定义的Matrix4f类。

这是我设置正交投影矩阵的方法。

public Matrix4f ortho(float left, float right, float top, float bottom, float zfar, float znear) {
    return new Matrix4f(new float[][] {
        new float[] { 2 / (right - left), 0, 0, -((right + left) / (right - left)) },
        new float[] { 0, 2 / (top - bottom), 0, -((top + bottom) / (top - bottom)) },
        new float[] { 0, 0, -2 / (zfar - znear), -((zfar + znear) / (zfar - znear)) },
        new float[] { 0, 0, 0, 1 },
    });
}


这是我的自定义Matrix4f类..

public class Matrix4f {

    public float[] values;

    public Matrix4f() {
        this.values = new float[16];
    }

    public Matrix4f(float[] values) {
        this.values = values;
    }

    public Matrix4f(float[][] values) {
        load(values);
    }

    public void load(float[][] values) {
        this.values = new float[] {
            values[0][0], values[0][1], values[0][2], values[0][3],
            values[1][0], values[1][1], values[1][2], values[1][3],
            values[2][0], values[2][1], values[2][2], values[2][3],
            values[3][0], values[3][1], values[3][2], values[3][3]
        };
    }

    public float get(int x, int y) {
        int position = x + (y * 4);
        return this.values[position];
    }

    public float[] getValues() { 
    return this.values; 
    }
}

最佳答案

“看”矩阵

f = normalize(target - position);
s = normalize(cross(f, up));
u = normalize(cross(s, f));

mat4 mat = mat4(1.0f);

mat.data[0] = s.x;
mat.data[4] = s.y;
mat.data[8] = s.z;

mat.data[1] = u.x;
mat.data[5] = u.y;
mat.data[9] = u.z;

mat.data[2] = -f.x;
mat.data[6] = -f.y;
mat.data[10] = -f.z;

mat.data[3] = 0.0f;
mat.data[7] = 0.0f;
mat.data[11] = 0.0f;

mat.data[12] = -dot(s, position);
mat.data[13] = -dot(u, position);
mat.data[14] = dot(f, position);
mat.data[15] = 1.0f;

关于java - 在Java中手动为opengl创建 View (lookat)矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30122335/

相关文章:

c++ - 获取 OpenCV Mat 中唯一像素值的列表

java - 有没有一种方法可以使eclipselink/JPA使用Redis来保存和检索持久性单元级别(L2)缓存?

c++ - 使用立方体贴图(非反射贴图)对球体进行纹理处理

java - 是否存在表示instanceof运算符的现有谓词?

python - python中的OpenGL因glCheckError调用而减慢

c - glutTimerFunc() 不限制帧率

python - 如何找到向量化矩阵numpy的索引

java - 停止 glUseProgram()

java - 是否可以在不重新读取的情况下多次添加从 FXML 文件加载的组件?

java - 不显示接收数据报包