Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Esguerra Montana
Web AR
Commits
74e48dbc
Commit
74e48dbc
authored
Jun 16, 2024
by
Esguerra Montana
Browse files
Update index.html
parent
0b9d5be5
Pipeline
#9423
passed with stage
in 8 seconds
Changes
1
Pipelines
1
Show whitespace changes
Inline
Side-by-side
public/index.html
View file @
74e48dbc
...
...
@@ -4,7 +4,7 @@
<meta
charset=
"UTF-8"
>
<meta
name=
"viewport"
content=
"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
>
<title>
T
orus
Demo
</title>
<title>
T
etrahedron
Demo
</title>
<!-- three.js -->
<script
src=
"https://unpkg.com/three@0.126.0/build/three.js"
></script>
...
...
@@ -13,7 +13,7 @@
<!-- Starting an immersive WebXR session requires user interaction.
We start this one with a simple button. -->
<button
onclick=
"activateXR()"
>
Start T
orus
</button>
<button
onclick=
"activateXR()"
>
Start T
etrahedron
</button>
<script>
async
function
activateXR
()
{
// Add a canvas element and initialize a WebGL context that is compatible with WebXR.
...
...
@@ -23,48 +23,58 @@ async function activateXR() {
const
scene
=
new
THREE
.
Scene
();
// Color of the torus geometry.
const
material
=
new
THREE
.
MeshPhysicalMaterial
({
color
:
0xff0000
,
roughness
:
0.5
,
metalness
:
0.5
,
clearcoat
:
1.0
,
clearcoatRoughness
:
0.1
});
// Add lighting to the scene
const
light
=
new
THREE
.
DirectionalLight
(
0xffffff
,
1
);
light
.
position
.
set
(
1
,
1
,
1
).
normalize
();
scene
.
add
(
light
);
// Create the torus and add it to the demo scene.
const
torus
=
new
THREE
.
Mesh
(
new
THREE
.
TetrahedronGeometry
(
1
),
material
);
//position the next geometry (sphere)
torus
.
position
.
set
(
0
,
0
,
-
1
);
// Add the mesh to the scene
scene
.
add
(
torus
);
const
ambientLight
=
new
THREE
.
AmbientLight
(
0x404040
);
// soft white light
scene
.
add
(
ambientLight
);
// Set up the WebGLRenderer, which handles rendering to the session's base layer.
const
renderer
=
new
THREE
.
WebGLRenderer
({
// Color of the tetrahedron geometry.
const
material
=
new
THREE
.
MeshPhysicalMaterial
({
color
:
0xff0000
,
roughness
:
0.5
,
metalness
:
0.5
,
clearcoat
:
1.0
,
clearcoatRoughness
:
0.1
});
// Create the tetrahedron and add it to the demo scene.
const
tetrahedron
=
new
THREE
.
Mesh
(
new
THREE
.
TetrahedronGeometry
(
1
),
material
);
// Position the tetrahedron
tetrahedron
.
position
.
set
(
0
,
0
,
-
1
);
// Add the mesh to the scene
scene
.
add
(
tetrahedron
);
// Set up the WebGLRenderer, which handles rendering to the session's base layer.
const
renderer
=
new
THREE
.
WebGLRenderer
({
alpha
:
true
,
preserveDrawingBuffer
:
true
,
canvas
:
canvas
,
context
:
gl
});
renderer
.
autoClear
=
false
;
// The API directly updates the camera matrices.
// Disable matrix auto updates so three.js doesn't attempt
// to handle the matrices independently.
const
camera
=
new
THREE
.
PerspectiveCamera
();
camera
.
matrixAutoUpdate
=
false
;
// Initialize a WebXR session using "immersive-ar".
const
session
=
await
navigator
.
xr
.
requestSession
(
"
immersive-ar
"
);
session
.
updateRenderState
({
});
renderer
.
autoClear
=
false
;
// The API directly updates the camera matrices.
// Disable matrix auto updates so three.js doesn't attempt
// to handle the matrices independently.
const
camera
=
new
THREE
.
PerspectiveCamera
();
camera
.
matrixAutoUpdate
=
false
;
// Initialize a WebXR session using "immersive-ar".
const
session
=
await
navigator
.
xr
.
requestSession
(
"
immersive-ar
"
);
session
.
updateRenderState
({
baseLayer
:
new
XRWebGLLayer
(
session
,
gl
)
});
});
// 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
'
);
// 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
'
);
// Create a render loop that allows us to draw on the AR view.
const
onXRFrame
=
(
time
,
frame
)
=>
{
// 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
)
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.
...
...
@@ -74,19 +84,18 @@ const onXRFrame = (time, frame) => {
const
view
=
pose
.
views
[
0
];
const
viewport
=
session
.
renderState
.
baseLayer
.
getViewport
(
view
);
renderer
.
setSize
(
viewport
.
width
,
viewport
.
height
)
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
.
matrix
.
fromArray
(
view
.
transform
.
matrix
)
;
camera
.
projectionMatrix
.
fromArray
(
view
.
projectionMatrix
);
camera
.
updateMatrixWorld
(
true
);
// Render the scene with THREE.WebGLRenderer.
renderer
.
render
(
scene
,
camera
)
renderer
.
render
(
scene
,
camera
)
;
}
}
session
.
requestAnimationFrame
(
onXRFrame
);
};
session
.
requestAnimationFrame
(
onXRFrame
);
}
</script>
</body>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment