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"); } }
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); }
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); } }
// 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 }
public virtual void SetSixDofControllerPrimaryDeviceType(NxrInstantNativeApi.NibiruDeviceType deviceType) { }
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 }
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"); }