在局部空间中为Poseable网格设置骨骼旋转

时间:2017-04-20 08:18:06

标签: c++ rotation quaternions unreal-engine4 skeletal-mesh

向大家致意,

向大家致以问候。 :)

我正在UE4上实施VR体验,检测VR体验用户的移动,然后在虚拟世界中更新虚拟形象或用户表示的相应姿势。

为此,我使用C ++基于此主题的内容实现了此行为:

https://forums.unrealengine.com/showthread.php?25264-Pose-a-skeletal-mesh-in-runtime

也就是说,我有一个USkeletalMeshComponent(其骨架网格是在屏幕上看到的那个),以及一个UPoseableMeshComponent(被设置为USkeletalMeshComponent的“主要姿势组件”),它接收来自每个跟踪的四元数的旋转数据传感器

一方面,UPoseableMeshComponent的网格将被设置为USkeletalMeshComponet的网格。另一方面,可摆动网格的骨骼使用来自每个骨骼的跟踪传感器的相应旋转数据进行更新,由于UPoseableMeshComponent被设置为“主姿势组件”,因此自动使骨架网格相应地更新。 USkeletalMeshComponent。

当使用非手指指骨的所有身体部位时,这很有效,因为旋转是在世界空间中的那些身体部位上设置的,这样:

m_pPoseableMeshComp->SetBoneRotationByName(strBoneName, qBoneRotation.Rotator(), EBoneSpaces::WorldSpace);

但是,由于技术原因,必须在LOCAL空间中为每个手指指骨设置骨骼旋转,但可摆动网格似乎仅适用于世界空间和组件空间;检查'SkinnedMeshComponent.h'在EBoneSpaces :: Type上有一个'LocalSpace'枚举值...但它已被评论。

/** Values for specifying bone space. */

 UENUM()
 namespace EBoneSpaces
 {
     enum Type
     {
         /** Set absolute position of bone in world space. */
         WorldSpace        UMETA(DisplayName = "World Space"),
         /** Set position of bone in components reference frame. */
         ComponentSpace    UMETA(DisplayName = "Component Space"),
         /** Set position of bone relative to parent bone. */
         //LocalSpace        UMETA( DisplayName = "Parent Bone Space" ),
     };
 }

我无法理解“在组件参考框架中设置骨骼位置”这一短语。它似乎不能作为局部空间的“替代品”(好像骨骼围绕化身的枢轴点旋转)。有没有其他方法或变通方法在局部空间中为可摆动网格设置旋转?。

先谢谢你。 :)

0 个答案:

没有答案