代码切换手柄模型和自定义模型

在这里插入图片描述

public class ToggleCustomHands : MonoBehaviour
    {
        public VRTK_ControllerEvents leftController;
        public VRTK_ControllerEvents rightController;

        public GameObject leftHandAvatar;
        public GameObject rightHandAvatar;

        protected bool state;

        protected virtual void OnEnable()
        {
            state = false;
            //注册手柄菜单按下事件
            if (leftController != null)
            {
                leftController.ButtonTwoPressed += ToggleHands;
            }

            if (rightController != null)
            {
                rightController.ButtonTwoPressed += ToggleHands;
            }
            ToggleVisibility();
        }

        protected virtual void OnDisable()
        {
            if (leftController != null)
            {
                leftController.ButtonTwoPressed -= ToggleHands;
            }

            if (rightController != null)
            {
                rightController.ButtonTwoPressed -= ToggleHands;
            }
        }

        protected virtual void ToggleHands(object sender, ControllerInteractionEventArgs e)
        {
            state = !state;
            ToggleVisibility();
        }

        protected virtual void ToggleVisibility()
        {
            ToggleAvatarVisibility();//让左右手两个模型显示或隐藏
            ToggleSDKVisibility();//自带的手柄显示或隐藏
            ToggleScriptAlias();
        }

        protected virtual void ToggleAvatarVisibility()
        {
            if (leftHandAvatar != null)
            {
                leftHandAvatar.SetActive(state);
            }
            if (rightHandAvatar != null)
            {
                rightHandAvatar.SetActive(state);
            }
        }

        protected virtual void ToggleSDKVisibility()
        {
            VRTK_SDKSetup sdkType = VRTK_SDKManager.GetLoadedSDKSetup();//获取当前vrtk使用的是哪种类型的sdk 例如当前使用的是steamvr
            if (sdkType != null)
            {
                //获取的是当前手柄 bool参数 如果是true 返回的是当前手柄实际物体  为fasle的话返回的是leftcontrollerscript物体
                VRTK_ControllerReference leftController = VRTK_ControllerReference.GetControllerReference(VRTK_DeviceFinder.GetControllerLeftHand(true));
                VRTK_ControllerReference rightController = VRTK_ControllerReference.GetControllerReference(VRTK_DeviceFinder.GetControllerRightHand(true));
                switch (sdkType.name)
                {
                    case "SteamVR":
                        ToggleControllerRenderer(leftController.actual, "Model");
                        ToggleControllerRenderer(rightController.actual, "Model");
                        break;
                    case "Oculus":
                        ToggleControllerRenderer(leftController.model);
                        ToggleControllerRenderer(rightController.model);
                        break;
                    case "WindowsMR":
                        ToggleControllerRenderer(leftController.model, "glTFController");
                        ToggleControllerRenderer(rightController.model, "glTFController");
                        break;
                }
            }
        }

        protected virtual void ToggleControllerRenderer(GameObject controller, string findPath = "")
        {
            if (controller != null)
            {
                if (findPath == "")
                {
                    controller.SetActive(!state);
                }
                else
                {
                    Transform childModel = controller.transform.Find(findPath);
                    if (childModel != null)
                    {
                        childModel.gameObject.SetActive(!state);
                    }
                }
            }
        }

        protected virtual void ToggleScriptAlias()
        {
            GameObject scriptLeft = VRTK_DeviceFinder.GetControllerLeftHand(false);
            GameObject scriptRight = VRTK_DeviceFinder.GetControllerRightHand(false);
            CycleScriptAlias(scriptLeft, leftHandAvatar);
            CycleScriptAlias(scriptRight, rightHandAvatar);
        }

        protected virtual void CycleScriptAlias(GameObject controller, GameObject avatar)
        {
            if (controller != null)
            {
                VRTK_InteractTouch touch = controller.GetComponentInChildren<VRTK_InteractTouch>();
                VRTK_InteractGrab grab = controller.GetComponentInChildren<VRTK_InteractGrab>();
                touch.enabled = false;
                grab.enabled = false;

                touch.customColliderContainer = null;//分别设置 碰撞集 和抓取组件需要的刚体组件  这里线设置为空  在后面进行赋值
                grab.ForceControllerAttachPoint(null);

                if (avatar != null && state)
                {//分别设置 碰撞集 和抓取组件需要的刚体组件点
                    touch.customColliderContainer = avatar.transform.Find("HandColliders").gameObject;
                    grab.ForceControllerAttachPoint(avatar.transform.Find("GrabAttachPoint").GetComponent<Rigidbody>());
                }
                touch.enabled = true;
                grab.enabled = true;
            }
        }
    }

