我成功地解析了iqe(Inter Quake Exporter)格式,现在我坚持在bindpose中显示它。
所有顶点都有一个奇怪的变换,其中根骨骼(覆盖整个网格的方向)不是唯一影响该顶点的骨骼。您可以在网格的手臂/应该/颈部区域看到它。这个网格有3个骨头。一根根骨覆盖整个网状物和两个手臂骨骼。 您可以看到网格在背景中的外观(导出为obj)
为了更好地理解,我有以下系统:
1。我将所有顶点数据加载到一个大的vbo中 (vertices,uvs,normals,tangent,bitangent,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";
}
我将关于&gt; invBindPose的转置(否则网格颠倒)存储在boneMatrices中并将其发送到着色器:
boneMatrix是matrix4的std :: vector
this->material.setParameter("boneMatrix", this->boneMatrices.at(0), this->boneMatrices.size());
根骨骼绑定计算必须是正确的(至少我认为),因为头部位于正确的位置,眼睛也是(目前没有骨骼影响)