index.html 3.68 KB
Newer Older
Rafiei's avatar
Rafiei committed
1
<!doctype html>
GitLab's avatar
GitLab committed
2
<html>
Rafiei's avatar
Rafiei committed
3

Rafiei's avatar
Rafiei committed
4
5
6
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
Rafiei's avatar
Rafiei committed
7
8
    content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <title>Cube Demo</title>
GitLab's avatar
GitLab committed
9

Rafiei's avatar
Rafiei committed
10
11
12
  <!-- three.js -->
  <script src="https://unpkg.com/three@0.126.0/build/three.js"></script>
</head>
Rafiei's avatar
Rafiei committed
13

Rafiei's avatar
Rafiei committed
14
<body>
GitLab's avatar
GitLab committed
15

Rafiei's avatar
Rafiei committed
16
  <!-- Starting an immersive WebXR session requires user interaction.
Rafiei's avatar
Rafiei committed
17
    We start this one with a simple button. -->
Rafiei's avatar
Rafiei committed
18
19
20
  <button onclick="activateXR()">Start Cube Demo</button>
  <script>
    async function activateXR() {
Rafiei's avatar
Rafiei committed
21
22
23
24
  // Add a canvas element and initialize a WebGL context that is compatible with WebXR.
  const canvas = document.createElement("canvas");
  document.body.appendChild(canvas);
  const gl = canvas.getContext("webgl", {xrCompatible: true});
GitLab's avatar
GitLab committed
25

Rafiei's avatar
Rafiei committed
26
27
  const scene = new THREE.Scene();

Rafiei's avatar
Rafiei committed
28
29


Rafiei's avatar
Rafiei committed
30
31
// Enable shadows in the renderer.
renderer.shadowMap.enabled = true;
Rafiei's avatar
Rafiei committed
32

Rafiei's avatar
Rafiei committed
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Create the cube and add it to the demo scene.
const cubeGeometry = new THREE.BoxBufferGeometry(0.5, 0.5, 0.5);
const cubeMaterials = [
  new THREE.MeshLambertMaterial({ color: 0xff0000 }), // Red
  new THREE.MeshLambertMaterial({ color: 0x0000ff }), // Blue
  new THREE.MeshLambertMaterial({ color: 0x00ff00 }), // Green
  new THREE.MeshLambertMaterial({ color: 0xff00ff }), // Magenta
  new THREE.MeshLambertMaterial({ color: 0x00ffff }), // Cyan
  new THREE.MeshLambertMaterial({ color: 0xffff00 })  // Yellow
 ];
 const cube = new THREE.Mesh(cubeGeometry, cubeMaterials);
 cube.position.set(0, 0, -1);
 cube.castShadow = true; // Enable shadow casting
 scene.add(cube);
Rafiei's avatar
Rafiei committed
47
48


Rafiei's avatar
Rafiei committed
49
50
// // Create a sphere geometry.
const sphereGeometry = new THREE.SphereBufferGeometry(0.3, 32, 32); // Adjust the radius and other parameters as needed.
Rafiei's avatar
Rafiei committed
51

Rafiei's avatar
Rafiei committed
52
53
// // Create a material for the sphere (you can customize the color).
const sphereMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 });
Rafiei's avatar
Rafiei committed
54

Rafiei's avatar
Rafiei committed
55
56
57
58
// // Create the sphere and add it to the scene.
const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
sphere.position.set(1, 0, -1); // Position the sphere next to the cube.
scene.add(sphere);
Rafiei's avatar
Rafiei committed
59

Rafiei's avatar
Rafiei committed
60
const scene = new THREE.Scene();
Rafiei's avatar
Rafiei committed
61

Rafiei's avatar
Rafiei committed
62
63
64
65
66
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.3);
directionalLight.position.set(10, 15, 10);
scene.add(directionalLight);

const session = await navigator.xr.requestSession("immersive-ar", {requiredFeatures: ['hit-test']});
Rafiei's avatar
Rafiei committed
67
session.updateRenderState({
Rafiei's avatar
Rafiei committed
68
  baseLayer: new XRWebGLLayer(session, gl)
Rafiei's avatar
Rafiei committed
69
});
Rafiei's avatar
Rafiei committed
70

Rafiei's avatar
Rafiei committed
71
72
73
// A 'local' reference space has a native origin that is located
// near the viewer's position at the time the session was created.
const referenceSpace = await session.requestReferenceSpace('local');
Rafiei's avatar
Rafiei committed
74

Rafiei's avatar
Rafiei committed
75
76
// Create a render loop that allows us to draw on the AR view.
const onXRFrame = (time, frame) => {
Rafiei's avatar
Rafiei committed
77
78
79
80
81
82
83
84
85
86
  // 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) {
Rafiei's avatar
Rafiei committed
87
88
    // In mobile AR, we only have one view.
    const view = pose.views[0];
Rafiei's avatar
Rafiei committed
89

Rafiei's avatar
Rafiei committed
90
91
    const viewport = session.renderState.baseLayer.getViewport(view);
    renderer.setSize(viewport.width, viewport.height)
Rafiei's avatar
Rafiei committed
92

Rafiei's avatar
Rafiei committed
93
94
95
96
    // 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);
Rafiei's avatar
Rafiei committed
97

Rafiei's avatar
Rafiei committed
98
99
    // Render the scene with THREE.WebGLRenderer.
    renderer.render(scene, camera)
Rafiei's avatar
Rafiei committed
100
  }
Rafiei's avatar
Rafiei committed
101
102
}
session.requestAnimationFrame(onXRFrame);
Rafiei's avatar
Rafiei committed
103
104


Rafiei's avatar
Rafiei committed
105

Rafiei's avatar
Rafiei committed
106
}
Rafiei's avatar
Rafiei committed
107
  </script>
Rafiei's avatar
Rafiei committed
108
</body>
Rafiei's avatar
Rafiei committed
109

Rafiei's avatar
Rafiei committed
110
</html>