在这里插入图片描述

如果你已经成功获取了VR手柄模型,那么在OpenVR和OSG中显示它应该不难。以下是一些基本的步骤: 1. 在OSG中创建一个节点,将VR手柄模型添加为其子节点。 2. 在OpenVR中创建手柄设备的句柄。 3. 在渲染循环中,使用OpenVR获取手柄的状态信息(例如位置、姿态等)。 4. 将手柄的状态信息应用于OSG节点,以便在VR中正确显示手柄。 下面是一些示例代码,可以帮助你更好地理解这些步骤: ```cpp // 创建手柄模型节点 osg::ref_ptr<osg::Node> controllerModel = osgDB::readNodeFile("path/to/controller/model.osg"); osg::ref_ptr<osg::PositionAttitudeTransform> controllerTransform = new osg::PositionAttitudeTransform(); controllerTransform->addChild(controllerModel); // 创建OpenVR手柄设备句柄 vr::TrackedDeviceIndex_t controllerIndex = vr::k_unTrackedDeviceIndexInvalid; vr::VRControllerState_t controllerState = {}; vr::ETrackedDeviceClass deviceClass = vr::VRSystem()->GetTrackedDeviceClass(controllerIndex); if (deviceClass == vr::TrackedDeviceClass_Controller || deviceClass == vr::TrackedDeviceClass_GenericTracker) { controllerIndex = deviceIndex; } // 在渲染循环中更新手柄状态 while (!done) { // 获取手柄状态 vr::VRSystem()->GetControllerState(controllerIndex, &controllerState, sizeof(controllerState)); // 获取手柄位置和姿态 vr::TrackedDevicePose_t pose = vr::TrackedDevicePose_t(); vr::VRControllerState_t state = vr::VRControllerState_t(); vr::VRSystem()->GetDeviceToAbsoluteTrackingPose(vr::TrackingUniverseStanding, 0, &pose, 1); vr::VRSystem()->GetControllerState(controllerIndex, &state, sizeof(vr::VRControllerState_t)); // 将手柄状态应用于OSG节点 osg::Quat orientation = osg::Quat(pose.mDeviceToAbsoluteTracking.m[0][0], pose.mDeviceToAbsoluteTracking.m[1][0], pose.mDeviceToAbsoluteTracking.m[2][0], pose.mDeviceToAbsoluteTracking.m[0][1], pose.mDeviceToAbsoluteTracking.m[1][1], pose.mDeviceToAbsoluteTracking.m[2][1], pose.mDeviceToAbsoluteTracking.m[0][2], pose.mDeviceToAbsoluteTracking.m[1][2], pose.mDeviceToAbsoluteTracking.m[2][2]); osg::Vec3 position = osg::Vec3(pose.mDeviceToAbsoluteTracking.m[3][0], pose.mDeviceToAbsoluteTracking.m[3][1], pose.mDeviceToAbsoluteTracking.m[3][2]); controllerTransform->setPosition(position); controllerTransform->setAttitude(orientation); // 渲染场景 viewer->frame(); } ``` 希望这些代码可以帮助你在OpenVR和OSG中正确显示VR手柄模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChengDengKe

观众大佬赏杯咖啡叭~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值