C++ 计算bindPose矩阵(骨骼动画)
我成功地解析了iqe(Inter-Quake Exporter)格式,现在我只能用bindpose显示了 所有顶点都有一个奇怪的变换,其中根骨骼(为方向覆盖整个网格)不是唯一对该顶点有影响的骨骼。您可以在网格的手臂/应该/颈部区域看到它。此网格有3个骨骼。一根根骨骼覆盖整个网格和两个手臂骨骼。 您可以看到网格在背景中的外观(导出为obj) 为了更好地理解,我有以下系统: 1。我将所有顶点数据加载到一个大的vbo中 (顶点、UV、法线、切线、双切线、骨骼索引(4)(关节列表索引)和骨骼权重(4)) 2.我将所有关节添加到关节列表中,并创建一个树系统(带有位置、旋转和父指针的简单链表) 3.我有一个单独的列表,名为boneMatrices,我在其中存储。。我的骨基质。当前为每一帧,稍后我将预计算每个动画帧的矩阵 我尝试用以下方法计算骨骼矩阵:C++ 计算bindPose矩阵(骨骼动画),c++,opengl,animation,matrix,skeletal-mesh,C++,Opengl,Animation,Matrix,Skeletal Mesh,我成功地解析了iqe(Inter-Quake Exporter)格式,现在我只能用bindpose显示了 所有顶点都有一个奇怪的变换,其中根骨骼(为方向覆盖整个网格)不是唯一对该顶点有影响的骨骼。您可以在网格的手臂/应该/颈部区域看到它。此网格有3个骨骼。一根根骨骼覆盖整个网格和两个手臂骨骼。 您可以看到网格在背景中的外观(导出为obj) 为了更好地理解,我有以下系统: 1。我将所有顶点数据加载到一个大的vbo中 (顶点、UV、法线、切线、双切线、骨骼索引(4)(关节列表索引)和骨骼权重(4)
for (int i = 0; i < this->jointList.size(); i++)
{
pixel::CJoint *joint = this->jointList.at(i);
std::cout << "Joint ------- " << joint->name << " -------- values: \n";
std::cout << "Translation: " << joint->position.x << " " << joint->position.y << " " << joint->position.z << "\n";
std::cout << "Quaternion: " << joint->rotation.x << " " << joint->rotation.y << " " << joint->rotation.z << " " << joint->rotation.w << "\n";
pixel::matrix4 rotation = pixel::CMatrix::fromQuaternion(joint->rotation);
pixel::matrix4 offset = pixel::CMatrix::translateMatrix(joint->position);
pixel::matrix4 baseMatrix = rotation * offset; // translation * rotation
joint->bindPose = baseMatrix;
joint->invBindPose = pixel::CMatrix::inverseMatrix(baseMatrix);
if (joint->parent != NULL)
{
std::cout << "Joint: " << joint->name << " is child of " << joint->parent->name << " \n";
joint->bindPose = joint->bindPose * joint->parent->invBindPose;
joint->invBindPose = pixel::CMatrix::inverseMatrix(joint->bindPose);
}
std::cout << "\n";
}
根骨骼绑定计算必须正确(至少我认为),因为头部位置正确,眼睛也正确(目前没有骨骼影响)查看屏幕截图:在对网格应用动画之前,是否折叠网格(将所有向量乘以基架骨骼的倒数)?很抱歉回复太晚。不,我不这样做。需要这个吗?我想是的,试试看。另外,你积累父矩阵的方式看起来可疑,但我不是C++专家,可以肯定地说。
this->material.setParameter("boneMatrix", this->boneMatrices.at(0), this->boneMatrices.size());