예제 #1
0
        private void LoadControllerModel(NxrInstantNativeApi.NibiruDeviceType nibiruDeviceType, string objName)
        {
            if (InteractionManager.IsSupportControllerModel())
            {
                if (NxrPlayerCtrl.Instance.isNeedCustomModel)
                {
                    if (string.IsNullOrEmpty(NxrPlayerCtrl.Instance.customModelPrefabName))
                    {
                        Debug.LogError("The path of the custom handle model prefab is wrong");
                    }
                    else
                    {
                        LoadDefaultCtrl(NxrPlayerCtrl.Instance.customModelPrefabName);
                        return;
                    }
                }

                InteractionManager.ControllerConfig mControllerConfig = InteractionManager.GetControllerConfig();
                CreateControllerModel(nibiruDeviceType, objName, mControllerConfig);
            }
            else
            {
                LoadDefaultCtrl("CustomModel");
            }
        }
예제 #2
0
        private int getNoloType(NxrInstantNativeApi.NibiruDeviceType deviceType)
        {
            int noloType = (int)CDevice.NOLO_TYPE.NONE;

            if (deviceType == NxrInstantNativeApi.NibiruDeviceType.LeftController)
            {
                noloType = (int)CDevice.NOLO_TYPE.LEFT;
            }
            else if (deviceType == NxrInstantNativeApi.NibiruDeviceType.RightController)
            {
                noloType = (int)CDevice.NOLO_TYPE.RIGHT;
            }
            else if (deviceType == NxrInstantNativeApi.NibiruDeviceType.Hmd)
            {
                noloType = (int)CDevice.NOLO_TYPE.HEAD;
            }
            return(noloType);
        }
예제 #3
0
        public override void SetSixDofControllerPrimaryDeviceType(NxrInstantNativeApi.NibiruDeviceType deviceType)
        {
            int type = -1;

            if (deviceType == NxrInstantNativeApi.NibiruDeviceType.LeftController)
            {
                type = 1;
            }
            else if (deviceType == NxrInstantNativeApi.NibiruDeviceType.RightController)
            {
                type = 0;
            }

            if (type >= 0)
            {
                CallStaticMethod(nibiruVR, "setSystemProperty", "nxr.ctrl.primaryhand", "" + type);
            }
        }
