현재 모든 뼈대를 월드 공간에 저장하고 바이너리 파일에서 직접로드합니다.세계 공간 뼈대 행렬에서 바인드 포즈/스키닝 행렬을 계산합니다.
나는이 뼈대를 "modelmatrix"라는 매트릭스 bone_mat와 함께 "화살표 객체"를 배치하여 검사합니다. 예상대로 작동합니다.
Variable explanations:
1. bone_mat = world_space bone matrix (loaded from file)
2. bind_pose_mat = relative transformation from parent bone to current bone
3. skinning_mat = final joint transformation matrix
다음 단계는 바인드 행렬 계산을 초래할 것이다. 부모에 대한 상대적 본 행렬입니다.
/* bone mat * inverse(parent bone mat) */
mesh->anim_data.skeleton[i].bind_pose_mat =
urdMat4MulMat4(mesh->anim_data.skeleton[i].bone_mat, urdMat4Inverse(parent_bone->bone_mat));
는이 같은 다시 세계 공간으로 그것을 얻어서이 행렬을 확인하십시오 : bone_mat와 같은 매트릭스 결과
world_space_mat =
urdMat4MulMat4(mesh->anim_data.skeleton[i].bind_pose_mat, parent_bone->bone_mat);
나는 이런 식으로 않습니다.
/* interpolated vertex = base_vertex * bones[bone_index].bind_pose_mat */
mesh->interpolated[i].vertex = urdMat4MulVec3(skeleton[bone_index].bind_pose_mat , mesh->base[i].vertex);
그들이 어떤 부모 그래서 지금
root_bone.bind_pose_mat = bone_mat
지역 공간에서 그 메신저를 기준으로하지으로
루트 뼈가 월드 공간에 저장됩니다, 그래도 난 모든 내가 할 필요가 있었다 왜곡 된 메쉬가 생성됩니다.
편집 : 몇 가지 생각 후에는 지역 공간에 있지 메신저처럼 보이지만 상대 공간 (bind_pose는 부모의 상대 매트릭스 현재).
하지만 거기에 이론이 붙어 있습니다.