2016-12-17 99 views
0

「我嘗試學習骨骼動畫,所以我有很多誤解」 我有一個非常簡單的JSON格式文件從Blender導出,其中一個立方體和一個骨骼僅旋轉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; 
} 

最後我得到的骨骼動畫作品。