Java 模型矩阵结果的Opengl转换

Java 模型矩阵结果的Opengl转换,java,opengl,glsl,shader,lwjgl,Java,Opengl,Glsl,Shader,Lwjgl,我试图建立一个模型矩阵,在这里我应用了一些常见的变换,比如缩放、旋转和平移。我在这里学习了一个教程:。我知道矩阵是不可交换的,所以我想我应该注意得到正确的变换顺序 但是当我尝试转换我的模型时,它会拉伸到相应的轴上,而不是转换。 下面是它的外观: 我将不胜感激 顶点着色器 330版 在vec3 in_pos; 在vec3中; 在vec3的in_范数; //在所有顶点上,每帧都有统一的颜色、颜色和颜色 统一mat4 mvp;//mat4=4x4矩阵 //出流到片段着色器 输出vec4 frag_po

我试图建立一个模型矩阵,在这里我应用了一些常见的变换,比如缩放、旋转和平移。我在这里学习了一个教程:。我知道矩阵是不可交换的,所以我想我应该注意得到正确的变换顺序

但是当我尝试转换我的模型时,它会拉伸到相应的轴上,而不是转换。 下面是它的外观:

我将不胜感激

顶点着色器

330版 在vec3 in_pos; 在vec3中; 在vec3的in_范数; //在所有顶点上,每帧都有统一的颜色、颜色和颜色 统一mat4 mvp;//mat4=4x4矩阵 //出流到片段着色器 输出vec4 frag_pos; 4个框架; 输出vec4 frag_范数; //主修专栏 真空总管{ gl_位置=mvp*vec4in_位置,1.0; frag_pos=vec4in_pos,1.0; //透明框架=向量4英寸,0.5; frag_col=vec4in_col,1; frag_norm=vec4in_norm,1.0; } Java转换

float aspectRatio = (float) HEIGHT /(float)WIDTH;

float[][] rotX = new float[][] {
        {1.0f,0.0f,0.0f,0.0f},
        {0.0f,(float)Math.cos(thetaX),(float)-Math.sin(thetaX),0.0f},
        {0.0f,(float)Math.sin(thetaX),(float)Math.cos(thetaX),0.0f},
        {0.0f,0.0f,0.0f,1.0f}
};

float[][] rotY = new float[][] {
        {(float)Math.cos(thetaY),0.0f,(float)Math.sin(thetaY),0.0f},
        {0.0f,1.0f,0.0f,0.0f},
        {(float)-Math.sin(thetaY),0.0f,(float)Math.cos(thetaY),0.0f},
        {0.0f,0.0f,0.0f,1.0f}
};

float[][] rotZ = new float[][] {
        {(float)Math.cos(thetaZ),(float)-Math.sin(thetaZ),0.0f,0.0f},
        {(float)Math.sin(thetaZ),(float)Math.cos(thetaZ),0.0f,0.0f},
        {0.0f,0.0f,1.0f,0.0f},
        {0.0f,0.0f,0.0f,1.0f}
};

float[][] translation = new float[][] {
        {1.0f,0.0f,0.0f,transX},
        {0.0f,1.0f,0.0f,transY},
        {0.0f,0.0f,1.0f,transZ},
        {0.0f,0.0f,0.0f,1.0f}
};

float[][] scaleMatrix = new float[][] {
        {scale,0.0f,0.0f,0.0f},
        {0.0f,scale,0.0f,0.0f},
        {0.0f,0.0f,scale,0.0f},
        {0.0f,0.0f,0.0f,1.0f}
};

float[][] aspect = new float[][] {
        {aspectRatio,0.0f,0.0f,0.0f},
        {0.0f,1.0f,0.0f,0.0f},
        {0.0f,0.0f,1.0f,0.0f},
        {0.0f,0.0f,0.0f,1.0f}
};

float[][] rotationMatrix = Matrix.matMult(rotZ,Matrix.matMult(rotY,rotX));
float[][] matrix = Matrix.matMult(translation,Matrix.matMult(rotationMatrix,scaleMatrix));

float[] model = Matrix.matrixToFloatVector(Matrix.matMult(matrix,aspect));

FloatBuffer fb = BufferUtils.createFloatBuffer(16);
fb.put(model);

fb.flip();  // Reset pointer
// "upload" to graphics card
glUniformMatrix4fv(uLocMVP, false, fb);
见第110页:

要通过指定向量或标量来初始化矩阵,组件将按列主顺序分配给矩阵元素

mat4float,float,float,float,//第一列 float,float,float,float,//第二列 float,float,float,float,//第三列 浮动,浮动,浮动,浮动;//第四栏 这意味着您必须在设置mat4类型的统一变量之前转置矩阵

这可以通过设置第三个参数true自动完成:

glUniformMatrix4fvuLocMVP,真,fb
相反,您可以转置初始化并交换矩阵乘法matrix.matMult。

您必须转置矩阵。glUniformMatrix4fvuLocMVP,是的,fbYes确实有效,谢谢,如果你觉得可以,你可以向我解释为什么它在转置后有效吗?@rabbi76是因为opengl与列专业一起工作吗?