SetTransform导致Unity LeapMotion物体旋转过快

3

这是在我最近在这里提出的一个问题的基础上构建的:

Unity3D Leap Motion - 将手放在静态姿势中(SetTransform导致手旋转疯狂)

然而,唯一给出的回答中建议的代码并不起作用。我一直在使用'SetTransform'方法,虽然它确实允许我将手移动到所需位置,但旋转却很疯狂。手不断旋转,尽管我花了四天的时间,也找不到解决办法。

简而言之,我只是想将手设置为固定的姿势(例如握拳),但随着实时手部数据的移动和旋转。我创建了一个方法(在先前的问题中详细说明),该方法会手动重新计算关节的位置,以将手放置在姿势中,因为SetTransform导致了这种疯狂的旋转。然而,由于必须转换手来旋转它,我仍然遇到了疯狂的旋转,因此我已经切换回SetTransform方法以便于操作。

posedHand = PoseManager.LoadHandPose(mhd.LeftHand, int.Parse("2"), transform);
Hand h = new Hand();
if(posedHand != null)
{
    h.CopyFrom(posedHand);                               
    h.SetTransform(LiveData.LeftHand.PalmPosition.ToVector3(), LiveData.LeftHand.Rotation.ToQuaternion());
}

我想要的是一个方法,我可以传入两个手部对象(一个是当前“活动”的手部,另一个是期望的姿势),然后得到一个手部对象并进行渲染。

更新

根据要求,这里提供了我目前所获得的图像和我想要实现的图像。

目前状况:

enter image description here

目标:

enter image description here

目标图像将显示固定的姿势,例如在此示例中为当前位置和旋转的握拳。这意味着我的手可以“张开”,但在屏幕上我会看到一个握拳移动。正如您从“当前”所看到的那样,SetTransform正在给我正确的姿态和位置,但旋转出现了问题。

能否提供一些视觉辅助呢?您可以包含想要实现的效果和当前情况的图片吗? - Hristo
嗨,我已按要求添加了图片。 - user7856951
1
有什么我可以添加的帮助你帮助我吗? - user7856951
我已经有一段时间没有使用Leap了,这里有一个想法:如果Hand() hMonoBehaviour派生为一个类,你可以直接操纵它的变换来跟随你的PalmPosition和Rotation。如果不是,你可以寻找另一种设置其位置和旋转的方法。否则,你的问题可能被称为万向节锁定。 - Hristo
知道代码放在哪里是非常重要的。是在Update中?还是在FixedUpdate中?或者是在LateUpdate中?还是在协程中? - Steak Overflow
这个问题已经在其他地方得到了回答。https://stackoverflow.com/questions/48439676/unity3d-leap-motion-put-hand-in-static-pose-pose-done-just-cant-rotate/48468250#48468250 本质上,我必须创建一个函数,该函数将姿势手作为参数传入,然后使用Hands.GetHand(Chiralty)从实时数据中获取位置和旋转,然后用于“SetTransform”姿势手到新的位置和旋转。 - user7856951
1个回答

0

这个问题已经在其他地方得到了解答。Unity3D Leap Motion - Put hand in static pose (Pose done just can't rotate)

本质上,我需要创建一个函数,该函数以姿势手为参数,然后使用Hands.GetHand(Chiralty)从实时数据中获取位置和旋转,然后将姿势手的位置和旋转“SetTransform”到新的位置和旋转。

public static Hand TransformHandToLivePosition(Chirality handType, Hand poseHand)
    {
        Hand sourceHand = Hands.Get(handType);
        Hand mimicHand = null;

        if (poseHand == null && sourceHand != null && sourceHand.Fingers.Count > 0)
        {
            //poseHand = PoseManager.LoadHandPose(sourceHand, 2, this.transform, true);
        }

        if (poseHand != null && sourceHand != null)
        {
            // Copy data from the tracked hand into the mimic hand.
            if (mimicHand == null) { mimicHand = new Hand(); }

            mimicHand.CopyFrom(poseHand); //copy the stored pose in the mimic hand
            mimicHand.Arm.CopyFrom(poseHand.Arm); // copy the stored pose's arm into the mimic hand

            // Use the rotation from the live data
            var handRotation = sourceHand.Rotation.ToQuaternion();

            // Transform the copied hand so that it's centered on the current hands position and matches it's rotation.
            mimicHand.SetTransform(sourceHand.PalmPosition.ToVector3(), handRotation);
        }
        return mimicHand;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接