刚体不碰撞-统一项目探戈

本文关键字:项目 探戈 碰撞 | 更新日期: 2023-09-27 18:02:32

我在Unity3D中创建了一个RigidBody,并附加了一个控制器脚本,它将通过Tango Motion control控制身体的运动。但问题是,由于某些原因,我的刚体没有和侧面的壁碰撞。它只是穿过它。

这是我的代码片段Update()
void Update()
    {
        Debug.Log("Tango update: " + m_tangoPosition + " " + m_tangoRotation);    
        PoseProvider.GetMouseEmulation(ref m_tangoPosition, ref m_tangoRotation);
        transform.position = m_tangoPosition + m_startPosition;
        transform.rotation = m_tangoRotation;
}

我通过OnPoseAvailable回调获得TangoPose数据

    public void OnTangoPoseAvailable(Tango.TangoPoseData pose)
    {
        // Do nothing if we don't get a pose
        if (pose == null)
        {
            Debug.Log("TangoPoseData is null.");
            return;
        }
        // The callback pose is for device with respect to start of service pose.
        if (pose.framePair.baseFrame == TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_START_OF_SERVICE &&
            pose.framePair.targetFrame == TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE)
        {
            if (pose.status_code == TangoEnums.TangoPoseStatusType.TANGO_POSE_VALID)
            {
                // Cache the position and rotation to be set in the update function.
                m_tangoPosition = new Vector3((float)pose.translation [0],
                                              (float)pose.translation [1],
                                              (float)pose.translation [2]);
                m_tangoRotation = new Quaternion((float)pose.orientation [0],
                                                 (float)pose.orientation [1],
                                                 (float)pose.orientation [2],
                                                 (float)pose.orientation [3]);
//                Debug.Log("Tango VALID pose: " + m_tangoPosition + " " + m_tangoRotation);
            }
        }
    }

我错过了什么吗?为什么我的刚体穿过墙壁?我把这个脚本附加到我的胶囊刚体上。

任何帮助或指针都非常感谢。

谢谢

刚体不碰撞-统一项目探戈

您将希望在fixeduupdate方法中更改刚体的位置和旋转,而不是更新。fixeduupdate方法用于任何物理相关的更改,并以固定的速率调用,而Update则依赖于帧率。

此外,您正在更改转换的位置。这实际上是在传送物体。如果你想移动刚体并且仍然有碰撞,检查刚体组件上的MovePosition和moveotation方法。

我对"Tango"一无所知,但你的代码将类似于以下未经测试的代码:

public Rigidbody rigidbody;
void Start()
{
    rigidbody = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
    //Other code here
    rigidbody.MovePosition(m_tangoPosition + m_startPosition);
    rigidbody.MoveRotation(m_tangoRotation);
}
我希望我对你有帮助!