Articles of 皮肤

SharpDX – Windows Phone 8.1仿真器和实际设备中的字符蒙皮不同

我有一个使用SharpDX编写的引擎,可以加载存储在FBX文件中的字符网格和animation,然后呈现场景并为角色制作animation。 它是作为通用Windowsapp store应用编写的,因此它可以在Windows 8.1桌面,平板电脑和Windows Phone 8.1设备上运行。 该应用程序的Windows 8.1部分工作正常。 重写Windows Phone 8.1部分的代码有点棘手,因为Windows Phone 8.1只支持DirectX特性级别9_3,所以我不得不改变一些不受支持的DXGI格式,使用4_0_level_9_3着色器configuration文件编译5_0的原型并减less一些属性,以便适合4_0_level_9_3的256个寄存器限制。 现在,我有这个问题。 当我尝试在Windows Phone 8.1 Emulator中运行引擎时,运行良好。 字符显示和animation罚款。 有一个小手,挥动双手。 看到这个屏幕: 但是,当我尝试在真正的Windows Phone 8.1设备上运行完全相同的代码时,它并没有这样做。 角色显示,但它并不是站立和挥手,而是在TPOSE和旋转式运动在空间浮动。 这是非常混乱的,因为它是完全相同的代码,只有我尝试在模拟器和真实设备上运行它。 模拟器和真实设备有什么不同,它不是呈现相同的东西 – 它应该的东西? 我已经坚持了一个多星期,我现在有点绝望..所以,谢谢你的任何建议,意见和技巧..什么。

将FBX文件加载到DirectX 9应用程序中

我正在尝试将FBX文件转换为可以与DirectX一起使用的格式。 我已经在整个互联网上的论坛上阅读了大量的文章,并仔细地遵循了说明,但还没有成功从FBX文件加载皮肤的网格。 据我所知,我需要将DirectX皮肤网格框架的“骨偏移量”字段设置为我可以使用FBX SDK获取的骨骼的反向绑定姿势,如下所示: // iterate deformers( TODO: ACCOUNT FOR MULTIPLE DEFORMERS ) for(int i = 0; i < ncDeformers && i < 1; ++i) { // skin FbxSkin *pSkin = (FbxSkin*)pMesh->GetDeformer(i, FbxDeformer::eSkin); if(pSkin == NULL) continue; // bone count int ncBones = pSkin->GetClusterCount(); // print printf("\n\t::Skin Found::"); printf("\n\t\tBone Count: %i", ncBones); // iterate bones […]

如何翻转2D皮肤的四足人物?

只是想知道是翻转2D皮肤的人物与一个比例轴向左右运动(翻转方向和animation)的好方法? 正常的方向会改变(更新)例如,我有一个2D皮肤的狗,我想狗向左移动时,我向左按相同的animation,正确的方向。 还是有什么更好的办法? 谢谢。

ASSIMP,COLLADA和glm的骨骼animation

我一直在试图学习如何使用ASSIMP和glm从COLLADA文件中实现骨骼animation(蒙皮)。 但经过一个星期的阅读不同的教程和post,我发现在这里和那里我仍然无法得到最简单的animation正确工作。 我的结果只是骨头,看起来像他们不正确的翻译和围绕错误的轴旋转。 这个网格有三个骨头,从原点开始,直接通过一个管子,然后在animation播放时从一边到另一边摆动。 左:在关键帧2的结果。右:在关键帧2的结果。 所以现在我有两个关于animationmatrix的问题,希望有人可以帮助我理解我做错了什么。 首先,当我读取骨骼数据(或关节,但我把它称为骨头在我的代码中,所以我会在这里也称为骨骼),我从mOffsetMatrix获取骨骼matrix。 我不能100%确定这个matrix是否包含相对于其父骨骼的骨骼变换,或者是否包含最终位置。 我试图用它作为相对和绝对的变换,但是我的最后结果仍然是错误的,所以我不知道哪个是正确的。 如果mOffsetMatrix包含骨骼的相对变换,那么我必须通过将它与其父骨骼的变换相乘来计算绝对变换? 我试着用下面的代码做这个。 // struct for storing bones (joints) struct Bone { std::string name; glm::mat4 relativeTransform; glm::mat4 absoluteTransform; int parent; // id to parent bone }; std::vector<Bone> skeleton; // contains all the bones for (int i = 0; i < skeleton.size(); ++i) { // if bone have […]

为什么OBJ没有扩展到支持蒙皮?

除了我所知道的每种格式之外,唯一可以完美应用于所有应用程序的是OBJ。 我认为这是一个很好的格式,我会使用它的一切 – 除了它不支持蒙皮。 我想知道,为什么规范从来没有延伸到包括支持皮肤。 它不需要检查格式 – 只需在结尾添加一个“顶点权重”和“顶点骨骼ID”参数,以及一个骨骼和变换列表(或者可以将所有的蒙皮数据存储在一个单独的文件中,方法与材料参数是) 它与所有其他格式的挫败战斗,而OBJ只是坐在那里缺乏这一点。 能有更多的行业经验的理论,为什么这个扩展从来没有被添加?

COLLADA:反向绑定姿势错误的空间?

