SetTransform导致Unity LeapMotion对象旋转过快
SetTransform causes Unity LeapMotion object to spin too fast
这是基于我最近在这里提出的一个问题:
但是,唯一给出的回复中建议的代码不起作用。我一直在使用 '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());
}
我真正想要的是一种方法,我可以将两个手对象传入(一个是当前 'live' 手,另一个是所需姿势)并返回一个手对象,然后我可以渲染.
更新
这里是我目前得到的和我想要实现的目标的图片。
当前:
目标:
目标图像将显示固定姿势,在本例中是在当前位置和真手旋转的拳头。这意味着我可以握住我的手 'open' 但在屏幕上我会看到一个拳头在四处移动。正如您从 'current' 中看到的那样,SetTransform 为我提供了正确的姿势和位置,但旋转异常。
这个问题已经在别处回答了。
本质上,我必须创建一个函数,将姿势手作为参数,然后使用 Hands.GetHand(手性)从实时数据中获取位置和旋转,然后用于 '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;
}
这是基于我最近在这里提出的一个问题:
但是,唯一给出的回复中建议的代码不起作用。我一直在使用 '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());
}
我真正想要的是一种方法,我可以将两个手对象传入(一个是当前 'live' 手,另一个是所需姿势)并返回一个手对象,然后我可以渲染.
更新
这里是我目前得到的和我想要实现的目标的图片。
当前:
目标:
目标图像将显示固定姿势,在本例中是在当前位置和真手旋转的拳头。这意味着我可以握住我的手 'open' 但在屏幕上我会看到一个拳头在四处移动。正如您从 'current' 中看到的那样,SetTransform 为我提供了正确的姿势和位置,但旋转异常。
这个问题已经在别处回答了。
本质上,我必须创建一个函数,将姿势手作为参数,然后使用 Hands.GetHand(手性)从实时数据中获取位置和旋转,然后用于 '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;
}