- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在使用 ASSIMP 库将骨骼动画实现到我的 3D OpenGL 游戏引擎中,不幸的是它并没有那么好。我目前面临的问题是,串联的骨骼变换(骨骼之间的父子关系)只有在只有一个父级被变换时才能正确运行。
发生的事情是 thigh's bone transformation is carried out on global axes instead of the pelvis' local axes.
这是我的骨架类:
class Skeleton
{
public:
Skeleton();
unsigned int numBones;
std::vector<std::string> names;
std::vector<glm::mat4> offsets;
std::vector<glm::mat4> transforms;
std::vector<int> parents;
std::string GetName(int bone);
glm::mat4 GetWorldTransform(int bone);
int GetID(std::string bone_name);
};
这是我用来计算每个骨骼的世界变换的函数:
glm::mat4 Skeleton::GetWorldTransform(int bone)
{
int p = parents[bone];
glm::mat4 result = glm::mat4(1.0);
result *= glm::inverse(offsets[bone]);
result *= transforms[bone];
result *= offsets[bone];
while(p >= 0) //The root bone has a parent of -1
{
result *= glm::inverse(offsets[p]);
result *= transforms[p]; //Apply The Parent's Transform
result *= offsets[p];
p = parents[p];
}
return result;
}
在我的 Mesh 类中,我有这个函数 UpdateSkeleton():
void Mesh::UpdateSkeleton(unsigned int shaderID)
{
std::vector<glm::mat4> mats;
for(int i = 0; i < skeleton->numBones; i++)
{
glm::mat4 matrix = glm::mat4(1.0);
matrix *= skeleton->GetWorldTransform(i);
mats.push_back(matrix);
}
if(mats.size() > 0)
glUniformMatrix4fv(glGetUniformLocation(shaderID,"gBones"),mats.size(),GL_FALSE,glm::value_ptr(mats[0]));
}
谢谢!
最佳答案
所以我修复了它。
https://www.youtube.com/playlist?list=PLi9hkiiZDonvUcT_FRD8rJtuuGltL3xys
基本上问题是串联是以相反的顺序进行的,我最初是这样做的:
void Bone::UpdateParentTransform()
{
parent_transform = glm::mat4(1.0);
Node* node_id = parent_node;
while(node_id != nullptr)
{
Bone* bone = mesh->FindBone(node_id->name);
if(bone != nullptr)
{
parent_transform *= glm::inverse(bone->offset_matrix);
parent_transform *= node_id->transformation;
parent_transform *= (bone->offset_matrix);
node_id = bone->parent_node;
}
else
node_id = nullptr;
}
}
现在我做到了,所以它们以相反的顺序执行,如下所示:
void Bone::UpdateParentTransform()
{
parent_transform = glm::mat4(1.0);
Node* node_id = node;
std::vector<Bone*> bones;
std::vector<Node*> parents;
while(node_id != nullptr)
{
Bone* bone = mesh->FindBone(node_id->name);
if(bone != nullptr)
{
bones.push_back(bone);
parents.push_back(node_id);
node_id = bone->parent_node;
}
else
node_id = nullptr;
}
for(int i = parents.size()-1; i > 0; i--)
{
parent_transform *= glm::inverse(bones.at(i)->offset_matrix);
parent_transform *= parents.at(i)->transformation;
parent_transform *= (bones.at(i)->offset_matrix);
}
}
如果您对此有任何疑问或关于使用 ASSIMP 的骨骼动画的任何其他问题,请随时问我,您可以在这里或在我的 YouTube channel 上与我联系:RealityMultiplied
我现在要开始制作有关如何使用 ASSIMP 制作骨骼动画的系列教程,所以我希望能在今晚之前发布第一个视频。
我希望让这个主题对于刚开始的人来说很容易理解,因为它看起来令人望而生畏,而且总体上非常可怕。
编辑:所以我开始编写教程,但我现在正在经历生活中的许多艰难,我认为我无法完成它们。我希望他们至少能提供一点帮助,很抱歉我不能做更多。
关于c++ - Assimp 蒙皮全局变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35952202/
我在我的应用程序中实现了换肤。应用程序加载其 Brushes.xaml 资源字典,该字典使用驻留在特定于皮肤的资源字典中的颜色。因此,根据所选的皮肤,仅加载一个 Color.xaml。 皮肤特定颜色.
我希望你能帮助我。我的问题是 collada 的蒙皮方程: v += {[(v * BSM) * IBMi * JMi] * JW} n:影响顶点v的关节数 BSM:绑定(bind)形状矩阵 IBMi
好的,所以我的目的是“美化”我正在处理的 UI。我熟悉使用 GDI+ 手动绘制控件,但我今天的目标只是直接在我的 DC 上使用 BitBlitting png。 这与主框架、一些按钮和一些菜单一起工作
我刚刚开始使用 DNN 皮肤,对 skin.css 的工作原理感到困惑。我使用的是“传统”换肤方法,所以我的皮肤文件夹中有 SkinName.htm 文件,每次更改它时我都会让 DNN 解析它。现在我
我是一名优秀的程序员,十分优秀!