예제 #4
0
        // Update is called once per frame
        void Update()
        {
#if UNITY_ANDROID //&& !UNITY_EDITOR
            if (!NxrViewer.Instance.IsWinPlatform && !isGamePad)
            {
                // Android/NOLO
                int  noloType    = GetNoloType();
                int  handType    = noloType == (int)CDevice.NOLO_TYPE.LEFT ? (int)InteractionManager.NACTION_HAND_TYPE.HAND_LEFT : (int)InteractionManager.NACTION_HAND_TYPE.HAND_RIGHT;
                bool isConnected = false;
                if (InteractionManager.IsInteractionSDKEnabled())
                {
                    isConnected = InteractionManager.IsSixDofControllerConnected(handType);
                }
                else
                {
                    isConnected = ControllerAndroid.isDeviceConn(noloType);
                }

                if (DebugInEditor)
                {
                    isConnected = true;
                }

                if (_currentStates.connectStatus == 0 && isConnected)
                {
                    NxrViewer.Instance.SwitchControllerMode(true);
                    _currentStates.connectStatus = 1;
                    NxrPlayerCtrl mNxrPlayerCtrl = NxrPlayerCtrl.Instance;
                    if (mNxrPlayerCtrl != null)
                    {
                        // 关闭3dof手柄显示
                        mNxrPlayerCtrl.GamepadEnabled = false;
                        // 关闭白点显示
                    }
                }
                else if (_currentStates.connectStatus == 1 && !isConnected)
                {
                    _currentStates.connectStatus = 0;
                }

                //Debug.Log("status="+_currentStates.connectStatus + ", " + deviceType.ToString() + ","
                //    + ControllerAndroid.isDeviceConn((int) CDevice.NOLO_TYPE.LEFT) + ", " + ControllerAndroid.isDeviceConn((int)CDevice.NOLO_TYPE.RIGHT));

                if (!IsConneted() && controllerModel != null && controllerModel.gameObject.activeSelf)
                {
                    if (controllerPower != null)
                    {
                        controllerPower.gameObject.SetActive(false);
                    }
                    controllerModel.gameObject.SetActive(false);
                    laserPointer.holder.SetActive(false);
                    NxrControllerHelper.ControllerRaycastObject = null;
                    Debug.Log("controllerModel Dismiss " + deviceType + "," + controllerModel.gameObject.activeSelf);
                }
                else if (IsConneted() && controllerModel != null && !controllerModel.gameObject.activeSelf)
                {
                    if (controllerPower != null)
                    {
                        controllerPower.gameObject.SetActive(true);
                    }
                    controllerModel.gameObject.SetActive(true);
                    laserPointer.holder.SetActive(true);
                    Debug.Log("controllerModel Show " + deviceType);
                }

                if (GetButtonUp(ButtonID.InternalTrigger))
                {
                    NxrSDKApi.Instance.SixDofControllerPrimaryDeviceType = deviceType;
                    Debug.Log("IsPrimaryControllerHand " + deviceType.ToString());
                }

                if (laserPointer != null && controllerModel != null)
                {
                    if (NxrSDKApi.Instance.SixDofControllerPrimaryDeviceType != deviceType)
                    {
                        // 非主手柄,隐藏射线
                        laserPointer.holder.SetActive(false);
                    }
                    else
                    {
                        laserPointer.holder.SetActive(controllerModel.gameObject.activeSelf);
                    }
                }

                if (IsConneted())
                {
                    processControllerKeyEvent(noloType);
                    float[] poseData = new float[8];
                    if (InteractionManager.IsSixDofControllerConnected(handType))
                    {
                        float[] pose = InteractionManager.GetControllerPose((InteractionManager.NACTION_HAND_TYPE)handType);
                        poseData[1] = pose[4];
                        poseData[2] = pose[5];
                        poseData[3] = pose[6];
                        for (int i = 0; i < 4; i++)
                        {
                            poseData[4 + i] = pose[i];
                        }
                    }
                    else
                    {
                        poseData = ControllerAndroid.getCPoseEvent(noloType, 1);
                    }

                    if (NxrViewer.Instance.SixDofMode == SixDofMode.Head_3Dof_Ctrl_6Dof)
                    {
                        Vector3 HeadPosition = NxrSDKApi.Instance.HeadPosition;
                        // Debug.LogError(noloType + ".NOLO Controller Y: " + poseData[2] + "/HeadY=" + HeadPosition.y);
                        poseData[1] = poseData[1] - HeadPosition.x;
                        poseData[2] = poseData[2] - HeadPosition.y;
                        poseData[3] = poseData[3] - HeadPosition.z;
                    }
                    else if (NxrViewer.Instance.SixDofMode == SixDofMode.Head_3Dof_Ctrl_3Dof)
                    {
                        var factor  = handType == (int)InteractionManager.NACTION_HAND_TYPE.HAND_LEFT ? -1 : 1;
                        var headPos = NxrViewer.Instance.GetHead().transform.localPosition;
                        var pos     = new Vector3(headPos.x + 0.25f * factor, headPos.y - 0.6f, headPos.z + 0.5f);
                        poseData[1] = pos.x;
                        poseData[2] = pos.y;
                        poseData[3] = pos.z;
                    }

                    transform.localPosition = new Vector3(poseData[1], poseData[2], poseData[3]);
                    transform.localRotation = new Quaternion(poseData[4], poseData[5], poseData[6], poseData[7]);
                }
            }
#endif

#if UNITY_STANDALONE_WIN
            if (NxrInstantNativeApi.Inited)
            {
                _prevStates    = _currentStates;
                _currentStates = NxrInstantNativeApi.GetControllerStates(deviceType);
                if (isGamePad)
                {
                    // 3dof手柄左右手模式切换
                    if (!IsConneted())
                    {
                        _currentStates = NxrInstantNativeApi.GetControllerStates(NxrInstantNativeApi.NibiruDeviceType.LeftController);
                        if (!IsConneted())
                        {
                            deviceType = NxrInstantNativeApi.NibiruDeviceType.RightController;
                        }
                        else
                        {
                            NxrControllerHelper.HandMode3DOF = NxrControllerHelper.LEFT_HAND_MODE;
                            deviceType = NxrInstantNativeApi.NibiruDeviceType.LeftController;
                            Debug.Log("Current 3dof HandMode is Left !!!");
                        }
                    }
                }

                if (!IsConneted() && controllerModel != null && controllerModel.gameObject.activeSelf)
                {
                    controllerModel.gameObject.SetActive(false);
                    laserPointer.holder.SetActive(false);
                    if (deviceType == NxrInstantNativeApi.NibiruDeviceType.LeftController)
                    {
                        NxrControllerHelper.IsLeftNoloControllerConnected = false;
                    }
                    else if (deviceType == NxrInstantNativeApi.NibiruDeviceType.RightController)
                    {
                        NxrControllerHelper.IsRightNoloControllerConnected = false;
                    }
                    Debug.Log("controllerModel Dismiss " + deviceType + "," + controllerModel.gameObject.activeSelf);
                }
                else if (IsConneted() && controllerModel != null && !controllerModel.gameObject.activeSelf)
                {
                    controllerModel.gameObject.SetActive(true);
                    laserPointer.holder.SetActive(true);

                    if (NxrControllerHelper.ControllerType == (int)NxrInstantNativeApi.NibiruControllerId.NOLO)
                    {
                        if (deviceType == NxrInstantNativeApi.NibiruDeviceType.LeftController)
                        {
                            NxrControllerHelper.IsLeftNoloControllerConnected = true;
                        }
                        else if (deviceType == NxrInstantNativeApi.NibiruDeviceType.RightController)
                        {
                            NxrControllerHelper.IsRightNoloControllerConnected = true;
                        }
                    }
                    Debug.Log("controllerModel Show " + deviceType);
                }
                else if (!IsConneted() && isGamePad && NxrControllerHelper.Is3DofControllerConnected)
                {
                    NxrControllerHelper.Is3DofControllerConnected = false;
                    Debug.Log("Controller 3dof Dismiss.");
                }
                else if (IsConneted() && isGamePad && !NxrControllerHelper.Is3DofControllerConnected)
                {
                    if (NxrControllerHelper.ControllerType == (int)NxrInstantNativeApi.NibiruControllerId.NORMAL_3DOF)
                    {
                        NxrControllerHelper.Is3DofControllerConnected = true;
                    }
                    Debug.Log("Controller 3dof Show." + NxrControllerHelper.ControllerType);
                }

                if (!isGamePad)
                {
                    NxrInstantNativeApi.Nibiru_Pose pose = NxrInstantNativeApi.GetPoseByDeviceType(deviceType);
                    // NOLO 非3DOF
                    transform.localPosition = pose.position;
                    transform.localRotation = new Quaternion(pose.rotation.x, pose.rotation.y, pose.rotation.z, pose.rotation.w);
                }
            }
#endif
        }
