diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/OculusVR.java b/jme3-vr/src/main/java/com/jme3/input/vr/OculusVR.java index 513d725a3..ad7ca2d79 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/OculusVR.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/OculusVR.java @@ -26,6 +26,13 @@ import static org.lwjgl.system.MemoryUtil.*; /** * Oculus VR (LibOVR 1.3.0) Native support. + *

+ * A few notes about the Oculus coordinate system: + *

* * @author Campbell Suter */ @@ -219,7 +226,6 @@ public class OculusVR implements VRAPI { System.out.println("step 5 - projections"); for (int eye = 0; eye < 2; eye++) { projections[eye] = OVRMatrix4f.malloc(); - OVRUtil.ovrMatrix4f_Projection(fovPorts[eye], 0.5f, 500f, OVRUtil.ovrProjection_None, projections[eye]); //1.3 was right handed, now none flag } @@ -332,7 +338,7 @@ public class OculusVR implements VRAPI { @Override public Quaternion getOrientation() { - return quatO2J(headPose.Orientation(), new Quaternion()); + return quatO2J(headPose.Orientation(), new Quaternion()).inverseLocal(); } @Override @@ -342,18 +348,31 @@ public class OculusVR implements VRAPI { @Override public void getPositionAndOrientation(Vector3f storePos, Quaternion storeRot) { - vecO2J(headPose.Position(), storePos); - quatO2J(headPose.Orientation(), storeRot); + storePos.set(getPosition()); + storeRot.set(getOrientation()); + } + + private Matrix4f calculateProjection(int eye, Camera cam) { + Matrix4f mat = new Matrix4f(); + + // Get LibOVR to find the correct projection + OVRUtil.ovrMatrix4f_Projection(fovPorts[eye], cam.getFrustumNear(), cam.getFrustumFar(), OVRUtil.ovrProjection_None, projections[eye]); + + matrixO2J(projections[eye], mat); + + mat.transposeLocal(); // Apparently LibOVR has a different coordinate set - yay for us. + + return mat; } @Override public Matrix4f getHMDMatrixProjectionLeftEye(Camera cam) { - return matrixO2J(projections[ovrEye_Left], new Matrix4f()); + return calculateProjection(ovrEye_Left, cam); } @Override public Matrix4f getHMDMatrixProjectionRightEye(Camera cam) { - return matrixO2J(projections[ovrEye_Right], new Matrix4f()); + return calculateProjection(ovrEye_Right, cam); } @Override @@ -612,6 +631,10 @@ public class OculusVR implements VRAPI { return layer0; } + public OVRFovPort getFovPort() { + return fovPorts[ovrEye_Left]; // TODO checking the left and right eyes match + } + public OVRPosef[] getEyePosesPtr() { return eyePosesPtr; } diff --git a/jme3-vr/src/main/java/com/jme3/util/VRViewManagerOculus.java b/jme3-vr/src/main/java/com/jme3/util/VRViewManagerOculus.java index fba104238..2bd756d9c 100644 --- a/jme3-vr/src/main/java/com/jme3/util/VRViewManagerOculus.java +++ b/jme3-vr/src/main/java/com/jme3/util/VRViewManagerOculus.java @@ -34,10 +34,7 @@ package com.jme3.util; import com.jme3.app.VREnvironment; import com.jme3.input.vr.OculusVR; import com.jme3.input.vr.VRAPI; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; +import com.jme3.math.*; import com.jme3.renderer.Camera; import com.jme3.renderer.ViewPort; import com.jme3.scene.Spatial; @@ -213,16 +210,14 @@ public class VRViewManagerOculus extends AbstractVRViewManager { // restore frustrum on distortion scene cam, if needed if (environment.isInstanceRendering()) { leftCamera = origCam; - } else if (environment.compositorAllowed() == false) { - origCam.setFrustumFar(100f); - origCam.setFrustumNear(1f); - leftCamera = origCam.clone(); - prepareCameraSize(origCam, 2f); } else { leftCamera = origCam.clone(); } - getLeftCamera().setFrustumPerspective(environment.getDefaultFOV(), environment.getDefaultAspect(), fNear, fFar); + OVRFovPort fp = hardware.getFovPort(); + float hFov = fp.LeftTan() + fp.RightTan(); + float vFov = fp.UpTan() + fp.DownTan(); + getLeftCamera().setFrustumPerspective(hFov / FastMath.TWO_PI * 360, vFov / hFov, fNear, fFar); prepareCameraSize(getLeftCamera(), 1f); if (environment.getVRHardware() != null) { @@ -238,33 +233,13 @@ public class VRViewManagerOculus extends AbstractVRViewManager { } rightViewPort = setupViewBuffers(getRightCamera(), RIGHT_VIEW_NAME); } else if (environment.getApplication() != null) { - - LOG.severe("THIS CODE NEED CHANGES !!!"); - leftViewPort = environment.getApplication().getViewPort(); - //leftViewport.attachScene(app.getRootNode()); - rightCamera = getLeftCamera().clone(); - if (environment.getVRHardware() != null) { - getRightCamera().setProjectionMatrix(environment.getVRHardware().getHMDMatrixProjectionRightEye(getRightCamera())); - } - - org.lwjgl.opengl.GL11.glEnable(org.lwjgl.opengl.GL30.GL_CLIP_DISTANCE0); - - //FIXME: [jme-vr] Fix with JMonkey next release - //RenderManager._VRInstancing_RightCamProjection = camRight.getViewProjectionMatrix(); - // TODO: Add LibOVR support - // setupFinalFullTexture(environment.getApplication().getViewPort().getCamera()); + throw new UnsupportedOperationException("Not yet implemented!"); } else { throw new IllegalStateException("This VR environment is not attached to any application."); } // setup gui environment.getVRGUIManager().setupGui(getLeftCamera(), getRightCamera(), getLeftViewPort(), getRightViewPort()); - - if (environment.getVRHardware() != null) { - // call these to cache the results internally - environment.getVRHardware().getHMDMatrixPoseLeftEye(); - environment.getVRHardware().getHMDMatrixPoseRightEye(); - } } else { throw new IllegalStateException("This VR view manager is not attached to any VR environment."); }