(来自StackOverflow的Crosspost) 我正在写我自己的COLLADAimport商。 我已经相当的远,加载网格和材料等。 但是我在animation方面遇到了困难,特别是:联合轮换。 我用来剥皮网格的公式非常简单: weighted; for (i = 0; i < joint_influences; i++) { weighted += joint[joint_index[i]]->parent->local_matrix * joint[joint_index[i]]->local_matrix * skin->inverse_bind_pose[joint_index[i]] * position * skin->weight[j]; } position = weighted; 就文学而言,这是正确的公式。 现在,COLLADA为关节指定了两种types的旋转:局部和全局。 您必须将旋转连接在一起以获得关节的局部变换。 COLLADA文件没有区分的是联合的地方轮换和联合的全球轮换。 但在我见过的大多数模型中,旋转可以有rotate (全局)或jointOrient (本地)的id。 当我忽视全球轮换,只使用本地的轮回,我得到了模型的绑定姿势。 但是,当我把这个全球轮换join联合的地方转型时,奇怪的事情就开始发生了。 这是没有使用全球轮换: 这是与全球轮换: 在这两个截图中,我使用线条绘制骨骼,但首先它是不可见的,因为关节在网格内。 在第二个屏幕截图中,顶点遍布整个地方! 为了比较,这是第二个截图应该是这样的: 很难看,但你可以看到,在第二个截图的关节是在正确的位置。 但现在奇怪的事情。 如果我不考虑COLLADA指定的反向绑定姿态,而是将关节的本地变换的倒数乘以关节的局部变换,我得到以下结果: 在这个截图中,我画了一条从每个顶点到有影响的关节的线。 我得到绑定姿势的事实并不奇怪,因为公式现在变成了: world_matrix * inverse_world_matrix * position * […]

OpenGL GLSL蒙皮问题

这一次我决定提出一个与我的皮肤问题有关的问题。 两个较早的与我的问题没有真正的联系,我已经删除了它们。 好吧,首先,我使用OpenGL 3,3ds max和Delphi来创建一个骨架animation演示。 我正在使用IGame接口将网格从3ds max导出到XML – 我使用SDK中包含的示例。 现在,我将尽我所能地描述我所做的事情。 将骨骼权重传递给着色器 我将跳过parsing几何,因为它工作正常。 现在,如果网格蒙皮(使用Physique修改器),则生成的XML包含有关每个顶点的骨骼影响的信息,如下所示: <Skin VertexID="2" Type="Rigid"> <Bone BoneID="22" Weight="1,000000"></Bone> </Skin> … <Skin VertexID="14" Type="Blended"> <Bone BoneID="22" Weight="0,986472"></Bone> <Bone BoneID="14" Weight="0,013015"></Bone> <Bone BoneID="23" Weight="0,000513"></Bone> </Skin> … <Skin VertexID="31" Type="Blended"> <Bone BoneID="22" Weight="0,948354"></Bone> <Bone BoneID="23" Weight="0,030462"></Bone> <Bone BoneID="23" Weight="0,011265"></Bone> <Bone BoneID="14" Weight="0,009909"></Bone> <Bone BoneID="23" Weight="0,000011"></Bone> </Skin> 我的着色器假设应该总是有4根骨头影响一个顶点,正如你所看到的,有时候它们会有硫酸/不足的数量,所以我决定: […]

骨架animation在OpenGL中

我使用Assimp在我的OpenGL应用程序中做骨架animation。 我使用Blender将这个单一模型导出到COLLADA文件中: 该模型只有一个骨骼,称为arm骨骼 ,控制arm网格。 所有其他网格都是静态的。 我做了几个结构和类,帮助我演奏animation。 所有节点都被添加到Node对象的std :: vector中。 每个节点包含aiNode数据和一个toRootmatrix。 骨骼层次结构被封装在一个Skeleton类中,并且animationmatrix(T * R)针对一个名为Animation的类中的每个骨骼进行更新。 我的模型:: Draw()函数是这样的: void Model::draw() { //iterate through all animation sets. if the animation is running, update the bones it affects. for(size_t i = 0; i < _animations.size(); i++) if(_animations[i].running()) _animations[i].updateAnimationMatrices(&_skeleton); //calculate Bone::finalMatrix for each bone _skeleton.calculateFinalMatrices(_skeleton.rootBone()); //iterate through the nodes and draw […]

我如何发送多个matrix到顶点着色器?

我正在练习使用骨骼/蒙皮的animation。 我正在尝试着色每个顶点一个matrix。 我可以想到这两种方法。 方法1 我有这样的每个骨基质统一的句柄 u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]"); u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]"); 在onDraw我将它们中的每一个发送给着色器: GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0); 如果我有大量的matrix,这显然不是一个好方法。 我的第二个想法,我还没有尝试,因为有很多代码重构 方法2 就是用glUniformMatrix4fv把它们一次全部发送(假设我有20个matrix) GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0); matrices是float[16 * 20] 。 但是,然后修改每个骨头的matrix变得有点乏味。 例如,如果我想得到第三个matrix,我需要沿着一些线 float[] _3rd = Arrays.copy(matrices, 3*16, 4*16); 并挽回价值可能变得更加恼人。 我正在使用方法1,但它看起来不太聪明… 将多个matrix发送到OpenGL ES 2着色器的最佳方法是什么? LE:我使用的是Android,所以我正在寻找一个Java解决scheme。

我如何在Android中可靠地实现GPU皮肤?

我正在试图在Android上使用角色皮肤。 这个想法是相当香草的:我有我的皮肤matrix,并与每个顶点,我发送四个matrix索引和四个相应的权重。 我将它们在顶点着色器中求和,并将它们应用到每个顶点。 这是我在我的游戏的iOS版本顶点着色器(不介意法线): attribute vec4 in_pos; attribute vec4 in_normal; attribute vec2 in_texture_coords; attribute vec4 in_bone_index; attribute vec4 in_bone_weight; varying vec2 fs_texture_coords; uniform mat4 world_view_projection; uniform mat4 bones[@bind_matrix_count]; void main() { // Skinning vec4 transformed_pos = ((in_pos * bones[int(in_bone_index.x)]) * in_bone_weight.x) + ((in_pos * bones[int(in_bone_index.y)]) * in_bone_weight.y) + ((in_pos * bones[int(in_bone_index.z)]) * in_bone_weight.z) + ((in_pos […]