- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在尝试使用 ASSIMP 导入模型在我自己的 3D openGL/c++ 游戏引擎中实现骨骼动画。
我认为问题是由骨骼矩阵的计算引起的,在着色器中作为统一变量加载,因为如果我将它们分配给身份,网格将以其绑定(bind)姿势加载。
这些是我用来初始化和计算准备好的骨骼矩阵的函数:
void Joint::AddToSceneGraph(GameObject* root)
{
GameObject* parent = root->FindChild(m_name);
//m_globalInverseMatrix = inverse(root->GetTransform().GetMatrix());
parent->AddComponent(this);
while (parent->GetParent() != root)
parent = parent->GetParent();
parent->GetTransform().SetParent(NULL); (1)
}
mat4 Joint::GetMatrix()
{
mat4 ans = /*m_globalInverseMatrix*/GetTransform().GetMatrix()*m_offsetMatrix;
return ans;
}
由于我尝试以绑定(bind)姿势渲染模型,因此我不会为您提供计算动画矩阵的代码。
一些说明 - 我有一个 Transform 类,它具有 Transform* 父级,其 GetMatrix() 方法从父级矩阵计算矩阵,缩放和平移 vec3 和旋转四元数,因此考虑了父级和子级之间的关系。我假设父节点的根关节变换必须为 NULL,因此它的矩阵 - 身份,这是 (1) 的目的。虽然我不确定这个假设,但我确信具有骨架根的节点和包含网格的节点是兄弟节点。
我也不确定我应该使用 m_globalInverseMatrix
以及它的目的究竟是什么。
总的来说,我认为我遇到的主要问题是误解了 ASSIMP 如何计算 offset matrix
或所谓的 inverse bind pose matrix
以及如何反转其效果。此问题导致模型本身看起来“打包”:
最佳答案
从 Assimp 的文档来看,骨骼的偏移矩阵从网格空间转换到骨骼空间。
我设法使用类似于您的层次结构来渲染绑定(bind)位置(如果我没有误解的话,您有一个带有两个子节点的根节点,一个生成骨架层次结构,另一个生成网格)。您需要做的是将 m_globalInverseMatrix
设置为包含网格的节点的逆变换。然后,每个骨骼的变换是:
boneTransform = m_globalInverseMatrix * boneHierarchyTransforms * boneOffsetMatrix
其中 boneHierarchyTransform
来自遍历树直到每个骨骼节点,而 boneOffsetMatrix
是您提到的我在第一段中提到的那个。
关于c++ - 使用 ASSIMP 制作骨骼动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42566685/
因此,除了索引之外,当我创建一个新项目并选择 conda 解释器时,还会启动更多需要数小时的进程。下面是一个快照。这些过程是什么?完成后它们会占用空间吗? 最佳答案 PyCharm 运行 genera
我是一名优秀的程序员,十分优秀!