예제 #5
0
 public virtual void SetSixDofControllerPrimaryDeviceType(NxrInstantNativeApi.NibiruDeviceType deviceType)
 {
 }
예제 #6
0
        void Update()
        {
#if UNITY_ANDROID //&& !UNITY_EDITOR
            bool isQuatConn = IsQuatConn();
            if (debugInEditor)
            {
                isQuatConn = true;
            }

            bool isNeedShowController = isQuatConn ? controllerModelDisplay : false;

            if (!isCreateControllerHandler && isNeedShowController)
            {
                CreateControllerHandler();
                isCreateControllerHandler = true;
            }
            else if (isCreateControllerHandler && !isNeedShowController)
            {
                DestroyChild(mTransform);
                isCreateControllerHandler = false;
                debugInEditor             = false;
            }

            if (isQuatConn)
            {
                //四元素
                if (InteractionManager.IsControllerConnected())
                {
                    float[] res = InteractionManager.GetControllerPose(InteractionManager.GetHandTypeByHandMode());
                    controllerQuat.x = res[0];
                    controllerQuat.y = res[1];
                    controllerQuat.z = res[2];
                    controllerQuat.w = res[3];
                }
                else
                {
                    float[] res = ControllerAndroid.getQuat(1);
                    controllerQuat.x = res[0];
                    controllerQuat.y = res[1];
                    controllerQuat.z = res[2];
                    controllerQuat.w = res[3];
                }

#if UNITY_EDITOR
                if (NxrViewer.Instance.RemoteDebug && NxrViewer.Instance.RemoteController)
                {
                    controllerQuat = EditorRemoteQuat;
                }
#endif

                //赋值 te.q为九轴传过来的四元数信息
                mTransform.rotation = controllerQuat;
                if (nxrArmModel != null)
                {
                    float factor = 1;
                    if (InteractionManager.IsInteractionSDKEnabled())
                    {
                        factor = InteractionManager.IsLeftControllerConnected() ? -1 : 1;
                    }
                    else if (ControllerAndroid.isQuatConn())
                    {
                        factor = ControllerAndroid.getHandMode() == 0 ? 1 : -1;
                    }

                    nxrArmModel.OnControllerInputUpdated();
                    Vector3 armPos = new Vector3(nxrArmModel.ControllerPositionFromHead.x * factor,
                                                 nxrArmModel.ControllerPositionFromHead.y, nxrArmModel.ControllerPositionFromHead.z);
                    mTransform.position = HeadPosition + armPos;
                }

                if (NxrSDKApi.Instance.Is3DofSpriteFirstLoad && !isTipsCreated)
                {
                    CreateTipImgs();
                }
                else if (isTipsCreated)
                {
                    ChangeTipAlpha();
                }
            }
#elif UNITY_STANDALONE_WIN || ANDROID_REMOTE_NRR
            if (NxrControllerHelper.Is3DofControllerConnected)
            {
                if (!NxrInstantNativeApi.Inited)
                {
                    return;
                }

                _prevStates = _currentStates;
                NxrInstantNativeApi.NibiruDeviceType deviceTypeOf3dof =
                    NxrControllerHelper.HandMode3DOF == NxrControllerHelper.LEFT_HAND_MODE
                        ? NxrInstantNativeApi.NibiruDeviceType.LeftController
                        : NxrInstantNativeApi.NibiruDeviceType.RightController;
                _currentStates = NxrInstantNativeApi.GetControllerStates(deviceTypeOf3dof);


                NxrInstantNativeApi.Nibiru_Pose pose =
                    NxrInstantNativeApi.GetPoseByDeviceType(NxrInstantNativeApi.NibiruDeviceType.RightController);
                mTransform.rotation =
                    new Quaternion(pose.rotation.x, pose.rotation.y, pose.rotation.z, pose.rotation.w);

                //3dof位移
                if (nxrArmModel != null)
                {
                    nxrArmModel.OnControllerInputUpdated();
                    mTransform.position = HeadPosition + nxrArmModel.ControllerPositionFromHead;
                }

                if (GetButtonDown(NxrTrackedDevice.ButtonID.TouchPad))
                {
                    int[] KeyAction = NibiruTaskApi.GetKeyAction();
                    KeyAction[CKeyEvent.KEYCODE_DPAD_CENTER] = 1;
                }

                if (GetButtonUp(NxrTrackedDevice.ButtonID.TouchPad))
                {
                    int[] KeyAction = NibiruTaskApi.GetKeyAction();
                    KeyAction[CKeyEvent.KEYCODE_DPAD_CENTER] = 0;
                }
            }
#endif
        }
