我成功地解析了 iqe(Inter Quake Exporter)格式,现在我坚持在 bindpose 中显示它。
所有顶点都有一个奇怪的变换,其中根骨骼(覆盖整个网格以进行定向)不是唯一对该顶点有影响的骨骼。您可以在网格的手臂/应该/颈部区域看到它。该网格有 3 个骨骼。一个根骨覆盖整个网格和两个臂骨。您可以看到网格在背景中的样子(导出为 obj)
为了更好地理解,我有以下系统:
1.我将所有顶点数据加载到一个大vbo(顶点,uvs,法线,切线,双切线,boneIndicies(4)(关节列表的索引)和boneWeights(4))
2.我将所有关节添加到关节列表中并创建一个树系统(具有位置、旋转和父指针的简单链表)
3.我有一个名为boneMatrices 的单独列表,我在其中存储......以及我的骨骼矩阵。目前每一帧,稍后我将预先计算每个动画帧的矩阵。
我尝试通过以下方式计算骨骼矩阵:
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";
}
我将joint->invBindPose的转置(否则网格倒置)存储在boneMatrices中并将其发送到着色器:
boneMatrix 是 matrix4 的 std::vector
this->material.setParameter("boneMatrix", this->boneMatrices.at(0), this->boneMatrices.size());
根骨绑定计算必须是正确的(至少我认为),因为头部在正确的位置,眼睛也在正确的位置(目前没有骨骼影响)