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