1

编辑:在做了更多的调试之后。由于某种原因,速度矢量似乎读数为零(对于这两种方法)。有什么建议么?

我正在尝试在 Unity 中为 Oculus Quest 制作一个简单的手部追踪演示。我能够成功地实现一个抓取和释放机制,类似于这里的本教程。Oculus 插件的状态有点过时,但整体逻辑保持不变。

我遇到的唯一问题是实现 Drop 功能。当我放下一个物体时,我想将我手的线速度和角速度添加到物体上。我尝试通过以下方式做到这一点:

抓取脚本:

protected override void GrabEnd()
{
    if (m_grabbedObj)
    {
        Debug.Log("Grabbed object found");
        Rigidbody rigid = GetComponent<Rigidbody>();
        if (rigid)
        {
            GrabbableRelease(rigid.velocity, rigid.angularVelocity);
        }
        else
        {
            Vector3 linearVelocity = (transform.position - lastPointerPos) / Time.fixedDeltaTime;
            Vector3 angularVelocity = (transform.eulerAngles - lastPointerRot.eulerAngles) / Time.fixedDeltaTime;

            GrabbableRelease(linearVelocity, angularVelocity);
        }
    }

    GrabVolumeEnable(true);
}

Grabbable 内部:

virtual public void GrabEnd(Vector3 linearVelocity, Vector3 angularVelocity)
{
    Rigidbody rb = gameObject.GetComponent<Rigidbody>();

    rb.velocity = linearVelocity;
    rb.angularVelocity = angularVelocity;
}

在这两者之间还有一个函数,但本质上它只是在传递速度的对象上调用 GrabEnd。

我还确保了抓取器(手)和可抓取物体上都有刚体。

lastPointerPos&lastPointerRot是在 FixedUpdate 结束时保存的 Vector3。我还在检查是否需要根据食指的 PinchStrength 和 Confidence 在 FixedUpdate 内调用 GrabEnd。

我有两种方法的原因只是我尝试解决这个问题的两种不同方法。两者似乎都不起作用。无论我如何像客厅里的傻瓜一样挥舞双臂,物体都会直接掉到地板上哈哈

任何帮助将不胜感激!

4

1 回答 1

0

未来 Oculus sdk 应该支持 OVRInput.GetLocalControllerVelocity((OVRInput.Controller.RTouch)) 返回手速。目前他们没有可用的。

一个简单的实现解决方案可能是这样的:

public GameObject RightHandAnchor;
private Vector3 lastPosition;

private void FixedUpdate()
{   
    float speed = Vector3.Distance( lastPosition, RightHandAnchor.transform.position) / Time.deltaTime;
    //update previous positions
    lastPosition = middlePositionVelocity;              
    Debug.log("Speed: " + String.Format("{0:0.00}", speed);

}

`

于 2021-12-12T11:54:03.703 回答