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; }
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(); }
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(); }