Skip to content

Commit 5154822

Browse files
committed
fix: xr layer transform rotation
1 parent a6164a6 commit 5154822

File tree

5 files changed

+32
-11
lines changed

5 files changed

+32
-11
lines changed

examples/layers/app.tsx

+10-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,15 @@ export function App() {
3535
32x32 XRLayer with DPR=32
3636
</Text>
3737
<XROrigin position={[0, -1.5, 0]} />
38-
<XRLayer dpr={32} pixelWidth={32} pixelHeight={32} position={[-0.6, 0, -0.5]} scale={0.5} shape="quad">
38+
<XRLayer
39+
rotation-y={Math.PI / 16}
40+
dpr={32}
41+
pixelWidth={32}
42+
pixelHeight={32}
43+
position={[-0.6, 0, -0.5]}
44+
scale={0.5}
45+
shape="quad"
46+
>
3947
<mesh>
4048
<boxGeometry />
4149
<meshBasicMaterial color="red" toneMapped={false} />
@@ -50,7 +58,7 @@ export function App() {
5058
<Text scale={0.03} color="black" position={[0.6, 0.28, -0.5]}>
5159
Without XRLayer
5260
</Text>
53-
<mesh position={[0.6, 0, -0.5]} scale={0.5}>
61+
<mesh rotation-y={-Math.PI / 16} position={[0.6, 0, -0.5]} scale={0.5}>
5462
<planeGeometry />
5563
<meshBasicMaterial map={videoTexture} toneMapped={false} />
5664
</mesh>

packages/xr/src/anchor.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Matrix4, Quaternion, Vector3 } from 'three'
22
import { XRStore } from './store.js'
3+
import { toDOMPointInit } from './utils.js'
34

45
const OneVector = new Vector3(1, 1, 1)
56
const ZeroVector = new Vector3(0, 0, 0)
@@ -84,10 +85,7 @@ export type XRAnchorSpaceOptions = {
8485
export async function requestXRAnchor(store: XRStore<any>, options: XRAnchorOptions): Promise<XRAnchor | undefined> {
8586
if (options.relativeTo === 'hit-test-result') {
8687
return options.hitTestResult.createAnchor?.(
87-
new XRRigidTransform(
88-
options.offsetPosition == null ? undefined : { ...options.offsetPosition, w: 1 },
89-
options.offsetQuaternion == null ? undefined : { ...options.offsetQuaternion },
90-
),
88+
new XRRigidTransform(toDOMPointInit(options.offsetPosition), toDOMPointInit(options.offsetQuaternion)),
9189
)
9290
}
9391
let frame: XRFrame
@@ -118,5 +116,8 @@ export async function requestXRAnchor(store: XRStore<any>, options: XRAnchorOpti
118116
positionHelper.copy(offsetPosition ?? ZeroVector)
119117
quaternionHelper.copy(offsetQuaternion ?? NeutralQuaternion)
120118
}
121-
return frame.createAnchor?.(new XRRigidTransform({ ...positionHelper, w: 1 }, { ...quaternionHelper }), space)
119+
return frame.createAnchor?.(
120+
new XRRigidTransform(toDOMPointInit(positionHelper), toDOMPointInit(quaternionHelper)),
121+
space,
122+
)
122123
}

packages/xr/src/hit-test.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Matrix4, Object3D, Quaternion, Vector3 } from 'three'
22
import { getSpaceFromAncestors, XRStore } from './internals.js'
3+
import { toDOMPointInit } from './utils.js'
34

45
const matrixHelper = new Matrix4()
56
const vectorHelper = new Vector3()
@@ -40,11 +41,10 @@ export async function createXRHitTestSource(
4041

4142
//compute offset ray
4243
vectorHelper.setFromMatrixPosition(matrixHelper)
43-
const point: DOMPointInit = { ...vectorHelper }
44+
const point = toDOMPointInit(vectorHelper)
4445
quaternionHelper.setFromRotationMatrix(matrixHelper)
4546
vectorHelper.set(0, 0, -1).applyQuaternion(quaternionHelper)
46-
const direction: DOMPointInit = { ...vectorHelper }
47-
const offsetRay = new XRRay(point, direction)
47+
const offsetRay = new XRRay(point, toDOMPointInit(vectorHelper, 0))
4848

4949
//configure for request and compute hit test results
5050
object = relativeTo

packages/xr/src/layer.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
} from 'three'
1919
import { getSpaceFromAncestors } from './space.js'
2020
import { XRState, XRStore } from './store.js'
21+
import { toDOMPointInit } from './utils.js'
2122

2223
export type XRLayerEntry = { renderOrder: number; readonly layer: XRCylinderLayer | XRQuadLayer | XREquirectLayer }
2324

@@ -134,7 +135,7 @@ const scaleHelper = new Vector3()
134135

135136
function matrixToRigidTransform(matrix: Matrix4, scaleTarget: Vector3 = scaleHelper): XRRigidTransform {
136137
matrix.decompose(vectorHelper, quaternionHelper, scaleTarget)
137-
return new XRRigidTransform({ ...vectorHelper, w: 1.0 }, { ...quaternionHelper })
138+
return new XRRigidTransform(toDOMPointInit(vectorHelper), toDOMPointInit(quaternionHelper))
138139
}
139140

140141
declare module 'three' {

packages/xr/src/utils.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { Quaternion, Vector3 } from 'three'
2+
3+
export function toDOMPointInit(
4+
value: Vector3 | Quaternion | undefined,
5+
defaultW: number = 1,
6+
): DOMPointInit | undefined {
7+
if (value == null) {
8+
return undefined
9+
}
10+
return { x: value.x, y: value.y, z: value.z, w: 'w' in value ? value.w : defaultW }
11+
}

0 commit comments

Comments
 (0)