0

OpenGL内のx軸を中心とした回転に少し問題があります。私が持っているのは、シェーダー内でレンダリングされている基本的な立方体であり、照明計算用の法線があります。立方体の変換は、投影行列にモデル行列を掛けたものです。この連結はシェーダー内で実行され、回転と平行移動の計算は私が作成したMatrixクラス内で実行されます。y軸を中心に回転を行うと、次の図に示すように、すべてが期待どおりに回転します。

レンダリング結果 レンダリング結果

ここに示すように、x軸を中心に回転が発生すると問題が発生します。

レンダリング結果 レンダリング結果

どうやら、x軸の回転はシーンを歪め、すべてが不均衡に表示される原因になります。行列を計算し、これがレンダリングされるたびにシェーダーに渡されるコードは次のとおりです。

glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

viewMatrix.setIdentity();
viewMatrix.translate(new Vector4(translation));
viewMatrix.rotate(1, 0, 0, -rotateX);
viewMatrix.rotate(0, 1, 0, rotateY);
Matrix4 mvMatrix = new Matrix4(viewMatrix);

Matrix4 pMatrix = new Matrix4(projectionMatrix);

lightShader.useShader();        
lightShader.setUniformVector("vColor", new Vector4(.4f,0,0,1f));
lightShader.setUniformMatrix("mvMatrix", mvMatrix);
lightShader.setUniformMatrix("pMatrix", pMatrix);
triangleBatch.draw(lightShader.getAttributes());

Display.update();

シェーダーコードは次のとおりです。

uniform mat4 mvMatrix;
uniform mat4 pMatrix;
uniform vec4 vColor;
varying vec4 outFragColor;
attribute vec4 inVertex;
attribute vec4 inNormal;
void main(void) { 
    vec3 newNorm = vec3(inNormal);
    mat3 mNormalMatrix;
    mNormalMatrix[0] = mvMatrix[0].xyz;
    mNormalMatrix[1] = mvMatrix[1].xyz;
    mNormalMatrix[2] = mvMatrix[2].xyz;
    vec3 vNorm = normalize(mNormalMatrix * newNorm);
    vec3 vLightDir = vec3(0.0, 0.0, 1.0); 
    float fDot = max(0.0, dot(vNorm, vLightDir)); 
    outFragColor.rgb = vColor.rgb * fDot;
    outFragColor.a = vColor.a;
    mat4 mvpMatrix;
    mvpMatrix = pMatrix * mvMatrix;
    gl_Position = mvpMatrix * inVertex; 
}

最後に、回転の行列数学コードは次のとおりです。

public Matrix4 rotate(Vector4 a, float radians){
    Matrix4 temp = new Matrix4().setToRotate(a, radians);
    this.multiply(temp);
    return this;
}

public Matrix4 setToRotate(Vector4 a, float radians){
    a = new Vector4(a).normalise();
    float c = GameMath.cos(radians);
    float s = GameMath.sin(radians);
    float t = 1-c;
    float x = a.x;
    float y = a.y;
    float z = a.z;
    float x2 = a.x*a.x;
    float y2 = a.y*a.y;
    float z2 = a.z*a.z;
    this.setIdentity();
    this.matrix[0] = c + t*x2;
    this.matrix[1] = t*x*y + s*z;
    this.matrix[2] = t*x*z - s*y;
    this.matrix[4] = t*x*y - s*z;
    this.matrix[5] = c + t*y2;
    this.matrix[6] = t*y*z + s*x;
    this.matrix[8] = t*x*z + s*y;
    this.matrix[9] = t*y*z + s*x;
    this.matrix[10] = c + t*z2;
    return this;
}

行列はメジャー列に格納されます。

4

1 に答える 1

0

私は問題が何であるかを知りました。どうやらsetToRotate()の操作の1つを加算から減算に変更する必要があります。現在、期待どおりに機能しています。

于 2012-06-30T02:18:46.660 に答える