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/

相关文章:

java - 在 Netbeans 中将 taglet 与 Javadoc 一起使用

c++ - OpenGL - 正确地将 VAO 定义与 VBO 和其他缓冲区创建分开

c++ - 在 OpenGL 中对四边形进行纹理化

matlab - Matlab中矩阵维数必须符合错误吗?

swift - 如何检测触摸了哪个 SKSpriteNode

matrix - 使用一行的 gnuplot 矩阵或调色板

java - mapreduce作业卡在 map 100上(使用元组值)

java - 将 JSON 反序列化为未知类型的集合

c++ - 如何创建匹配当前投影矩阵的 glClipPlanes?

java - Java 中的 int 数组到 int 数字