예제 #7
0
        private void CreateControllerModel(NxrInstantNativeApi.NibiruDeviceType deviceType, string objName,
                                           InteractionManager.ControllerConfig mControllerConfig)
        {
            string objPath = mControllerConfig.objPath;

            if (deviceType == NxrInstantNativeApi.NibiruDeviceType.LeftController)
            {
                objPath = mControllerConfig.leftCtrlObjPath;
            }
            else if (deviceType == NxrInstantNativeApi.NibiruDeviceType.RightController)
            {
                objPath = mControllerConfig.rightCtrlObjPath;
            }

            if (objPath == null)
            {
                Debug.LogError("CreateControllerModel failed, objPath is null......" + objName);
                return;
            }

            GameObject      go = new GameObject(objName);
            NxrLaserPointer mNxrLaserPointer = go.AddComponent <NxrLaserPointer>();

            mNxrLaserPointer.deviceType = deviceType;
            go.transform.SetParent(transformCache);
            go.transform.localScale    = Vector3.one;
            go.transform.localPosition = new Vector3(0, 0, 0);
            go.transform.localRotation = new Quaternion(0, 0, 0, 1);

            GameObject modelGOParent = new GameObject("model_P");

            modelGOParent.transform.localScale    = new Vector3(-1, 1, 1);
            modelGOParent.transform.localPosition = new Vector3(0, 0, 0);
            modelGOParent.transform.localRotation = new Quaternion(0, 0, 0, 1);
            modelGOParent.transform.SetParent(go.transform);

            GameObject modelGO = new GameObject("model");

            modelGO.transform.SetParent(modelGOParent.transform);
            modelGO.transform.localScale = new Vector3(mControllerConfig.modelScale[0]
                                                       , mControllerConfig.modelScale[1], mControllerConfig.modelScale[2]);
            modelGO.transform.localRotation = Quaternion.Euler(mControllerConfig.modelRotation[0],
                                                               mControllerConfig.modelRotation[1], mControllerConfig.modelRotation[2]);
            modelGO.transform.localPosition = new Vector3(mControllerConfig.modelPosition[0]
                                                          , mControllerConfig.modelPosition[1], mControllerConfig.modelPosition[2]);
            modelGO.AddComponent <NxrControllerModel>();

            //  string objPath = "/system/etc/Objs/housing_bott.obj";
            Debug.Log("objPath=" + objPath);

            ObjModelLoader mObjModelLoader = go.GetComponent <ObjModelLoader>();

            if (mObjModelLoader == null)
            {
                go.AddComponent <ObjMaterial>();
                mObjModelLoader = go.AddComponent <ObjModelLoader>();
            }

            mObjModelLoader.LoadObjFile(objPath, modelGO.transform);

            GameObject powerGO = new GameObject("Power");

            powerGO.transform.SetParent(go.transform);

            MeshRenderer powerMeshRenderer = powerGO.AddComponent <MeshRenderer>();
            Mesh         quadMesh          = new Mesh();

            quadMesh.name = "QUAD";
            float quadSize = 0.5f;

            quadMesh.vertices = new Vector3[]
            {
                new Vector3(-1 * quadSize, -1 * quadSize, 0),
                new Vector3(-1 * quadSize, 1 * quadSize, 0),
                new Vector3(1 * quadSize, 1 * quadSize, 0),
                new Vector3(1 * quadSize, -1 * quadSize, 0)
            };
            quadMesh.uv = new Vector2[]
            {
                new Vector2(0, 0),
                new Vector2(0, 1),
                new Vector2(1, 1),
                new Vector2(1, 0)
            };
            int[] triangles = { 0, 1, 2, 0, 2, 3 };
            quadMesh.triangles = triangles;

            powerGO.AddComponent <MeshFilter>().mesh = quadMesh;
            powerGO.AddComponent <MeshCollider>();
            powerGO.AddComponent <NibiruControllerPower>();

            powerGO.transform.localPosition = new Vector3(mControllerConfig.batteryPosition[0],
                                                          mControllerConfig.batteryPosition[1]
                                                          , mControllerConfig.batteryPosition[2]);
            powerGO.transform.localRotation = Quaternion.Euler(mControllerConfig.batteryRotation[0],
                                                               mControllerConfig.batteryRotation[1]
                                                               , mControllerConfig.batteryRotation[2]);
            powerGO.transform.localScale = new Vector3(mControllerConfig.batteryScale[0],
                                                       mControllerConfig.batteryScale[1]
                                                       , mControllerConfig.batteryScale[2]);

            // 射线起点
            mNxrLaserPointer.SetHolderLocalPosition(new Vector3(mControllerConfig.rayStartPosition[0],
                                                                mControllerConfig.rayStartPosition[1],
                                                                mControllerConfig.rayStartPosition[2]));

            NxrTrackedDevice trackedDevice = go.AddComponent <NxrTrackedDevice>();

            if (trackedDevice != null)
            {
                trackedDevice.ReloadLaserPointer(mNxrLaserPointer);
                trackedDevice.deviceType = deviceType;
                InteractionManager.NACTION_HAND_TYPE mHandType =
                    deviceType == NxrInstantNativeApi.NibiruDeviceType.LeftController
                        ? InteractionManager.NACTION_HAND_TYPE.HAND_LEFT
                        : InteractionManager.NACTION_HAND_TYPE.HAND_RIGHT;

                if (!DualCtrlDeviceDict.ContainsKey(mHandType))
                {
                    DualCtrlDeviceDict.Add(mHandType, trackedDevice);
                }
                else
                {
                    DualCtrlDeviceDict[mHandType] = trackedDevice;
                }
            }

            if (deviceType == NxrInstantNativeApi.NibiruDeviceType.LeftController)
            {
                leftObj     = go;
                leftModelGo = modelGO;
            }
            else if (deviceType == NxrInstantNativeApi.NibiruDeviceType.RightController)
            {
                rightObj     = go;
                rightModelGo = modelGO;
            }

            //close
            NxrViewer.Instance.SwitchControllerMode(true);
            Debug.Log("HideGaze.ForceUseReticle3");
        }