@@ -40,22 +40,46 @@ public class PGraphicsVR extends PGraphics3D {
40
40
public HeadTransform headTransform ;
41
41
public Eye eye ;
42
42
public int eyeType ;
43
- public float forwardX ;
44
- public float forwardY ;
45
- public float forwardZ ;
43
+ public float forwardX , forwardY , forwardZ ;
44
+ public float rightX , rightY , rightZ ;
45
+ public float upX , upY , upZ ;
46
46
47
47
private float [] forwardVector ;
48
+ private float [] rightVector ;
49
+ private float [] upVector ;
48
50
private Viewport eyeViewport ;
49
51
private float [] eyeView ;
50
52
private float [] eyePerspective ;
51
-
53
+ private PMatrix3D eyeMatrix ;
52
54
53
55
@ Override
54
56
protected PGL createPGL (PGraphicsOpenGL pg ) {
55
57
return new PGLES (pg );
56
58
}
57
59
58
60
61
+ public PMatrix3D getEyeMatrix () {
62
+ PMatrix3D mat = new PMatrix3D ();
63
+ mat .set (rightX , upX , forwardX , 0 ,
64
+ rightY , upY , forwardY , 0 ,
65
+ rightZ , upZ , forwardZ , 0 ,
66
+ 0 , 0 , 0 , 1 );
67
+ return mat ;
68
+ }
69
+
70
+
71
+ public PMatrix3D getEyeMatrix (PMatrix3D target ) {
72
+ if (target == null ) {
73
+ target = new PMatrix3D ();
74
+ }
75
+ target .set (rightX , upX , forwardX , 0 ,
76
+ rightY , upY , forwardY , 0 ,
77
+ rightZ , upZ , forwardZ , 0 ,
78
+ 0 , 0 , 0 , 1 );
79
+ return target ;
80
+ }
81
+
82
+
59
83
public PMatrix3D getObjectMatrix () {
60
84
PMatrix3D mat = new PMatrix3D ();
61
85
mat .set (modelviewInv );
@@ -74,6 +98,27 @@ public PMatrix3D getObjectMatrix(PMatrix3D target) {
74
98
}
75
99
76
100
101
+ public void setEyeTransform () {
102
+ eyeMatrix = getEyeMatrix (eyeMatrix );
103
+
104
+ // Erasing any previous transformation in modelview
105
+ modelview .set (camera );
106
+ modelview .translate (cameraX , cameraY , cameraZ );
107
+ modelview .apply (eyeMatrix );
108
+
109
+ // eyeMatrix is orthogonal, so taking the transpose inverts it.
110
+ eyeMatrix .transpose ();
111
+
112
+ // Applying the inverse of the previous transformations in the opposite order
113
+ // to compute the modelview inverse
114
+ modelviewInv .set (eyeMatrix );
115
+ modelviewInv .translate (-cameraX , -cameraY , -cameraZ );
116
+ modelviewInv .preApply (cameraInv );
117
+
118
+ updateProjmodelview ();
119
+ }
120
+
121
+
77
122
@ Override
78
123
public void beginDraw () {
79
124
super .beginDraw ();
@@ -200,9 +245,17 @@ protected void headTransform(HeadTransform ht) {
200
245
initVR ();
201
246
headTransform = ht ;
202
247
headTransform .getForwardVector (forwardVector , 0 );
203
- forwardX = forwardVector [0 ];
204
- forwardY = forwardVector [1 ];
205
- forwardZ = forwardVector [2 ];
248
+ headTransform .getRightVector (rightVector , 0 );
249
+ headTransform .getUpVector (upVector , 0 );
250
+ forwardX = forwardVector [0 ];
251
+ forwardY = forwardVector [1 ];
252
+ forwardZ = forwardVector [2 ];
253
+ rightX = rightVector [0 ];
254
+ rightY = rightVector [1 ];
255
+ rightZ = rightVector [2 ];
256
+ upX = upVector [0 ];
257
+ upY = upVector [1 ];
258
+ upZ = upVector [2 ];
206
259
}
207
260
208
261
@@ -218,6 +271,8 @@ protected void eyeTransform(Eye e) {
218
271
protected void initVR () {
219
272
if (!initialized ) {
220
273
forwardVector = new float [3 ];
274
+ rightVector = new float [3 ];
275
+ upVector = new float [3 ];
221
276
initialized = true ;
222
277
}
223
278
}
0 commit comments