2016-12-17 3 views
0

"私は骨格アニメーションを学ぶので、多くの誤解があります" Blenderからエクスポートされた非常に単純なJSON形式のファイルを1つのキューブと1つのボーンを4フレームだけ回転させたので、VBOこれは図4に示すように、正しくレンダリングされた位置vec4、通常vec4、重量VEC2と骨インデックスVEC2属性骨は、POSを有し、rotq及びスケーリング私は骨OpenGL ES2骨格アニメーション

public static float[] createMat4(float[] t, float[] r, float[] s) { 
    float[] mat4 = new float[16]; 
    float[] T = new float[16]; 
    float[] R = new float[16]; 
    float[] S = new float[16]; 
    setIdentityM(T, 0); 
    setIdentityM(R, 0); 
    setIdentityM(S, 0); 
    translateM(T, 0, t[0], t[1], t[2]); 
    rotateM(R, 0, r[3], r[0], r[1], r[2]); 
    scaleM(S, 0, s[0], s[1], s[2]); 
    float[] temp = new float[16]; 
    multiplyMM(temp, 0, T, 0, R, 0); 
    multiplyMM(mat4, 0, temp, 0, S, 0); 
    return mat4; 
} 
の変換行列を作成するには、次の関数を使用してい

だから私は、各フレームの逆数 "私が理解しているように"バインドを掛け合わせて骨最終行列を計算します。この行列を、前の方法でも生成するキーフレーム行列で乗算します結果は予想外でレンダリングするいくつかの顔が消え、ランダム頂点が移動するときに、POS、rotqとSCLから、最終的に私は、[]均一MAT4によってGPUにこれらの行列をアップロードし、これは頂点シェーダ

uniform mat4 modelview; 
uniform mat4 projection; 
uniform mat4 bones[BONES]; 
uniform int animated; 

attribute vec4 vertexPosition; 
attribute vec4 vertexNormal; 
attribute vec2 textureCoords; 
attribute vec2 skinweight; 
attribute vec2 skinindex; 

varying vec2 vTextureCoords; 
varying vec4 viewDir; 
varying vec4 modelviewNormal; 
varying mat4 mv; 

void main() { 
    mv=modelview; 
    vec4 newVertex; 
    vec4 newNormal; 
    if(animated==1){ 
     int index; 
     index=int(skinindex.x); 
     newVertex += (bones[index] * vertexPosition * skinweight.x) ; 
     newNormal += (bones[index] * vertexPosition * skinweight.x) ; 

     index=int(skinindex.y); 
     newVertex += (bones[index] * vertexPosition * skinweight.y); 
     newNormal += (bones[index] * vertexNormal* skinweight.y); 
    } 
    else{ 
     newVertex=vertexPosition; 
     newNormal=vertexNormal; 
    } 
    vec4 modelviewVertex=(modelview * newNormal); 
    modelviewNormal = normalize(modelviewVertex); 
    viewDir = normalize(-modelview*newVertex); 
    vTextureCoords = textureCoords; 
    gl_Position = (projection * modelview)* vec4(newVertex.xyz, 1.0); 
} 

です。 Rendering animation enter image description here

答えて

1

問題はクォータニオン回転にあった、私は最終的に私は、骨格アニメーションの仕事を得る

private static float[] quaternionToMatrix(float[] q) { 
    float[] m = new float[16]; 
    final float xx = q[0] * q[0]; 
    final float xy = q[0] * q[1]; 
    final float xz = q[0] * q[2]; 
    final float xw = q[0] * q[3]; 
    final float yy = q[1] * q[1]; 
    final float yz = q[1] * q[2]; 
    final float yw = q[1] * q[3]; 
    final float zz = q[2] * q[2]; 
    final float zw = q[2] * q[3]; 
    m[0] = 1 - 2 * (yy + zz); 
    m[1] = 2 * (xy - zw); 
    m[2] = 2 * (xz + yw); 
    m[3] = 0; 
    m[4] = 2 * (xy + zw); 
    m[5] = 1 - 2 * (xx + zz); 
    m[6] = 2 * (yz - xw); 
    m[7] = 0; 
    m[8] = 2 * (xz - yw); 
    m[9] = 2 * (yz + xw); 
    m[10] = 1 - 2 * (xx + yy); 
    m[11] = 0; 
    m[12] = 0; 
    m[13] = 0; 
    m[14] = 0; 
    m[15] = 1; 
    return m; 
} 

回転行列に四元数を変換するには、この機能を使用していました。

関連する問題