Example #1
0
        /// <summary></summary>
        /// <returns>tracking pose matrix</returns>
        public Matrix4x4 GetPose()
        {
            NativeAPI.maxst_Trackable_getPose(cPtr, glPoseMatrix);

            if (AbstractARManager.Instance.WorldCenterModeSetting ==
                AbstractARManager.WorldCenterMode.TARGET)
            {
                return(Matrix4x4.identity);
            }
            else
            {
                Matrix4x4  tempPose = MatrixUtils.GetUnityPoseMatrix(glPoseMatrix);
                Quaternion rotation = Quaternion.Euler(90, 0, 0);
                Matrix4x4  m        = Matrix4x4.TRS(AbstractARManager.Instance.GetARCamera().transform.position, rotation, new Vector3(1, 1, 1));

                // First. Change world matrix
                tempPose = m * tempPose;

                rotation = Quaternion.Euler(-90, 0, 0);
                m        = Matrix4x4.TRS(Vector3.zero, rotation, new Vector3(1, 1, 1));

                // Second. Change local matrix
                tempPose = tempPose * m;

                return(tempPose);
            }
        }
Example #2
0
        internal void Create(Vector3[] vertices, Matrix4x4[] cameraMatrices, Material[] materials)
        {
            int materialsLength = materials.Length;

            if (materialsLength == 0)
            {
                return;
            }

            transform.localRotation = Camera.main.transform.localRotation;

            textureWidth  = materials[0].mainTexture.width;
            textureHeight = materials[0].mainTexture.height;

            GameObject mapViewerCameraObject = Resources.Load <GameObject>("MaxstAR/Contents/MapViewerCamera");

            groupObjects  = new GameObject[materialsLength];
            cameraObjects = new GameObject[materialsLength];
            imageObjects  = new GameObject[materialsLength];
            meshObjects   = new GameObject[materialsLength];

            for (int i = 0; i < materialsLength; i++)
            {
                groupObjects[i]  = new GameObject();
                cameraObjects[i] = Instantiate(mapViewerCameraObject);
                meshObjects[i]   = new GameObject();
                imageObjects[i]  = GameObject.CreatePrimitive(PrimitiveType.Quad);

                groupObjects[i].name  = "Keyframe" + i;
                cameraObjects[i].name = "Camera";
                meshObjects[i].name   = "Mesh";
                imageObjects[i].name  = "Image";

                groupObjects[i].transform.parent  = transform;
                cameraObjects[i].transform.parent = groupObjects[i].transform;
                meshObjects[i].transform.parent   = groupObjects[i].transform;
                imageObjects[i].transform.parent  = groupObjects[i].transform;

                cameraObjects[i].layer = LayerMask.NameToLayer("Ignore Raycast");
                meshObjects[i].AddComponent(typeof(MeshFilter));
                meshObjects[i].AddComponent(typeof(MeshRenderer));
                meshObjects[i].GetComponent <MeshFilter>().mesh    = CreateMapViewerMesh(i, vertices);
                meshObjects[i].GetComponent <Renderer>().material  = materials[i];
                imageObjects[i].GetComponent <Renderer>().material = materials[i];

                groupObjects[i].transform.localPosition = Vector3.zero;
                groupObjects[i].transform.localRotation = Quaternion.identity;
                groupObjects[i].transform.localScale    = new Vector3(1.0f, 1.0f, 1.0f);

                Matrix4x4 m = MatrixUtils.GetUnityPoseMatrix(cameraMatrices[i]);
                cameraObjects[i].transform.localRotation = MatrixUtils.QuaternionFromMatrix(m);
                cameraObjects[i].transform.localPosition = MatrixUtils.PositionFromMatrix(m);
                cameraObjects[i].transform.localScale    = new Vector3(0.01f, 0.01f, 0.01f);

                meshObjects[i].transform.localPosition = Vector3.zero;
                meshObjects[i].transform.localRotation = Quaternion.identity;
                meshObjects[i].transform.localScale    = new Vector3(scaleFactor, scaleFactor, scaleFactor);

                //imageObjects[i].transform.localPosition = new Vector3(0.0f, 0.0f, 10.0f);
                //imageObjects[i].transform.localRotation = Quaternion.identity;
                //imageObjects[i].transform.localScale = new Vector3(10.0f, 10.0f * -textureHeight / textureWidth, 10.0f);


                Vector4 p = m * (new Vector4(0.0f, 0.0f, 10.0f, 1.0f));
                imageObjects[i].transform.localRotation = MatrixUtils.QuaternionFromMatrix(m);
                imageObjects[i].transform.localPosition = new Vector3(p.x, p.y, p.z);
                imageObjects[i].transform.localScale    = new Vector3(10.0f, 10.0f * -textureHeight / textureWidth, 10.0f);
            }

            gameViewSize                      = GetGameViewSize();
            viewCameraObject                  = new GameObject();
            viewCameraObject.name             = "ViewCamera";
            viewCameraObject.transform.parent = transform;
            Camera camera = viewCameraObject.AddComponent <Camera>();

            camera.ResetProjectionMatrix();
            camera.nearClipPlane   = 0.03f;
            camera.farClipPlane    = 10000.0f;
            camera.aspect          = gameViewSize.x / gameViewSize.y;
            camera.clearFlags      = CameraClearFlags.SolidColor;
            camera.backgroundColor = Color.black;
            camera.cullingMask    &= ~(1 << LayerMask.NameToLayer("Ignore Raycast"));

            ///////////////////////// TODO: check /////////////////////////
            if (gameViewSize.x > gameViewSize.y * textureWidth / textureHeight)
            {
                camera.fieldOfView = 2.0f * Mathf.Atan2(vy, vz) * Mathf.Rad2Deg;
            }
            else
            {
                camera.fieldOfView = 2.0f * Mathf.Atan2(vx * gameViewSize.y / gameViewSize.x, vz) * Mathf.Rad2Deg;
            }

            viewCameraObject.transform.localPosition = cameraObjects[0].transform.localPosition;
            viewCameraObject.transform.localRotation = cameraObjects[0].transform.localRotation;
        }
Example #3
0
        // Get target pose for camera transform (When world center mode is TARGET)
        internal Matrix4x4 GetTargetPose()
        {
            NativeAPI.maxst_Trackable_getPose(cPtr, glPoseMatrix);

            return(MatrixUtils.GetUnityPoseMatrix(glPoseMatrix));
        }