2016-12-17 5 views
0

"골격 애니메이션을 배우려고하므로 많은 오해가 있습니다." 블렌더에서 내보내는 하나의 큐브와 하나의 본이 4 개의 프레임 만 회전 된 매우 간단한 JSON 형식의 파일이 있으므로 VBO 이는 4 갖는다는 위치 vec4 정상 vec4 중량 VEC2 올바르게 렌더링 뼈 인덱스 VEC2 속성, 뼈 POS, rotq을 가지고 있으므로 척도 I 뼈의 변환 행렬을 생성하기 위해 다음 함수를 사용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; 
} 

로 사원 수를 변환하려면이 기능을 사용, 사원 수 회전했다.