将骨旋转设置为在本地空间中的可容纳网眼



向所有人致意,

向所有人打招呼。:(

我正在在UE4上实现VR体验,该体验检测VR体验用户的移动,然后更新虚拟世界内的化身或用户的相应姿势。

为此,我已经根据有关此主题所说的C 实施了这种行为:

https://forums.unrealengine.com/showthread.php?25264-pose-a-skelet-mesh-in-in-intime

也就是说,我有一个UskeletalMeshComponent(其骨骼网格是在屏幕上看到的骨骼网格(,还有一个Uposeblememblebleshcomponent(被设置为uskeletalmeshcomponent的"主姿势组件"(,从每个跟踪数据中接收到每个跟踪数据的旋转数据传感器。

一只手,uposeablemebleshcomponent的网格将设置为uskeletalmeshcomponet的网格。另一方面,可容纳网格的骨头已更新,相应的旋转数据来自每个骨骼的跟踪传感器,这使得由于Uposeablemembleshcomponent的"将骨骼网格"自动更新为"主姿势组件",以自动进行更新。uskeletalmeshcomponent。

与所有不是手指裂料的身体部位一起工作时,这是在正式的,因为以这种方式将旋转设置在世界空间中的那些身体部位上:

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

然而,出于技术原因,必须在本地空间设置每个手指缘的骨旋转,但是可容纳的网格似乎仅适用于世界空间和组件空间。查看" skinnedmeshcomponent.h"''

/** 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" ),
     };
 }

我无法理解"骨头在组件参考框架中的固定位置"的短语。它似乎无法作为当地空间的"替代品"(好像骨头在阿凡达的枢轴点旋转(。是否有其他方法或解决方法可以在本地空间中设置可容纳网格的旋转?

谢谢。:(

我也遇到了这个问题。可悲的是,该功能从未在官方的虚幻发动机代码基础上实现。

,但是您可以通过扩展可容纳的网格组件来很容易地解决它。

// MyPoseableMeshComponent.h
#pragma once
#include "CoreMinimal.h"
#include "Components/PoseableMeshComponent.h"
#include "MyPoseableMeshComponent.generated.h"
UCLASS(meta = (BlueprintSpawnableComponent))
class ALSUTILS_API UMyPoseableMeshComponent : public UPoseableMeshComponent
{
    GENERATED_BODY()
public:
    UFUNCTION(BlueprintCallable, Category = "Components|PoseableMesh")
    void SetBoneLocalTransformByName(const FName& BoneName, const FTransform& InTransform);
    UFUNCTION(BlueprintCallable, Category = "Components|PoseableMesh")
    const FTransform& GetBoneLocalTransformByName(const FName& BoneName) const;
};

// MyPoseableMeshComponent.cpp
void UMyPoseableMeshComponent::SetBoneLocalTransformByName(const FName& BoneName, const FTransform& InTransform)
{
  if (!SkeletalMesh || !RequiredBones.IsValid())
  {
    return;
  }
  int32 boneIndex = GetBoneIndex(BoneName);
  if (boneIndex >= 0 && boneIndex < BoneSpaceTransforms.Num())
  {
    BoneSpaceTransforms[boneIndex] = InTransform;
    MarkRefreshTransformDirty();
  }
}
const FTransform& UMyPoseableMeshComponent::GetBoneLocalTransformByName(const FName& BoneName) const
{
  static FTransform zeroTransform;
  if (!SkeletalMesh || !RequiredBones.IsValid())
  {
    return zeroTransform;
  }
  int32 boneIndex = GetBoneIndex(BoneName);
  if (boneIndex >= 0 && boneIndex < BoneSpaceTransforms.Num())
  {
    return BoneSpaceTransforms[boneIndex];
  }
  
  return zeroTransform;
}

最新更新