"골격 애니메이션을 배우려고하므로 많은 오해가 있습니다." 블렌더에서 내보내는 하나의 큐브와 하나의 본이 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);
}