Skip to content

Commit f4b1b70

Browse files
authored
Merge pull request #118 from De-Panther/view_eye_none_bug_fix
Fixed bug related to pose view eye can be `none`
2 parents 0758ab6 + c3f67ef commit f4b1b70

File tree

6 files changed

+49
-34
lines changed

6 files changed

+49
-34
lines changed

Build/Build/Build.data.unityweb

233 Bytes
Binary file not shown.

Build/Build/Build.wasm

-741 Bytes
Binary file not shown.

Build/Build/Build.wasm.framework.unityweb

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

Packages/webxr/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1515
- Camera matrices handling.
1616
- WebGLTemplates webxr.js merged into Plugins webxr.jspre.
1717

18+
### Fixed
19+
- Bug related to pose view eye can be `none`.
20+
1821
### Removed
1922
- Matrix utilities files.
2023

Packages/webxr/Runtime/Plugins/WebGL/webxr.jspre

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,10 @@ setTimeout(function () {
3131
0, 1, 0, 0,
3232
0, 0, 1, 0,
3333
0, 0, 0, 1];
34-
this.leftViewMatrix = [1, 0, 0, 0,
35-
0, 1, 0, 0,
36-
0, 0, 1, 0,
37-
0, 0, 0, 1];
38-
this.rightViewMatrix = [1, 0, 0, 0,
39-
0, 1, 0, 0,
40-
0, 0, 1, 0,
41-
0, 0, 0, 1];
34+
this.leftViewRotation = [0, 0, 0, 1];
35+
this.rightViewRotation = [0, 0, 0, 1];
36+
this.leftViewPosition = [0, 0, 0];
37+
this.rightViewPosition = [0, 0, 0];
4238
this.gamepads = [];
4339
this.controllerA = new XRControllerData();
4440
this.controllerB = new XRControllerData();
@@ -829,20 +825,24 @@ setTimeout(function () {
829825

830826
for (var i = 0; i < pose.views.length; i++) {
831827
var view = pose.views[i];
832-
if (view.eye === 'left') {
828+
if (view.eye === "left" || view.eye === "none") {
833829
xrData.leftProjectionMatrix = view.projectionMatrix;
834-
xrData.leftViewMatrix = view.transform.matrix;
835-
xrData.leftViewMatrix[6] *= -1;
836-
xrData.leftViewMatrix[8] *= -1;
837-
xrData.leftViewMatrix[9] *= -1;
838-
xrData.leftViewMatrix[14] *= -1;
830+
xrData.leftViewRotation[0] = -view.transform.orientation.x;
831+
xrData.leftViewRotation[1] = -view.transform.orientation.y;
832+
xrData.leftViewRotation[2] = view.transform.orientation.z;
833+
xrData.leftViewRotation[3] = view.transform.orientation.w;
834+
xrData.leftViewPosition[0] = view.transform.position.x;
835+
xrData.leftViewPosition[1] = view.transform.position.y;
836+
xrData.leftViewPosition[2] = -view.transform.position.z;
839837
} else if (view.eye === 'right') {
840838
xrData.rightProjectionMatrix = view.projectionMatrix;
841-
xrData.rightViewMatrix = view.transform.matrix;
842-
xrData.rightViewMatrix[6] *= -1;
843-
xrData.rightViewMatrix[8] *= -1;
844-
xrData.rightViewMatrix[9] *= -1;
845-
xrData.rightViewMatrix[14] *= -1;
839+
xrData.rightViewRotation[0] = -view.transform.orientation.x;
840+
xrData.rightViewRotation[1] = -view.transform.orientation.y;
841+
xrData.rightViewRotation[2] = view.transform.orientation.z;
842+
xrData.rightViewRotation[3] = view.transform.orientation.w;
843+
xrData.rightViewPosition[0] = view.transform.position.x;
844+
xrData.rightViewPosition[1] = view.transform.position.y;
845+
xrData.rightViewPosition[2] = -view.transform.position.z;
846846
}
847847
}
848848

@@ -890,8 +890,10 @@ setTimeout(function () {
890890
document.dispatchEvent(new CustomEvent('XRData', { detail: {
891891
leftProjectionMatrix: xrData.leftProjectionMatrix,
892892
rightProjectionMatrix: xrData.rightProjectionMatrix,
893-
leftViewMatrix: xrData.leftViewMatrix,
894-
rightViewMatrix: xrData.rightViewMatrix
893+
leftViewRotation: xrData.leftViewRotation,
894+
rightViewRotation: xrData.rightViewRotation,
895+
leftViewPosition: xrData.leftViewPosition,
896+
rightViewPosition: xrData.rightViewPosition
895897
}}));
896898

897899
document.dispatchEvent(new CustomEvent('XRControllersData', { detail: {

Packages/webxr/Runtime/XRPlugin/WebXRSubsystem.cs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,11 @@ private void UpdateXRCameras()
135135
if (OnHeadsetUpdate != null && this.xrState != WebXRState.NORMAL)
136136
{
137137
GetMatrixFromSharedArray(0, ref leftProjectionMatrix);
138-
GetMatrixFromSharedArray(1, ref rightProjectionMatrix);
139-
GetMatrixFromSharedArray(2, ref leftViewMatrix);
140-
GetMatrixFromSharedArray(3, ref rightViewMatrix);
141-
leftPosition = leftViewMatrix.GetColumn(3);
142-
rightPosition = rightViewMatrix.GetColumn(3);
143-
leftRotation = Quaternion.LookRotation(leftViewMatrix.GetColumn(2), leftViewMatrix.GetColumn(1));
144-
rightRotation = Quaternion.LookRotation(rightViewMatrix.GetColumn(2), rightViewMatrix.GetColumn(1));
138+
GetMatrixFromSharedArray(16, ref rightProjectionMatrix);
139+
GetQuaternionFromSharedArray(32, ref leftRotation);
140+
GetQuaternionFromSharedArray(36, ref rightRotation);
141+
GetVector3FromSharedArray(40, ref leftPosition);
142+
GetVector3FromSharedArray(43, ref rightPosition);
145143

146144
OnHeadsetUpdate?.Invoke(
147145
leftProjectionMatrix,
@@ -234,16 +232,14 @@ public delegate void HeadsetUpdate(
234232
// Cameras calculations helpers
235233
private Matrix4x4 leftProjectionMatrix = new Matrix4x4();
236234
private Matrix4x4 rightProjectionMatrix = new Matrix4x4();
237-
private Matrix4x4 leftViewMatrix = new Matrix4x4();
238-
private Matrix4x4 rightViewMatrix = new Matrix4x4();
239235
private Vector3 leftPosition = new Vector3();
240236
private Vector3 rightPosition = new Vector3();
241237
private Quaternion leftRotation = Quaternion.identity;
242238
private Quaternion rightRotation = Quaternion.identity;
243239

244240
// Shared array which we will load headset data in from webxr.jslib
245-
// Array stores 5 matrices, each 16 values, stored linearly.
246-
float[] sharedArray = new float[4 * 16];
241+
// Array stores 2 matrices, each 16 values, 2 Quaternions and 2 Vector3, stored linearly.
242+
float[] sharedArray = new float[(2 * 16) + (2 * 7)];
247243

248244
// Shared array for controllers data
249245
float[] controllersArray = new float[2 * 20];
@@ -357,13 +353,27 @@ public void HapticPulse(WebXRControllerHand hand, float intensity, float duratio
357353

358354
void GetMatrixFromSharedArray(int index, ref Matrix4x4 matrix)
359355
{
360-
index = index * 16;
361356
for (int i = 0; i < 16; i++)
362357
{
363358
matrix[i] = sharedArray[index + i];
364359
}
365360
}
366361

362+
void GetQuaternionFromSharedArray(int index, ref Quaternion quaternion)
363+
{
364+
quaternion.x = sharedArray[index];
365+
quaternion.y = sharedArray[index + 1];
366+
quaternion.z = sharedArray[index + 2];
367+
quaternion.w = sharedArray[index + 3];
368+
}
369+
370+
void GetVector3FromSharedArray(int index, ref Vector3 vec3)
371+
{
372+
vec3.x = sharedArray[index];
373+
vec3.y = sharedArray[index + 1];
374+
vec3.z = sharedArray[index + 2];
375+
}
376+
367377
bool GetGamepadFromControllersArray(int controllerIndex, ref WebXRControllerData newControllerData)
368378
{
369379
int arrayPosition = controllerIndex * 20;

0 commit comments

Comments
 (0)