我的骨骼蒙皮有問題,我的骨骼不是圍繞它們的本地原點旋轉,而是圍繞它們的父節點旋轉。左 - 我的引擎。右 - 攪拌機
我懷疑管道中有兩個位置有問題,但我不知道它到底在哪里。首先,我有一段實際計算骨骼矩陣的代碼:
void CalculateBoneTransform(DSkeletonBone sb, dmat4x4f parentTransform, std::vector<DSkeletonBone> boneOverrides)
{
if (boneDataIndex.count(sb.name) == 0) return;
Transform transform = sb.localTransform;
for (auto& bo : boneOverrides)
{
if (bo.name == sb.name)
{
transform = bo.localTransform;
}
}
dmat4x4f globalTransform = dmat4x4f::Mul(parentTransform, transform.GetMatrix());
dmat4x4f finalTransform = dmat4x4f::Mul(globalTransform, sb.inverseTransform);
finalTransforms[boneDataIndex[sb.name]] = finalTransform;
for (auto& pbC : sb.children)
{
CalculateBoneTransform(pbC, globalTransform, boneOverrides);
}
}
boneOverrides 來自任何想要覆寫骨骼的東西(例如影片)。finalTransforms 是推送到著色器的陣列。
在我的網格/影片決議器中,我有這個計算逆系結姿勢矩陣的代碼(使用 OpenFBX,但這無關緊要):
glm::mat4 local = glm::inverse(GetMatFromVecs(
boneData[skin->getCluster(i)->name].pos,
boneData[skin->getCluster(i)->name].rot,
boneData[skin->getCluster(i)->name].scl));
for (Object* parent = skin->getCluster(i)->getLink()->getParent(); parent != NULL; parent = parent->getParent())
{
glm::mat4 parentInverseTransform = glm::inverse(GetMatFromVecs(
parent->getLocalTranslation(),
parent->getLocalRotation(),
parent->getLocalScaling()));
local = parentInverseTransform * local;
}
boneData[skin->getCluster(i)->name].offset = local;
getLocalXX 函式獲取本地空間中的專案。
以及上面參考的 GetMatFromVecs 函式:
glm::mat4 GetMatFromVecs(Vec3 pos, Vec3 rot)
{
glm::mat4 m(1);
m = glm::scale(m, glm::vec3(1,1,1));
m = glm::rotate(m, (float)rot.x * 0.0174532925f, glm::vec3(1, 0, 0));
m = glm::rotate(m, (float)rot.y * 0.0174532925f, glm::vec3(0, 1, 0));
m = glm::rotate(m, (float)rot.z * 0.0174532925f, glm::vec3(0, 0, 1));
m = glm::translate(m, glm::vec3(pos.x, pos.y, pos.z));
return m;
}
請注意,我先旋轉,然后平移(順便說一下,第一個片段中參考的 GetMatrix() 函式也是這種情況)。
所以我的問題是,為什么會發生這種情況?另外,網格蒙皮中這種型別的東西的一些原因是什么?我的翻譯是本地的,但輪播不是。
uj5u.com熱心網友回復:
我的問題是矩陣數學不好。我把我的 matrix::mul 函式換成了 glm 并得到了預期的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/352443.html
上一篇:影片具有相同類的多個標題
