@@ -1103,7 +1103,35 @@ function initialize() {
1103
1103
setCanvasSize ( canvas , g . globals . width , g . globals . height ) ;
1104
1104
}
1105
1105
1106
- function render ( elapsedTime , projectionMatrix , viewMatrix ) {
1106
+ function calculateViewMatrix ( viewMatrix , q , v ) {
1107
+ // According to webvr 1.1 spec, orientation is a quaternion.
1108
+ // 1. normalize orientation quaternion.
1109
+ var normFactor = Math . sqrt ( Math . pow ( q [ 0 ] , 2 ) + Math . pow ( q [ 1 ] , 2 ) + Math . pow ( q [ 2 ] , 2 ) + Math . pow ( q [ 3 ] , 2 ) ) ;
1110
+ var b = q [ 0 ] / normFactor ;
1111
+ var c = q [ 1 ] / normFactor ;
1112
+ var d = q [ 2 ] / normFactor ;
1113
+ var a = q [ 3 ] / normFactor ;
1114
+
1115
+ //2. calculate rotation matrix and combine transform vector to generate view matrix.
1116
+ viewMatrix [ 0 ] = Math . pow ( a , 2 ) + Math . pow ( b , 2 ) - Math . pow ( c , 2 ) - Math . pow ( d , 2 ) ;
1117
+ viewMatrix [ 1 ] = 2 * b * c + 2 * a * d ;
1118
+ viewMatrix [ 2 ] = 2 * b * d - 2 * a * c ;
1119
+ viewMatrix [ 3 ] = 0 ;
1120
+ viewMatrix [ 4 ] = 2 * b * c - 2 * a * d ;
1121
+ viewMatrix [ 5 ] = Math . pow ( a , 2 ) - Math . pow ( b , 2 ) + Math . pow ( c , 2 ) - Math . pow ( d , 2 ) ;
1122
+ viewMatrix [ 6 ] = 2 * c * d + 2 * a * b ;
1123
+ viewMatrix [ 7 ] = 0 ;
1124
+ viewMatrix [ 8 ] = 2 * b * d + 2 * a * c ;
1125
+ viewMatrix [ 9 ] = 2 * c * d - 2 * a * b ;
1126
+ viewMatrix [ 10 ] = Math . pow ( a , 2 ) - Math . pow ( b , 2 ) - Math . pow ( c , 2 ) + Math . pow ( d , 2 ) ;
1127
+ viewMatrix [ 11 ] = 0 ;
1128
+ viewMatrix [ 12 ] = v [ 0 ] ;
1129
+ viewMatrix [ 13 ] = v [ 1 ] ;
1130
+ viewMatrix [ 14 ] = v [ 2 ] ;
1131
+ viewMatrix [ 15 ] = 1 ;
1132
+ }
1133
+
1134
+ function render ( elapsedTime , projectionMatrix , pose ) {
1107
1135
/*
1108
1136
var now = theClock.getTime();
1109
1137
var elapsedTime;
@@ -1151,12 +1179,6 @@ function initialize() {
1151
1179
clock += elapsedTime * g . globals . speed ;
1152
1180
eyeClock += elapsedTime * g . globals . eyeSpeed ;
1153
1181
}
1154
- eyePosition [ 0 ] = Math . sin ( eyeClock ) * g . globals . eyeRadius ;
1155
- eyePosition [ 1 ] = g . globals . eyeHeight ;
1156
- eyePosition [ 2 ] = Math . cos ( eyeClock ) * g . globals . eyeRadius ;
1157
- target [ 0 ] = Math . sin ( eyeClock + Math . PI ) * g . globals . targetRadius ;
1158
- target [ 1 ] = g . globals . targetHeight ;
1159
- target [ 2 ] = Math . cos ( eyeClock + Math . PI ) * g . globals . targetRadius ;
1160
1182
1161
1183
ambient [ 0 ] = g . globals . ambientRed ;
1162
1184
ambient [ 1 ] = g . globals . ambientGreen ;
@@ -1179,9 +1201,15 @@ function initialize() {
1179
1201
var height = Math . abs ( top - bottom ) ;
1180
1202
var xOff = width * g . net . offset [ 0 ] * g . net . offsetMult ;
1181
1203
var yOff = height * g . net . offset [ 1 ] * g . net . offsetMult ;
1182
- if ( g_vrDisplay && g_vrDisplay . isPresenting ) {
1204
+ if ( g_vrDisplay && g_vrDisplay . isPresenting && pose . position ) {
1205
+ // Using head-neck model in VR mode due to unclear distance measurement(vr return position using meters),
1206
+ // user could see around but couldn't move around.
1207
+ eyePosition [ 0 ] = g . globals . eyeRadius ;
1208
+ eyePosition [ 1 ] = g . globals . eyeHeight ;
1209
+ eyePosition [ 2 ] = g . globals . eyeRadius ;
1210
+
1183
1211
fast . matrix4 . copy ( projection , projectionMatrix ) ;
1184
- fast . matrix4 . inverse ( viewInverse , viewMatrix ) ;
1212
+ calculateViewMatrix ( viewInverse , pose . orientation , eyePosition ) ;
1185
1213
} else {
1186
1214
fast . matrix4 . frustum (
1187
1215
projection ,
@@ -1192,6 +1220,13 @@ function initialize() {
1192
1220
near ,
1193
1221
far ) ;
1194
1222
1223
+ eyePosition [ 0 ] = Math . sin ( eyeClock ) * g . globals . eyeRadius ;
1224
+ eyePosition [ 1 ] = g . globals . eyeHeight ;
1225
+ eyePosition [ 2 ] = Math . cos ( eyeClock ) * g . globals . eyeRadius ;
1226
+ target [ 0 ] = Math . sin ( eyeClock + Math . PI ) * g . globals . targetRadius ;
1227
+ target [ 1 ] = g . globals . targetHeight ;
1228
+ target [ 2 ] = Math . cos ( eyeClock + Math . PI ) * g . globals . targetRadius ;
1229
+
1195
1230
fast . matrix4 . cameraLookAt (
1196
1231
viewInverse ,
1197
1232
eyePosition ,
@@ -1634,10 +1669,10 @@ function initialize() {
1634
1669
g_vrDisplay . getFrameData ( g_frameData ) ;
1635
1670
if ( g_vrDisplay . isPresenting ) {
1636
1671
gl . viewport ( 0 , 0 , canvas . width * 0.5 , canvas . height ) ;
1637
- render ( elapsedTime , g_frameData . leftProjectionMatrix , g_frameData . leftViewMatrix ) ;
1672
+ render ( elapsedTime , g_frameData . leftProjectionMatrix , g_frameData . pose ) ;
1638
1673
1639
1674
gl . viewport ( canvas . width * 0.5 , 0 , canvas . width * 0.5 , canvas . height ) ;
1640
- render ( elapsedTime , g_frameData . rightProjectionMatrix , g_frameData . rightViewMatrix ) ;
1675
+ render ( elapsedTime , g_frameData . rightProjectionMatrix , g_frameData . pose ) ;
1641
1676
1642
1677
g_vrDisplay . submitFrame ( ) ;
1643
1678
} else {
0 commit comments