Commit b6e48247 authored by Alfakhori's avatar Alfakhori
Browse files

Update public/webXR/three.html

parent a80bfe64
Pipeline #7501 passed with stages
in 11 seconds
...@@ -16,81 +16,53 @@ ...@@ -16,81 +16,53 @@
<button onclick="activateXR()">Start Cube Demo</button> <button onclick="activateXR()">Start Cube Demo</button>
<script> <script>
async function activateXR() { async function activateXR() {
// Add a canvas element and initialize a WebGL context that is compatible with WebXR. // ------------------------------------------------
const canvas = document.createElement("canvas"); // BASIC SETUP
document.body.appendChild(canvas); // ------------------------------------------------
const gl = canvas.getContext("webgl", {xrCompatible: true});
// Create an empty scene
const scene = new THREE.Scene(); var scene = new THREE.Scene();
// The cube will have a different color on each side. // Create a basic perspective camera
const materials = [ var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
new THREE.MeshBasicMaterial({color: 0xff0000}), camera.position.z = 4;
new THREE.MeshBasicMaterial({color: 0x0000ff}),
new THREE.MeshBasicMaterial({color: 0x00ff00}), // Create a renderer with Antialiasing
new THREE.MeshBasicMaterial({color: 0xff00ff}), var renderer = new THREE.WebGLRenderer({antialias:true});
new THREE.MeshBasicMaterial({color: 0x00ffff}),
new THREE.MeshBasicMaterial({color: 0xffff00}) // Configure renderer clear color
]; renderer.setClearColor("#000000");
// Create the cube and add it to the demo scene. // Configure renderer size
const cube = new THREE.Mesh(new THREE.BoxBufferGeometry(0.5, 0.5, 0.5), materials); renderer.setSize( window.innerWidth, window.innerHeight );
cube.position.set(0, 0, -1);
scene.add(cube); // Append Renderer to DOM
document.body.appendChild( renderer.domElement );
// Set up the WebGLRenderer, which handles rendering to the session's base layer.
const renderer = new THREE.WebGLRenderer({ // ------------------------------------------------
alpha: true, // FUN STARTS HERE
preserveDrawingBuffer: true, // ------------------------------------------------
canvas: canvas,
context: gl // Create a Cube Mesh with basic material
}); var geometry = new THREE.BoxGeometry( 1, 1, 1 );
renderer.autoClear = false; var material = new THREE.MeshBasicMaterial( { color: "#433F81" } );
var cube = new THREE.Mesh( geometry, material );
// The API directly updates the camera matrices.
// Disable matrix auto updates so three.js doesn't attempt // Add cube to Scene
// to handle the matrices independently. scene.add( cube );
const camera = new THREE.PerspectiveCamera();
camera.matrixAutoUpdate = false; // Render Loop
var render = function () {
// Initialize a WebXR session using "immersive-ar". requestAnimationFrame( render );
const session = await navigator.xr.requestSession("immersive-ar");
session.updateRenderState({ cube.rotation.x += 0.01;
baseLayer: new XRWebGLLayer(session, gl) cube.rotation.y += 0.01;
});
// Render the scene
// A 'local' reference space has a native origin that is located renderer.render(scene, camera);
// near the viewer's position at the time the session was created. };
const referenceSpace = await session.requestReferenceSpace('local');
render();
// 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);
} }
</script> </script>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment