Esempio n. 1
0
        // Update is called once per frame
        void Update()
        {
            if (nibiruService != null && nibiruService.IsMarkerRecognizeRunning)
            {
                float[] leftEyeArray  = nibiruService.GetMarkerViewMatrix(0);
                float[] rightEyeArray = nibiruService.GetMarkerViewMatrix(1);

                if (leftEyeArray != null && rightEyeArray != null)
                {
                    leftEyeArray[12] *= 0.001f * PositonScaleFactor;
                    leftEyeArray[13] *= 0.001f * PositonScaleFactor;
                    leftEyeArray[14] *= 0.001f * PositonScaleFactor;

                    rightEyeArray[12] *= 0.001f * PositonScaleFactor;
                    rightEyeArray[13] *= 0.001f * PositonScaleFactor;
                    rightEyeArray[14] *= 0.001f * PositonScaleFactor;

                    Matrix4x4 matrixRawLeft  = ARUtilityFunctions.MatrixFromFloatArray(leftEyeArray);
                    Matrix4x4 matrixRawRight = ARUtilityFunctions.MatrixFromFloatArray(rightEyeArray);

                    Matrix4x4 transformationMatrixLeft  = ARUtilityFunctions.LHMatrixFromRHMatrix(matrixRawLeft);
                    Matrix4x4 transformationMatrixRight = ARUtilityFunctions.LHMatrixFromRHMatrix(matrixRawRight);
                    cameraPoseMatLeft  = transformationMatrixLeft.inverse;
                    cameraPoseMatRight = transformationMatrixRight.inverse;
                }

                float[] array = nibiruService.GetMarkerViewMatrix();
                if (array != null)
                {
                    if (!visible)
                    {
                        if (OnMarkerFoundHandler != null)
                        {
                            OnMarkerFoundHandler();
                        }
                        visible = true;
                        NxrGlobal.isMarkerVisible = true;
                        for (int i = 0; i < mTransform.childCount; i++)
                        {
                            mTransform.GetChild(i).gameObject.SetActive(true);
                            Debug.Log("MARKER VISBILE " + mTransform.GetChild(i).gameObject.name);
                        }

                        if (origin != null)
                        {
                            Matrix4x4 pose;
                            // If this marker is the base, no need to take base inverse etc.
                            pose = origin.transform.localToWorldMatrix;

                            transform.position = ARUtilityFunctions.PositionFromMatrix(pose);
                            transform.rotation = ARUtilityFunctions.QuaternionFromMatrix(pose);
                        }
                    }

                    // Filter data
                    array = FilterData(array);

                    // Scale the position from ARToolKit units (mm) into Unity units (m).
                    array[12] *= 0.001f * PositonScaleFactor;
                    array[13] *= 0.001f * PositonScaleFactor;
                    array[14] *= 0.001f * PositonScaleFactor;

                    Matrix4x4 matrixRaw = ARUtilityFunctions.MatrixFromFloatArray(array);

                    // Debug.Log("MarkerViewMatrix>>>>" + matrixRaw.ToString());

                    Matrix4x4 transformationMatrix = ARUtilityFunctions.LHMatrixFromRHMatrix(matrixRaw);
                    cameraPoseMat = transformationMatrix.inverse;

                    //Debug.Log("transformationMatrix>>>>" + transformationMatrix.ToString());
                    //Quaternion quaternion = ARUtilityFunctions.QuaternionFromMatrix(transformationMatrix);
                    //Vector3 eulerAngles = quaternion.eulerAngles;
                    // z轴朝上,转换成z轴朝里,符合unity
                    //mTransform.rotation = Quaternion.Euler(eulerAngles.x - 90, eulerAngles.y, eulerAngles.z);
                    //mTransform.position = ARUtilityFunctions.PositionFromMatrix(transformationMatrix);
                }
                else if (array == null)
                {
                    if (visible)
                    {
                        Debug.Log("MARKER VISIBLE -> NOT VISBILE");
                    }
                    else
                    {
                        Debug.Log("MARKER INIT NOT VISBILE");
                    }

                    if (OnMarkerLostHandler != null)
                    {
                        OnMarkerLostHandler();
                    }
                    NxrGlobal.isMarkerVisible = false;
                    visible = false;
                    for (int i = 0; i < mTransform.childCount; i++)
                    {
                        mTransform.GetChild(i).gameObject.SetActive(false);
                    }
                }
            }
        }