diff --git a/public/index.html b/public/index.html
index 223e70a47e7ba0c3519913f00a98122ec5a9b730..4337bb06b5a71a1ca3ccf94f63b56259e37a050c 100644
--- a/public/index.html
+++ b/public/index.html
@@ -63,6 +63,35 @@ session.updateRenderState({
// near the viewer's position at the time the session was created.
const referenceSpace = await session.requestReferenceSpace('local');
+// Create a render loop that allows us to draw on the AR view.
+const onXRFrame = (time, frame) => {
+ // Queue up the next draw request.
+ session.requestAnimationFrame(onXRFrame);
+
+ // Bind the graphics framebuffer to the baseLayer's framebuffer
+ gl.bindFramebuffer(gl.FRAMEBUFFER, session.renderState.baseLayer.framebuffer)
+
+ // Retrieve the pose of the device.
+ // XRFrame.getViewerPose can return null while the session attempts to establish tracking.
+ const pose = frame.getViewerPose(referenceSpace);
+ if (pose) {
+ // In mobile AR, we only have one view.
+ const view = pose.views[0];
+
+ const viewport = session.renderState.baseLayer.getViewport(view);
+ renderer.setSize(viewport.width, viewport.height)
+
+ // Use the view's transform matrix and projection matrix to configure the THREE.camera.
+ camera.matrix.fromArray(view.transform.matrix)
+ camera.projectionMatrix.fromArray(view.projectionMatrix);
+ camera.updateMatrixWorld(true);
+
+ // Render the scene with THREE.WebGLRenderer.
+ renderer.render(scene, camera)
+ }
+}
+session.requestAnimationFrame(onXRFrame);
+
}