Skip to content

Commit a4b91bc

Browse files
authored
Add a mouse based cursor / raycaster and applies to the link traversal example (#2861)
1 parent 9bb9595 commit a4b91bc

File tree

14 files changed

+206
-25
lines changed

14 files changed

+206
-25
lines changed

docs/components/cursor.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ AFRAME.registerComponent('cursor-listener', {
8282
| downEvents | Array of additional events on the entity to *listen* to for triggering `mousedown` (e.g., `triggerdown` for vive-controls). | [] |
8383
| fuse | Whether cursor is fuse-based. | false on desktop, true on mobile |
8484
| fuseTimeout | How long to wait (in milliseconds) before triggering a fuse-based click event. | 1500 |
85+
| rayOrigin | Where the intersection ray is cast from (i.e.,entity or mouse) | entity
8586
| upEvents | Array of additional events on the entity to *listen* to for triggering `mouseup` (e.g., `trackpadup` for daydream-controls). | [] |
8687

8788
To further customize the cursor component, we configure the cursor's dependency

docs/components/raycaster.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ AFRAME.registerComponent('collider-check', {
5959
| origin | Vector3 coordinate of where the ray should originate from relative to the entity's origin. | 0, 0, 0 |
6060
| recursive | Checks all children of objects if set. Else only checks intersections with root objects. | true |
6161
| showLine | Whether or not to display the raycaster visually with the [line component][line]. | false |
62+
| useWorldCoordinates | Whether the raycaster origin and direction properties are specified in world coordinates.
63+
. | false |
6264

6365
## Events
6466

examples/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ <h2>Showcase</h2>
187187
<li><a href="showcase/composite/">Composite</a></li>
188188
<li><a href="showcase/curved-mockups/">Curved Mockups</a></li>
189189
<li><a href="showcase/dynamic-lights/">Dynamic Lights</a></li>
190+
<li><a href="showcase/link-traversal/">Link Traversal</a></li>
190191
<li><a href="showcase/tracked-controls/">Tracked Controls</a></li>
191192
<li><a href="showcase/shopping/">Shopping</a></li>
192193
<li><a href="showcase/spheres-and-fog/">Spheres and Fog</a></li>

examples/showcase/link-traversal/city.html

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,17 @@
66
<meta name="description" content="Links – A-Frame">
77
<script src="../../../dist/aframe-master.js"></script>
88
<script src="js/components/aframe-tooltip-component.js"></script>
9+
<script src="js/components/camera-position.js"></script>
910
<script src="js/components/ground.js"></script>
1011
<script src="js/components/link-controls.js"></script>
1112
<script src="shaders/skyGradient.js"></script>
1213
</head>
1314
<body>
14-
<a-scene fog="color: #241417; near: 0; far: 30;">
15+
<a-scene fog="color: #241417; near: 0; far: 30;" raycaster="far: 100; objects: [link];" cursor="rayOrigin: mouse" camera-position>
1516
<a-assets>
1617
<img id="thumbHome" crossOrigin="anonymous" src="https://cdn.aframe.io/link-traversal/thumbs/home.png">
1718
<img id="thumbSunrise" crossOrigin="anonymous" src="https://cdn.aframe.io/link-traversal/thumbs/sunrise.png">
1819
<img id="thumbMountains" crossOrigin="anonymous" src="https://cdn.aframe.io/link-traversal/thumbs/mountains.png">
19-
<a-mixin id="cursor"
20-
cursor="fuse: true; fuseTimeout: 1500"
21-
geometry="primitive: ring; radiusOuter: 0.015;
22-
radiusInner: 0.01; segmentsTheta: 32"
23-
material="color: yellow; shader: flat"
24-
raycaster="far: 30"
25-
position="0 0 -0.75"></a-mixin>
26-
<a-mixin id="-hovering" material="color: springgreen"></a-mixin>
2720
</a-assets>
2821
<a-link href="index.html" position="-3.5 1.5 -1.0" image="#thumbHome"></a-link>
2922
<a-link href="sunrise.html" position="0 1.5 -1.0" image="#thumbSunrise"></a-link>

examples/showcase/link-traversal/index.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@
22
<html>
33
<head>
44
<meta charset="utf-8">
5-
<title>Room Scale</title>
5+
<title>Links</title>
66
<meta name="description" content="Motion Capture Components – A-Frame">
77
<script src="../../../dist/aframe-master.js"></script>
88
<script src="js/components/aframe-tooltip-component.js"></script>
9+
<script src="js/components/camera-position.js"></script>
910
<script src="js/components/ground.js"></script>
1011
<script src="js/components/link-controls.js"></script>
1112
<script src="shaders/skyGradient.js"></script>
1213
</head>
1314
<body>
14-
<a-scene>
15+
<a-scene raycaster="far: 100; objects: [link];" cursor="rayOrigin: mouse" camera-position>
1516
<a-assets>
1617
<img id="arena" crossOrigin="anonymous" src="https://cdn.aframe.io/link-traversal/aframeArena.png">
1718
<img id="thumbCity" crossOrigin="anonymous" src="https://cdn.aframe.io/link-traversal/thumbs/city.png">
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/* global AFRAME */
2+
AFRAME.registerComponent('camera-position', {
3+
schema: {
4+
mobile: {type: 'vec3', default: '0 1.6 3'},
5+
desktop: {type: 'vec3', default: '0 1.6 3'}
6+
},
7+
init: function () {
8+
this.onCameraSetActive = this.onCameraSetActive.bind(this);
9+
this.resetCamera = this.resetCamera.bind(this);
10+
this.el.addEventListener('camera-set-active', this.onCameraSetActive);
11+
this.el.addEventListener('exit-vr', this.onCameraSetActive);
12+
this.el.addEventListener('enter-vr', this.resetCamera);
13+
},
14+
15+
onCameraSetActive: function () {
16+
var cameraEl = this.el.camera.el;
17+
var data = this.data;
18+
var isMobile = AFRAME.utils.device.isMobile();
19+
var position = isMobile ? data.mobile : data.desktop;
20+
var savedPose = cameraEl.components.camera.savedPose;
21+
if (savedPose) { savedPose.position.z = position.z; }
22+
this.el.camera.el.setAttribute('position', position);
23+
},
24+
25+
resetCamera: function () {
26+
var cameraEl = this.el.camera.el;
27+
var position = cameraEl.getAttribute('position');
28+
cameraEl.setAttribute('position', {
29+
x: position.x,
30+
y: position.y,
31+
z: 0
32+
});
33+
}
34+
});

examples/showcase/link-traversal/js/components/link-controls.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,16 +163,16 @@ AFRAME.registerComponent('link-controls', {
163163
},
164164

165165
play: function () {
166-
var el = this.el;
167-
el.addEventListener('mouseenter', this.onMouseEnter);
168-
el.addEventListener('mouseleave', this.onMouseLeave);
166+
var sceneEl = this.el.sceneEl;
167+
sceneEl.addEventListener('mouseenter', this.onMouseEnter);
168+
sceneEl.addEventListener('mouseleave', this.onMouseLeave);
169169
this.addControllerEventListeners();
170170
},
171171

172172
pause: function () {
173-
var el = this.el;
174-
el.removeEventListener('mouseenter', this.onMouseEnter);
175-
el.removeEventListener('mouseleave', this.onMouseLeave);
173+
var sceneEl = this.el.sceneEl;
174+
sceneEl.removeEventListener('mouseenter', this.onMouseEnter);
175+
sceneEl.removeEventListener('mouseleave', this.onMouseLeave);
176176
this.removeControllerEventListeners();
177177
},
178178

@@ -312,7 +312,7 @@ AFRAME.registerComponent('link-controls', {
312312
var previousSelectedLinkEl = this.selectedLinkEl;
313313
var selectedLinkEl = evt.detail.intersectedEl;
314314
var urlEl = this.urlEl;
315-
if (previousSelectedLinkEl || selectedLinkEl.components.link === undefined) { return; }
315+
if (!selectedLinkEl || previousSelectedLinkEl || selectedLinkEl.components.link === undefined) { return; }
316316
selectedLinkEl.setAttribute('link', 'highlighted', true);
317317
this.selectedLinkElPosition = selectedLinkEl.getAttribute('position');
318318
this.selectedLinkEl = selectedLinkEl;
@@ -325,7 +325,7 @@ AFRAME.registerComponent('link-controls', {
325325
onMouseLeave: function (evt) {
326326
var selectedLinkEl = this.selectedLinkEl;
327327
var urlEl = this.urlEl;
328-
if (!selectedLinkEl) { return; }
328+
if (!selectedLinkEl || !evt.detail.intersectedEl) { return; }
329329
selectedLinkEl.setAttribute('link', 'highlighted', false);
330330
this.selectedLinkEl = undefined;
331331
if (!urlEl) { return; }

examples/showcase/link-traversal/mountains.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
<meta name="description" content="Links – A-Frame">
77
<script src="../../../dist/aframe-master.js"></script>
88
<script src="js/components/aframe-tooltip-component.js"></script>
9+
<script src="js/components/camera-position.js"></script>
910
<script src="js/components/ground.js"></script>
1011
<script src="js/components/link-controls.js"></script>
1112
<script src="shaders/skyGradient.js"></script>
1213
</head>
1314
<body>
14-
<a-scene fog="color: #47c9ff; near: 0; far: 65;">
15+
<a-scene fog="color: #241417; near: 0; far: 30;" raycaster="far: 100; objects: [link];" cursor="rayOrigin: mouse" camera-position>
1516
<a-assets>
1617
<img id="thumbHome" crossOrigin="anonymous" src="https://cdn.aframe.io/link-traversal/thumbs/home.png">
1718
<img id="thumbSunrise" crossOrigin="anonymous" src="https://cdn.aframe.io/link-traversal/thumbs/sunrise.png">

examples/showcase/link-traversal/sunrise.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
<meta name="description" content="Links – A-Frame">
77
<script src="../../../dist/aframe-master.js"></script>
88
<script src="js/components/aframe-tooltip-component.js"></script>
9+
<script src="js/components/camera-position.js"></script>
910
<script src="js/components/ground.js"></script>
1011
<script src="js/components/link-controls.js"></script>
1112
<script src="shaders/skyGradient.js"></script>
1213
</head>
1314
<body>
14-
<a-scene fog="color: #bc483e; near: 0; far: 65;">
15+
<a-scene fog="color: #241417; near: 0; far: 30;" raycaster="far: 100; objects: [link];" cursor="rayOrigin: mouse" camera-position>
1516
<a-assets>
1617
<img id="thumbHome" crossOrigin="anonymous" src="https://cdn.aframe.io/link-traversal/thumbs/home.png">
1718
<img id="thumbCity" crossOrigin="anonymous" src="https://cdn.aframe.io/link-traversal/thumbs/city.png">

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "aframe",
3-
"version": "0.6.0",
3+
"version": "0.6.1",
44
"description": "A web framework for building virtual reality experiences.",
55
"homepage": "https://aframe.io/",
66
"main": "dist/aframe-master.js",

0 commit comments

Comments
 (0)