示例#1
0
        private Vector3 Screen2dToWorldPixel(Vector3 screenPosition, float depth)
        {
            Vector3 screenPositionViewport = new Vector3(0, 0, 0);

            screenPositionViewport.x = ((screenPosition.x / ScreenSize.x) - 0.5f) * 2;
            screenPositionViewport.y = ((screenPosition.y / ScreenSize.y) - 0.5f) * 2;
            screenPositionViewport.z = 0;

            Camera.main.ScreenToWorldPoint(new Vector3());

            Matrix4x4 mvpMatrix     = ProjectionMatrix * WorldToCameraMatrix;
            Vector3   worldPosition = mvpMatrix.inverse.MultiplyPoint(screenPositionViewport);

            Vector3 cameraObjPosition = WorldToCameraMatrix.GetColumn(3);

            cameraObjPosition = new Vector3(-cameraObjPosition.x, -cameraObjPosition.y, cameraObjPosition.z);

            var nearClipPlaneDepth  = Camera.main.nearClipPlane;
            var cameraPosition      = NearViewPortCoordinates.TopLeft + (NearViewPortCoordinates.XVector * ((screenPositionViewport.x + 1) / 2)) + (NearViewPortCoordinates.YVector * ((screenPositionViewport.y + 1) / 2));
            var cameraObjToViewport = cameraObjPosition - cameraPosition;


            Vector3 direction = worldPosition - cameraPosition;

            worldPosition = cameraPosition + (direction.normalized * (depth - cameraObjToViewport.magnitude));

            if (DEBUG_MODE)
            {
                Debug.Log("Entfernung: " + (worldPosition - cameraObjPosition).magnitude);
            }

            return(worldPosition);//worldPosition;
        }
示例#2
0
        protected override void SetWorldToCameraMatrix()
        {
            // NOTE : co - x; so - y; ca - z; sa - w;
            var oa = CalculatelongitudeLatitudeVector(position.X, position.Y);

            var po = new Vector3d(oa.x * oa.z, oa.y * oa.z, oa.w) * Radius;
            var px = new Vector3d(-oa.y, oa.x, 0.0);
            var py = new Vector3d(-oa.x * oa.w, -oa.y * oa.w, oa.z);
            var pz = new Vector3d(oa.x * oa.z, oa.y * oa.z, oa.w);

            // NOTE : ct - x; st - y; cp - z; sp - w;
            var tp = CalculatelongitudeLatitudeVector(position.Theta, position.Phi);

            Vector3d cx = px * tp.z + py * tp.w;
            Vector3d cy = (px * -1.0) * tp.w * tp.x + py * tp.z * tp.x + pz * tp.y;
            Vector3d cz = px * tp.w * tp.y - py * tp.z * tp.y + pz * tp.x;

            worldPosition = po + cz * position.Distance;

            if (worldPosition.Magnitude() < Radius + 10.0 + GroundHeight)
            {
                worldPosition = worldPosition.Normalized(Radius + 10.0 + GroundHeight);
            }

            worldPosition = worldPosition + Origin;

            Matrix4x4d view = new Matrix4x4d(cx.x, cx.y, cx.z, 0.0, cy.x, cy.y, cy.z, 0.0, cz.x, cz.y, cz.z, 0.0, 0.0, 0.0, 0.0, 1.0);

            WorldToCameraMatrix = view * Matrix4x4d.Translate(worldPosition * -1.0);

            //Flip first row to match Unity's winding order.
            WorldToCameraMatrix.m[0, 0] *= -1.0;
            WorldToCameraMatrix.m[0, 1] *= -1.0;
            WorldToCameraMatrix.m[0, 2] *= -1.0;
            WorldToCameraMatrix.m[0, 3] *= -1.0;

            CameraToWorldMatrix = WorldToCameraMatrix.Inverse();

            CameraComponent.worldToCameraMatrix = WorldToCameraMatrix.ToMatrix4x4();
            CameraComponent.transform.position  = worldPosition.ToVector3();
        }
示例#3
0
        protected virtual void SetWorldToCameraMatrix()
        {
            var po = GetLookAtPosition();
            var px = Vector3d.right;
            var py = Vector3d.up;
            var pz = Vector3d.forward;

            // NOTE : ct - x; st - y; cp - z; sp - w;
            var tp = CalculatelongitudeLatitudeVector(position.Theta, position.Phi);

            Vector3d cx = px * tp.z + py * tp.w;
            Vector3d cy = (px * -1.0) * tp.w * tp.x + py * tp.z * tp.x + pz * tp.y;
            Vector3d cz = px * tp.w * tp.y - py * tp.z * tp.y + pz * tp.x;

            worldPosition = po + cz * position.Distance;

            if (worldPosition.z < GroundHeight + 10.0)
            {
                worldPosition.z = GroundHeight + 10.0;
            }

            Matrix4x4d view = new Matrix4x4d(cx.x, cx.y, cx.z, 0.0, cy.x, cy.y, cy.z, 0.0, cz.x, cz.y, cz.z, 0.0, 0.0, 0.0, 0.0, 1.0);

            WorldToCameraMatrix = view * Matrix4x4d.Translate(worldPosition * -1.0);

            //Flip first row to match Unity's winding order.
            WorldToCameraMatrix.m[0, 0] *= -1.0;
            WorldToCameraMatrix.m[0, 1] *= -1.0;
            WorldToCameraMatrix.m[0, 2] *= -1.0;
            WorldToCameraMatrix.m[0, 3] *= -1.0;

            CameraToWorldMatrix = WorldToCameraMatrix.Inverse();

            CameraComponent.worldToCameraMatrix = WorldToCameraMatrix.ToMatrix4x4();
            CameraComponent.transform.position  = worldPosition.ToVector3();
        }