みなさん、こんにちは。
みなさん、こんにちは。: )
VR エクスペリエンス ユーザーの動きを検出し、対応するアバターのポーズまたは仮想世界内のユーザーの表現を更新する VR エクスペリエンスを UE4 に実装しています。
そうするために、このトピックで言われていることに基づいて、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" ),
};
}
「コンポーネント参照フレームでボーンの位置を設定する」というフレーズが理解できません。ローカル空間の「代替」としては機能していないようです (骨がアバターのピボット ポイントを中心に回転しているかのように)。ポーズ可能なメッシュのローカル空間で回転を設定する他の方法、または回避策はありますか?
よろしくお願いします。: )