-
Notifications
You must be signed in to change notification settings - Fork 0
/
a-entity.d.ts
1417 lines (1383 loc) · 76 KB
/
a-entity.d.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
declare module JSX {
interface IntrinsicElements {
/**
* @see https://aframe.io/docs/1.3.0/core/entity.html
*
* A-Frame represents an entity via the <a-entity> element. As defined in the [entity-component-system pattern](https://aframe.io/docs/1.3.0/introduction/entity-component-system.html), entities are placeholder objects to which we plug in components to provide them appearance, behavior, and functionality.
*
* In A-Frame, entities are inherently attached with the [position](https://aframe.io/docs/1.3.0/components/position.html), [rotation](https://aframe.io/docs/1.3.0/components/rotation.html), and [scale](https://aframe.io/docs/1.3.0/components/scale.html) components.
*
* @example
* Consider the entity below. By itself, it has no appearance, behavior, or functionality. It does nothing:
*
* ```html
* <a-entity>
* ```
*
* We can attach components to it to make it render something or do something. To give it shape and appearance, we can attach the [geometry](https://aframe.io/docs/1.3.0/components/geometry.html) and [material](https://aframe.io/docs/1.3.0/components/material.html) components:
*
* ```html
* <a-entity geometry="primitive: box" material="color: red">
* ```
*
* Or to make it emit light, we can further attach the light component:
*
* ```html
* <a-entity geometry="primitive: box" material="color: red"
* light="type: point; intensity: 2.0">
* ```
*/
'a-entity': {
/**
* @see https://aframe.io/docs/1.3.0/components/animation.html
*
* The animation component lets us animate and tween values including:
*
* - Component values (e.g., position, visible
* - Component property values (e.g., light.intensity
*
* We can also tween values directly for better performance versus going through .setAttribute, such as by animating values:
* - On the object3D (e.g., object3D.position.y, object3D.rotation.z)
* - Directly within a component (e.g., components.material.material.color, components.text.material.uniforms.opacity.value),
*
* For example, translating a box:
*
* ```html
* <a-box position="-1 1.6 -5" animation="property: position; to: 1 8 -10; dur: 2000; easing: linear; loop: true" color="tomato"></a-box>
* ```
*
* Or orbiting a sphere in a 5-meter radius:
*
* ```html
* <a-entity rotation="0 0 0" animation="property: rotation; to: 0 360 0; loop: true; dur: 10000">
* <a-sphere position="5 0 0" color="mediumseagreen"></a-sphere>
* </a-entity>
* ```
*
* Read more below for additional options and discovering how to properly animate different types of values.
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |property|Property to animate. Can be a component name, a dot-delimited property of a component (e.g., material.color), or a plain attribute.||
* |isRawProperty|Flag to animate an arbitrary object property outside of A-Frame components for better performance. If set to true, for example, we can set property to like components.material.material.opacity. If property starts with components or object3D, this will be inferred to true.|false|
* |from|Initial value at start of animation. If not specified, the current property value of the entity will be used (will be sampled on each animation start). It is best to specify a from value when possible for stability.|null|
* |to|Target value at end of animation.|null|
* |type|Right now only supports color for tweening isRawProperty color XYZ/RGB vector values.|‘’|
* |delay|How long (milliseconds) to wait before starting.|0|
* |dir|Which dir to go from from to to.|normal|
* |dur|How long (milliseconds) each cycle of the animation is.|1000|
* |easing|Easing function of animation. To ease in, ease out, ease in and out.|easeInQuad|
* |elasticity|How much to bounce (higher is stronger).|400|
* |loop|How many times the animation should repeat. If the value is true, the animation will repeat infinitely.|0|
* |round|Whether to round values.|false|
* |startEvents|Comma-separated list of events to listen to trigger a restart and play. Animation will not autoplay if specified. startEvents will restart the animation, use pauseEvents to resume it. If there are other animation components on the entity animating the same property, those animations will be automatically paused to not conflict.|null|
* |pauseEvents|Comma-separated list of events to listen to trigger pause. Can be resumed with resumeEvents.|null|
* |resumeEvents|Comma-separated list of events to listen to trigger resume after pausing.|null|
* |autoplay|Whether or not the animation should autoplay. Should be specified if the animation is defined for the animation-timeline component.|true|
* |enabled|If disabled, animation will stop and startEvents will not trigger animation start.|true|
*
* # Multiple Animations
*
* The component’s base name is animation. We can attach multiple animations to one entity by name-spacing the component with double underscores (__)
*
* ```html
* <a-entity animation="property: rotation"
* animation__2="property: position"
* animation__color="property: material.color"></a-entity>
* ```
*/
animation?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/camera.html
*
* The camera component defines from which perspective the user views the scene. The camera is commonly paired with controls components that allow input devices to move and rotate the camera.
*
* @example
* A camera should usually be positioned at the average height of human eye level (1.6 meters). When used with controls that receive rotation or position (e.g. from a VR device) this position will be overridden.
*
* ```html
* <a-entity camera look-controls position="0 1.6 0"></a-entity>
* ```
*
* When moving or rotating the camera relative to the scene, use a camera rig. By doing so, the camera’s height offset can be updated by roomscale devices, while still allowing the tracked area to be moved independently around the scene.
*
* ```html
* <a-entity id="rig" position="25 10 0">
* <a-entity id="camera" camera look-controls></a-entity>
* </a-entity>
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |active|Whether the camera is the active camera in a scene with more than one camera.|true|
* |far|Camera frustum far clipping plane.|10000|
* |fov|Field of view (in degrees).|80|
* |near|Camera frustum near clipping plane.|0.005|
* |spectator|Whether the camera is used to render a third-person view of the scene on the 2D display while in VR mode.|false|
* |zoom|Zoom factor of the camera.|1|
*/
camera?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/cursor.html
*
* The cursor component provides hover and click states for interaction on top of the raycaster component. The cursor component can be used for both gaze-based and controller-based interactions, but the appearance needs to be configured depending on the use case. The <a-cursor> primitive provides a default reticle appearance for a gaze-based cursor, and the laser-controls component configures the cursor for all controllers.
*
* The cursor component listens to events and keeps state on what’s being hovered and pressed in order to provide mousedown, mouseup, mouseenter, mouseleave, and click events. We use the name mouse to mimic traditional web development for now. Under the hood, the cursor component uses the raycaster-intersection and raycaster-intersection-cleared events, capturing the closest visible intersected entity.
*
* By default, the cursor is configured to be used in a gaze-based mode and will register user input via mouse or touch. Specifying the downEvents and upEvents properties allows the cursor to work with controllers. For example, the laser-controls component automatically configures these properties to work with most controllers.
*
* To provide a shape or appearance to the cursor, we should apply either the geometry and material components or use the raycaster component’s showLine property to draw a line using the line component.
*
* @example
* For example, we can create a ring-shaped cursor fixed to the center of the screen. To fix the cursor to the screen so the cursor is always present no matter where we look, we place it as a child of the active camera entity. We pull it in front of the camera by placing it on the negative Z axis. When the cursor clicks on the box, we can listen to the click event.
*
* ```html
* <a-entity camera look-controls>
* <a-entity cursor="fuse: true; fuseTimeout: 500"
* position="0 0 -1"
* geometry="primitive: ring; radiusInner: 0.02; radiusOuter: 0.03"
* material="color: black; shader: flat">
* </a-entity>
* </a-entity>
*
* <a-entity id="box" cursor-listener geometry="primitive: box" material="color: blue"></a-entity>
* ```
*
* ```js
* // Component to change to a sequential color on click.
* AFRAME.registerComponent('cursor-listener', {
* init: function () {
* var lastIndex = -1;
* var COLORS = ['red', 'green', 'blue'];
* this.el.addEventListener('click', function (evt) {
* lastIndex = (lastIndex + 1) % COLORS.length;
* this.setAttribute('material', 'color', COLORS[lastIndex]);
* console.log('I was clicked at: ', evt.detail.intersection.point);
* });
* }
* });
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |downEvents|Array of additional events on the entity to listen to for triggering mousedown (e.g., triggerdown for vive-controls).|[]|
* |fuse|Whether cursor is fuse-based.|false on desktop, true on mobile|
* |fuseTimeout|How long to wait (in milliseconds) before triggering a fuse-based click event.|1500|
* |mouseCursorStylesEnabled|Whether to show pointer cursor in rayOrigin: mouse mode when hovering over entity.|true|
* |rayOrigin|Where the intersection ray is cast from (i.e.,entity or mouse). rayOrigin: mouse is extremely useful for VR development on a mouse and keyboard.|entity|
* |upEvents|Array of additional events on the entity to listen to for triggering mouseup (e.g., trackpadup for daydream-controls).|[]|
*
* To further customize the cursor component, we configure the cursor’s dependency component, [the raycaster component](https://aframe.io/docs/1.3.0/components/raycaster.html).
*/
cursor?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/daydream-controls.html
*
* The daydream-controls component interfaces with the Google Daydream controllers. It wraps the tracked-controls component while adding button mappings, events, and a Daydream controller model that highlights the touched and/or pressed buttons (trackpad).
*
* As a first time set up, to use the Daydream controller on Chrome for Android enable both WebVR and Gamepad Extensions experiments in chrome://flags and relaunch the browser.
*
* Then, open your web app, enter VR mode and place the phone inside the headset. It can occassionally take a few seconds before the controller can be used.
*
* @example
* ```html
* <!-- Match Daydream controller if present, regardless of hand. -->
* <a-entity daydream-controls></a-entity>
* ```
*
* ```html
* <!-- Match Daydream controller if present and for specified hand. -->
* <a-entity daydream-controls="hand: left"></a-entity>
* <a-entity daydream-controls="hand: right"></a-entity>
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |armModel|Whether the arm model is used for positional data.|true|
* |buttonColor|Button colors when not pressed.|#000000|
* |buttonTouchedColor|Button colors when touched.|#777777|
* |buttonHighlightColor|Button colors when pressed and active.|#FFFFFF|
* |hand|Set hand that will be tracked (i.e., right, left).||
* |model|Whether the Daydream controller model is loaded.|true|
* |orientationOffset|Offset to apply to model orientation.|x: 0, y: 0, z: 0|
*/
'daydream-controls'?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/gearvr-controls.html
*
* The gearvr-controls component interfaces with the Samsung/Oculus Gear VR controllers. It wraps the tracked-controls component while adding button mappings, events, and a Gear VR controller model that highlights the touched and/or pressed buttons (trackpad, trigger).
*
* @example
* ```html
* <!-- Match Gear VR controller if present, regardless of hand. -->
* <a-entity gearvr-controls></a-entity>
*
* <!-- Match Gear VR controller if present and for specified hand. -->
* <a-entity gearvr-controls="hand: left"></a-entity>
* <a-entity gearvr-controls="hand: right"></a-entity>
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |armModel|Whether the arm model is used for positional data.|true|
* |buttonColor|Button colors when not pressed.|#000000|
* |buttonTouchedColor|Button colors when touched.|#777777|
* |buttonHighlightColor|Button colors when pressed and active.|#FFFFFF|
* |hand|The hand that will be tracked (e.g., right, left).||
* |model|Whether the Gear controller model is loaded.|true|
* |orientationOffset|Offset to apply to model orientation.|x: 0, y: 0, z: 0|
*/
'gearvr-controls'?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/geometry.html
*
* The geometry component provides a basic shape for an entity. The primitive property defines the general shape. Geometric primitives, in computer graphics, are irreducible basic shapes. A material component is commonly defined to provide an appearance alongside the shape to create a complete mesh.
*
* @properties
*
* # Base Properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |primitive|Name of a geometry (e.g., one of the geometries listed below). Determines the geometry type and what other properties are available.|box|
* |skipCache|Disable retrieving the shared geometry object from the cache.|false|
*
* # Built-in Geometries
* ## Box
* The box geometry defines boxes (i.e., any quadrilateral, not just cubes).
*
* ```html
* <a-entity geometry="primitive: box; width: 1; height: 1; depth: 1"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |width|Width (in meters) of the sides on the X axis.|1|
* |height|Height (in meters) of the sides on the Y axis.|1|
* |depth|Depth (in meters) of the sides on the Z axis.|1|
* |segmentsDepth|Number of segmented faces on the z-axis|1|
* |segmentsHeight|Number of segmented faces on the y-axis|1|
* |segmentsWidth|Number of segmented faces on the x-axis|1|
*
* ## Circle
* The circle geometry creates flat two-dimensional circles. These can be complete circles or partial circles (like Pac-Man). Note that because circles are flat, A-Frame will only render a single face of the circle if we don’t specify side: double on the material component.
*
* ```html
* <a-entity geometry="primitive: circle; radius: 1" material="side: double"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |radius|Radius (in meters) of the circle.|1|
* |segments|Number of triangles to construct the circle, like pizza slices. A higher number of segments means the circle will be more round.|32|
* |thetaStart|Start angle for first segment. Can be used to define a partial circle.|0|
* |thetaLength|The central angle (in degrees). Defaults to 360, which makes for a complete circle.|360|
*
* ## Cone
* The cone geometry is a cylinder geometry that have different top and bottom radii.
*
* ```html
* <a-entity geometry="primitive: cone; radiusBottom: 1; radiusTop: 0.1"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |height|Height of the cone.|2|
* |openEnded|Whether the ends of the cone are open (true) or capped (false).|false|
* |radiusBottom|Radius of the bottom end of the cone.|1|
* |radiusTop|Radius of the top end of the cone.|1|
* |segmentsRadial|Number of segmented faces around the circumference of the cone.|36|
* |segmentsHeight|Number of rows of faces along the height of the cone.|18|
* |thetaStart|Starting angle in degrees.|0|
* |thetaLength|Central angle in degrees.|360|
*
* ## Cylinder
* The cylinder geometry creates cylinders in the traditional sense like a Coca-Cola™ can, but it can also define shapes such as tubes and curved surfaces.
*
* We can create a basic cylinder using height and radius:
*
* ```html
* <a-entity geometry="primitive: cylinder; height: 3; radius: 2"></a-entity>
* ```
*
* We can create a tube by making the cylinder open-ended, which removes the top and bottom surfaces of the cylinder such that the inside is visible. Then we need a double-sided material to render properly:
*
* ```html
* <!-- Tube -->
* <a-entity geometry="primitive: cylinder; openEnded: true" material="side: double"></a-entity>
* ```
*
* We can create a curved surfaces by specifying the arc via thetaLength such that the cylinder doesn’t curve all the way around, making the cylinder open-ended, and then making the material double-sided:
*
* ```html
* <!-- Curved surface -->
* <a-entity geometry="primitive: cylinder; openEnded: true; thetaLength: 180"
* material="side: double"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |radius|Radius of the cylinder.|1|
* |height|Height of the cylinder.|2|
* |segmentsRadial|Number of segmented faces around the circumference of the cylinder.|36|
* |segmentsHeight|Number of rows of faces along the height of the cylinder.|18|
* |openEnded|Whether the ends of the cylinder are open (true) or capped (false).|false|
* |thetaStart|Starting angle in degrees.|0|
* |thetaLength|Central angle in degrees.|360|
*
* ## Dodecahedron
* The dodecahedron geometry creates a polygon with twelve equally-sized faces.
*
* ```html
* <a-entity geometry="primitive: dodecahedron; radius: 2"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |radius|Radius (in meters) of the dodecahedron.|1|
*
* ## Octahedron
* The octahedron geometry creates a polygon with eight equilateral triangular faces.
*
* ```html
* <a-entity geometry="primitive: octahedron"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |radius|Radius (in meters) of the octahedron.|1|
*
* ## Plane
*
* The plane geometry creates a flat surface. Because planes are flat, A-Frame will render only a single face of the plane unless we specify side: double on the material component.
*
* ```html
* <a-entity geometry="primitive: plane; height: 10; width: 10" material="side: double"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |width|Width along the X axis.|1|
* |height|Height along the Y axis.|1|
* |segmentsHeight|Number of segmented faces on the y-axis|1|
* |segmentsWidth|Number of segmented faces on the x-axis|1|
*
* ## Ring
* The ring geometry creates a flat ring, like a CD. Because the ring is flat, A-Frame will only render a single face of the ring unless we specify side: double the material component.
*
* ```html
* <a-entity geometry="primitive: ring; radiusInner: 0.5; radiusOuter: 1"
* material="side: double"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |radiusInner|Radius of the inner hole of the ring.|1|
* |radiusOuter|Radius of the outer edge of the ring.|1|
* |segmentsTheta|Number of segments. A higher number means the ring will be more round.|32|
* |segmentsPhi|Number of triangles within each face defined by segmentsTheta.|8|
* |thetaStart|Starting angle in degrees.|0|
* |thetaLength|Central angle in degrees.|360|
*
* ## Sphere
* The sphere geometry creates spheres (e.g., balls). We can create a basic sphere:
*
* ```html
* <a-entity geometry="primitive: sphere; radius: 2"></a-entity>
* ```
*
* We can create polyhedrons and abstract shapes by specifying the number of horizontal angles and faces:
*
* ```html
* <a-entity geometry="primitive: sphere; segmentsWidth: 2; segmentsHeight: 8"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |radius|Radius of the sphere.|1|
* |segmentsWidth|Number of horizontal segments.|18|
* |segmentsHeight|Number of vertical segments.|36|
* |phiStart|Horizontal starting angle.|0|
* |phiLength|Horizontal sweep angle size.|360|
* |thetaStart|Vertical starting angle.|0|
* |thetaLength|Vertical sweep angle size.|360|
*
* ## Tetrahedron
* The tetrahedron geometry creates a polygon with four triangular faces.
*
* ```html
* <a-entity geometry="primitive: tetrahedron; radius: 2"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |radius|Radius (in meters) of the tetrahedron.|1|
*
* ## Torus
* The torus geometry creates a donut or curved tube shape:
*
* ```html
* <!-- Half donut -->
* <a-entity geometry="primitive: torus; radius: 2; radiusTubular: 0.5; arc: 180"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |radius|Radius of the outer edge of the torus.|1|
* |radiusTubular|Radius of the tube.|0.2|
* |segmentsRadial|Number of segments along the circumference of the tube ends. A higher number means the tube will be more round.|36|
* |segmentsTubular|Number of segments along the circumference of the tube face. A higher number means the tube will be more round.|32|
* |arc|Central angle.|360|
*
* ## TorusKnot
* The torus knot geometry creates a pretzel shape. A pair of coprime integers, p and q, defines the particular shape of the pretzel. If p and q are not coprime the result will be a torus link:
*
* ```html
* <a-entity geometry="primitive: torusKnot; p: 3; q:7"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |radius|Radius that contains the torus knot.|1|
* |radiusTubular|Radius of the tubes of the torus knot.|0.2|
* |segmentsRadial|Number of segments along the circumference of the tube ends. A higher number means the tube will be more round.|36|
* |segmentsTubular|Number of segments along the circumference of the tube face. A higher number means the tube will be more round.|32|
* |p|How many times the geometry winds around its axis of rotational symmetry.|2|
* |q|How many times the geometry winds around a circle in the interior of the torus.|3|
*
* ## Triangle
*
* The triangle geometry creates a flat two-dimensional triangle. Because triangles are flat, A-Frame will render only a single face, which is the one with vertexA, vertexB, and vertexC appear in counterclockwise order on the screen, unless we specify side: double on the material component.
*
* ```html
* <a-entity geometry="primitive: triangle" material="side: double"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |vertexA|Coordinates of one of the three vertices|0 0.5 0|
* |vertexB|Coordinates of one of the three vertices|-0.5 -0.5 0|
* |vertexC|Coordinates of one of the three vertices|0.5 -0.5 0|
*/
geometry?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/gltf-model.html
*
* glTF (GL Transmission Format) is an open project by Khronos providing a common, extensible format for 3D assets that is both efficient and highly interoperable with modern web technologies.
*
* The gltf-model component loads a 3D model using a glTF (.gltf or .glb) file.
*
* Note that glTF is a fairly new specification and adoption is still growing. Work on the three.js glTF loader and converters are still active.
*
* > NOTE: A-Frame supports glTF 2.0. For models using older versions of the glTF format, use gltf-model-legacy from donmccurdy/aframe-extras.
*
* @example
* Load a glTF model by pointing to an asset that specifies the src for a glTF file.
*
* ```html
* <a-scene>
* <a-assets>
* <a-asset-item id="tree" src="/path/to/tree.gltf"></a-asset-item>
* </a-assets>
*
* <a-entity gltf-model="#tree"></a-entity>
* </a-scene>
* ```
*
* @values
* |Type|Description|
* |:-|:-|
* |selector|Selector to an <a-asset-item>|
* |string|url()-enclosed path to a glTF file|
*/
'gltf-model'?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/hand-controls.html
*
* The hand-controls component provides tracked hands (using a prescribed model) with animated gestures. hand-controls wraps the vive-controls and oculus-touch-controls which in turn wrap the tracked-controls component. By specifying just hand-controls, we have something that works well with both Vive and Rift. The component gives extra events and handles hand animations and poses.
*
* @example
* ```html
* <a-entity id="leftHand" hand-controls="hand: left; handModelStyle: lowPoly; color: #ffcccc"></a-entity>
* <a-entity id="rightHand" hand-controls="hand: right; handModelStyle: lowPoly; color: #ffcccc"></a-entity>
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |color|Color of hand material.|white|
* |hand|Associated controller. Can be left or right.|left|
* |handModelStyle|Style of the hand 3D model loaded. Can be lowPoly, highPoly or toon.|lowPoly|
*/
'hand-controls'?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/hand-tracking-controls.html
*
* Use hand-tracking-controls to integrate hand tracked input in your application. The component provides a visual representation of the hand and basic gesture recognition. It can be used along tracked controllers (e.g: oculus-touch-controls) for applications requiring multiple input methods. Component is only active when the browser and underlying system starts tracking the user’s hands.
*
* @example
* ```html
* <a-entity id="leftHand" hand-tracking-controls="hand: left;"></a-entity>
* <a-entity id="rightHand" hand-tracking-controls="hand: right;"></a-entity>
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |hand|The hand that will be tracked (i.e., right, left).|left|
* |modelColor|Color of hand material.|white|
* |modelStyle|Mesh representing the hand or dots matching the joints|mesh|
*/
'hand-tracking-controls'?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/hide-on-enter-ar.html
*
* When the user enters AR this component will hide the component by toggling it’s visible state.
*
* This is used to hide background elements such as floors, sky boxes, environments and other large elements. Letting the user comfortably fit the remaining visible elements into their physical space.
*
* You can also use this to disable scene lighting if you will be using lighting estimation instead.
*
* @example
* ```html
* <a-light hide-on-enter-ar></a-light>
* <a-sky hide-on-enter-ar color="skyblue"></a-sky>
* ```
*/
'hide-on-enter-ar'?: boolean;
/**
* @see https://aframe.io/docs/1.3.0/components/laser-controls.html
*
* ![](https://user-images.githubusercontent.com/674727/26897482-91947a94-4b7d-11e7-9cb5-5c47f50938e4.gif)
*
* The laser-controls component provides tracked controls with a laser or ray cursor shooting out to be used for input and interactions. DoF stands for degrees of freedom. Because they only require rotation and some form of input, laser-based interactions scale well across 0 DoF (gaze-based, Cardboard), 3 DoF (Daydream, GearVR with controllers), and 6 DoF (Vive, Oculus Touch). If desired, we can get a consistent form of interaction that works across all VR platforms with a single line of HTML.
*
* laser-controls is a higher-order component, meaning the component wraps and configures other components, rather than implementing any logic itself. Under the hood, laser-controls sets all of the tracked controller components:
*
* - vive-controls
* - oculus-touch-controls
* - daydream-controls
* - gearvr-controls
* - windows-motion-controls
*
* These controller components get activated if its respective controller is connected and detected via the Gamepad API. Then the model of the actual controller is used. laser-controls then configures the cursor component for listen to the appropriate events and configures the raycaster component to draw the laser.
*
* When the laser intersects with an entity, the length of the line gets truncated to the distance to the intersection point.
*
* @example
* ```html
* <a-entity laser-controls="hand: left"></a-entity>
* ```
*
* @properties
* |Property|Description|
* |:-|:-|
* |hand|left or right.|
* |model|Whether the default model for the controller is loaded.|
* |defaultModelColor|Color for the default controller model.|
*
* # Customizing the Raycaster
* Configure the [raycaster properties](https://aframe.io/docs/1.3.0/components/raycaster.html).
*
* For example:
*
* ```html
* <a-entity laser-controls raycaster="objects: .links; far: 5"></a-entity>
* ```
*
* # Customizing the Line
* See [Raycaster: Customizing the Line.](https://aframe.io/docs/1.3.0/components/raycaster.html#customizing-the-line)
*
* For example:
*
* ```html
* <a-entity laser-controls raycaster="lineColor: red; lineOpacity: 0.5"></a-entity>
* ```
*/
'laser-controls'?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/layer.html
*
* The layer component renders images, videos or cubemaps into a WebXR compositor layer on supported browsers.
*
* The benefits of layers are:
*
* - Performance and judder: Once the layer is submitted, the compositor is in charge of render it at a fixed refresh rate (72Hz, 90Hz… depending on device). Even if the application cannot keep up with the compositor refresh rate the layer won’t drop any frames resulting in a smoother experience.
* - Visual fidelity: The images in a layer will be sampled only once by the compositor. Regular WebGL content is sampled twice: Once one rendering to the eye buffer and a second time when copied to the compositor. This results in a loss of details.
* - Battery life: No double sampling results in less memory copies reducing operations and battery consumption.
* - Latency: Headset pose sampling for layers takes place at the end of the frame using the most recent HMD pose. This paired with reprojection techniques reduce the effective latency.
*
* @example
* ```html
* <a-scene>
* <a-assets>
* <img id="comicbook" crossOrigin="anonymous" src="/path/to/comicbook.png">
* </a-assets>
* <a-entity layer="type: quad; src: #comicbook" position="0 1.8 -1.5"></a-entity>
* </a-scene>
* ```
*
* @properties
* |Property|Description|
* |:-|:-|
* |type|quad, monocubemap or stereocubemap|
* |src|Image or video loaded in the layer.|
* |rotateCubemap|Rotates the cubemap 180 degrees in the y-axis.|
*/
layer?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/light.html
*
* The light component defines the entity as a source of light. Light affects all materials that have not specified a flat shading model with shader: flat. Note that lights are computationally expensive we should limit number of lights in a scene.
*
* ```html
* <a-entity light="color: #AFA; intensity: 1.5" position="-1 1 0"></a-entity>
* ```
*
* By default, A-Frame scenes inject default lighting, an ambient light and a directional light. These default lights are visible in the DOM with the data-aframe-default-light attribute. Whenever we add any lights, A-Frame removes the default lights from the scene.
*
* ```html
* <!-- Default lighting injected by A-Frame. -->
* <a-entity light="type: ambient; color: #BBB"></a-entity>
* <a-entity light="type: directional; color: #FFF; intensity: 0.6" position="-0.5 1 1"></a-entity>
* ```
*
* To manually disable the defaults, without adding other lights:
*
* ```html
* <a-scene light="defaultLightsEnabled: false">
* <!-- ... -->
* </a-scene>
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |type|One of ambient, directional, hemisphere, point, spot, probe.|directional|
* |color|Light color.|#fff|
* |intensity|Light strength.|1.0|
*/
light?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/line.html
*
* The line component draws a line given a start coordinate and end coordinate using THREE.Line.
*
* The raycaster component uses the line component for its showLine property, which is then used by the laser-controls component.
*
* @example
* ```html
* <a-entity line="start: 0 1 0; end: 2 0 -5; color: red"
* line__2="start: -2 4 5; end: 0 4 -3; color: green"></a-entity>
* ```
*
* Note an entity can have multiple lines. The line mesh is set as line or line__<ID> in the entity’s object3DMap:
*
* ```js
* console.log(el.getObject3D('line'));
* console.log(el.getObject3D('line__2'));
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |start|Start point coordinate.|0 0 0|
* |end|End coordinate.|0 0 0|
* |color|Line color.|#74BEC1|
* |opacity|Line opacity.|1|
* |visible|Whether the material visible.|true|
*/
line?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/link.html
*
* ![](https://user-images.githubusercontent.com/674727/27721720-19388346-5d17-11e7-912b-499886be0a8d.gif)
*
* The link component connects between experiences and allows for traversing between VR web pages. When activated via an event, the link component sends the user to a different page, just like a normal web page redirect. To maintain VR across pages, the following conditions must apply:
*
* - Your browser implements the WebXR [in-VR navigation proposal](https://github.com/immersive-web/navigation#api-proposal). Notice that is not yet part of the standard. Support is experimental, varies accross browsers and it might require enabling manually in settings.
* - The destination Web page listens to the window [sessiongranted] event and enters VR. A-Frame experiences behave this way by default.
* - At the moment, The Oculus Browser on Quest is the only browser shipping the [in-VR navigation proposal](https://github.com/immersive-web/navigation#api-proposal).
*
* # Link UX
*
* A link in VR can be anything such as grabbing onto an object, placing something on our head, clicking something, even eating something! We provide a default implementation of links as a portal or window, using a 360° image thumbnail to preview the destination.
*
* The UX of link traversal will continue to refine as we iterate and experiment, both in content and from the browser.
*
* ## Controls
*
* The default UX of the link component as a portal can be interacted with using a cursor or controllers. This is not provided directly in the A-Frame core, but there is a link-controls component in the A-Frame examples. This component shows tooltips and provides button mappings for peeking and entering portals.
*
* @example
* ```html
* <a-scene>
* <a-assets>
* <img id="homeThumbnail" src="home.jpg">
* </a-assets>
*
* <a-entity link="href: index.html; title: My Homepage; image: #homeThumbnail"></a-entity>
* </a-scene>
* ```
*
* We also provide a link primitive with a different syntax:
*
* ```html
* <a-link href="index.html" title="My Homepage" image="#homeThumbnail"></a-link>
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |backgroundColor|Inner (background) color of the portal.|red|
* |borderColor|Border color of the portal.|white|
* |highlighted|Boolean to toggle link highlight color.|false|
* |highlightedColor|Border color when highlighted.|‘#24CAFF’|
* |href|Destination URL where the link points to.|‘’|
* |image|360° image used as scene preview in the portal. Can be a selector to an <img> element or a URL.|‘’|
* |on|Event to listen to that triggers link traversal.|‘click’|
* |peekMode|Whether the 360° image is fully expanded for preview.|false|
* |title|Text displayed on the link. The href or page URL is used if not defined.|‘’|
* |titleColor|Color of the text displayed on the link.|white|
* |visualAspectEnabled|Whether to enable the default visual appearance of a portal. Set to false if we want to implement our own pattern or form of link traversal.|true|
*/
link?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/look-controls.html
*
* The look-controls component:
*
* - Rotates the entity when we rotate a VR head-mounted display (HMD).
* - Rotates the entity when we move the mouse.
* - Rotates the entity when we touch-drag the touchscreen.
*
* @example
* The look-controls component is usually used alongside the [camera component](https://aframe.io/docs/1.3.0/components/camera.html).
*
* ```html
* <a-entity camera look-controls position="0 1.6 0"></a-entity>
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |enabled|Whether look controls are enabled.|true|
* |reverseMouseDrag|Whether to reverse mouse drag.|false|
* |reverseTouchDrag|Whether to reverse touch drag.|false|
* |touchEnabled|Whether to use touch controls in magic window mode.|true|
* |mouseEnabled|Whether to use mouse to move the camera in 2D mode.|true|
* |pointerLockEnabled|Whether to hide the cursor using the Pointer Lock API.|false|
* |magicWindowTrackingEnabled|Whether gyroscope camera tracking is enabled on mobile devices.|true|
*
* # Customizing look-controls
*
* While A-Frame’s look-controls component is primarily meant for VR with sensible defaults to work across platforms, many developers want to use A-Frame for non-VR use cases (e.g., desktop, touchscreen). We might want to modify the mouse and touch behaviors.
*
* The best way to configure the behavior is to copy and customize the current look-controls component code. This allows us to configure the controls how we want (e.g., limit the pitch on touch, reverse one axis). If we were to include every possible configuration into the core component, we would be left maintaining a wide array of flags.
*
* The component lives within a Browserify/Webpack context so you’ll need to replace the require statements with A-Frame globals (e.g., AFRAME.registerComponent, window.THREE), and get rid of the module.exports.
*
* # Caveats
*
* If you want to create your own component for look controls, you will have to copy and paste the HMD-tracking bits into your component. In the future, we may have a system for people to more easily create their controls.
*/
'look-controls'?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/magicleap-controls.html
*
* The magicleap-controls component interfaces with the Magic Leap controller. It wraps the tracked-controls component while adding button mappings, events, and Magic Leap controller model/
*
* @example
* ```html
* <!-- Match Magic Leap controller if present, regardless of hand. -->
* <a-entity magicleap-controls></a-entity>
*
* <!-- Match Magic Leap controller if present and for specified hand. -->
* <a-entity magicleap-controls="hand: left"></a-entity>
* <a-entity magicleap-controls="hand: right"></a-entity>
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |hand|The hand that will be tracked (e.g., right, left).||
* |model|Whether the Magic Leap controller model is loaded.|true|
* |orientationOffset|Offset to apply to model orientation.|x: 0, y: 0, z: 0|
*/
'magicleap-controls'?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/material.html
*
* The material component gives appearance to an entity. We can define properties such as color, opacity, or texture. This is often paired with the geometry component which provides shape.
*
* We can register custom materials to extend the material component to provide a wide range of visual effects.
*
* @example
* Defining a red material using the default standard material:
* ```html
* <a-entity geometry="primitive: box" material="color: red"></a-entity>
* ```
*
* Here is an example of using a different material:
* ```html
* <a-entity geometry="primitive: box" material="shader: flat; color: red"></a-entity>
* ```
*
* Here is an example of using an example custom material:
* ```html
* <a-entity geometry="primitive: plane"
* material="shader: ocean; color: blue; wave-height: 10"></a-entity>
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |alphaTest|Alpha test threshold for transparency.|0|
* |depthTest|Whether depth testing is enabled when rendering the material.|true|
* |flatShading|Use THREE.FlatShading rather than THREE.StandardShading.|false|
* |npot|Use settings for non-power-of-two (NPOT) texture.|false|
* |offset|Texture offset to be used.|{x: 0, y: 0}|
* |opacity|Extent of transparency. If the transparent property is not true, then the material will remain opaque and opacity will only affect color.|1.0|
* |repeat|Texture repeat to be used.|{x: 1, y: 1}|
* |shader|Which material to use. Defaults to the standard material. Can be set to the flat material or to a registered custom shader material.|standard|
* |side|Which sides of the mesh to render. Can be one of front, back, or double.|front|
* |transparent|Whether material is transparent. Transparent entities are rendered after non-transparent entities.|false|
* |vertexColors|Whether to use vertex or face colors to shade the material. Can be one of none, vertex, or face.|none|
* |visible|Whether material is visible. Raycasters will ignore invisible materials.|true|
* |blending|The blending mode for the material’s RGB and Alpha sent to the WebGLRenderer. Can be one of none, normal, additive, subtractive or multiply.|normal|
* |dithering|Whether material is dithered with noise. Removes banding from gradients like ones produced by lighting.|true|
*
* # Built-in Materials
*
* A-Frame ships with a couple of built-in materials.
*
* ## standard
*
* The standard material is the default material. It uses the physically-based THREE.MeshStandardMaterial.
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |ambientOcclusionMap|Ambient occlusion map. Used to add shadows to the mesh. Can either be a selector to an <img>, or an inline URL. Requires 2nd set of UVs (see below).|None|
* |ambientOcclusionMapIntensity|The intensity of the ambient occlusion map, a number between 0 and 1.|1|
* |ambientOcclusionTextureRepeat|How many times the ambient occlusion texture repeats in the X and Y direction.|1 1|
* |ambientOcclusionTextureOffset|How the ambient occlusion texture is offset in the x y direction.|0 0|
* |color|Base diffuse color.|#fff|
* |displacementMap|Displacement map. Used to distort a mesh. Can either be a selector to an <img>, or an inline URL.|None|
* |displacementScale|The intensity of the displacement map effect|1|
* |displacementBias|The zero point of the displacement map.|0.5|
* |displacementTextureRepeat|How many times the displacement texture repeats in the X and Y direction.|1 1|
* |displacementTextureOffset|How the displacement texture is offset in the x y direction.|0 0|
* |emissive|The color of the emissive lighting component. Used to make objects produce light even without other lighting in the scene.|#000|
* |emissiveIntensity|Intensity of the emissive lighting component.|1|
* |height|Height of video (in pixels), if defining a video texture.|360|
* |envMap|Environment cubemap texture for reflections. Can be a selector to or a comma-separated list of URLs.|None|
* |fog|Whether or not material is affected by fog.|true|
* |metalness|How metallic the material is from 0 to 1.|0|
* |normalMap|Normal map. Used to add the illusion of complex detail. Can either be a selector to an <img>, or an inline URL.|None|
* |normalScale|Scale of the effect of the normal map in the X and Y directions.|1 1|
* |normalTextureRepeat|How many times the normal texture repeats in the X and Y direction.|1 1|
* |normalTextureOffset|How the normal texture is offset in the x y direction.|0 0|
* |repeat|How many times a texture (defined by src) repeats in the X and Y direction.|1 1|
* |roughness|How rough the material is from 0 to 1. A rougher material will scatter reflected light in more directions than a smooth material.|0.5|
* |sphericalEnvMap|Environment spherical texture for reflections. Can either be a selector to an <img>, or an inline URL.|None|
* |width|Width of video (in pixels), if defining a video texture.|640|
* |wireframe|Whether to render just the geometry edges.|false|
* |wireframeLinewidth|Width in px of the rendered line.|2|
* |src|Image or video texture map. Can either be a selector to an <img> or <video>, or an inline URL.|None|
*
* ### Phong-Based Shading
*
* Phong shading is an inexpensive shader model which whilst less realistic than the standard material is better than flat shading.
*
* To use it set the shader to phong in the material:
* ```html
* <a-torus-knot position="0 3 0" material="shader:phong; reflectivity: 0.9; shininess: 30;"
* geometry="radius: 0.45; radiusTubular: 0.09">
* </a-torus-knot>
* ```
*
* It has the following properties you can use:
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |specular|This defines how shiny the material is and the color of its shine.|#111111|
* |shininess|How shiny the specular highlight is; a higher value gives a sharper highlight|30|
* |transparent|Whether the material is transparent|false|
* |combine|How the environment map mixes with the material. “mix”, “add” or “multiply”|“mix”|
* |reflectivity|How much the environment map affects the surface|0.9|
* |refract|Whether the defined envMap should refract|false|
* |refractionRatio|1/refractive index of the material|0.98|
*
* ## flat
*
* The flat material uses the THREE.MeshBasicMaterial. Flat materials are not affected by the scene’s lighting conditions. This is useful for things such as images or videos. Set shader to flat:
*
* ```html
* <a-entity geometry="primitive: plane" material="shader: flat; src: #cat-image"></a-entity>
* ```
*
* |Property|Description|Default Value|
* |:-|:-|:-|
* |color|Base diffuse color.|#fff|
* |fog|Whether or not material is affected by fog.|true|
* |height|Height of video (in pixels), if defining a video texture.|360|
* |repeat|How many times a texture (defined by src) repeats in the X and Y direction.|1 1|
* |src|Image or video texture map. Can either be a selector to an <img> or <video>, or an inline URL.|None|
* |width|Width of video (in pixels), if defining a video texture.|640|
* |wireframe|Whether to render just the geometry edges.|false|
* |wireframeLinewidth|Width in px of the rendered line.|2|
*/
material?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/obj-model.html
*
* The obj-model component loads a 3D model and material using a Wavefront (.OBJ) file and a .MTL file.
*
* @example
* We can load an .OBJ model by pointing to assets that specify the path to an .OBJ and .MTL file.
* ```html
* <a-scene>
* <a-assets>
* <a-asset-item id="tree-obj" src="/path/to/tree.obj"></a-asset-item>
* <a-asset-item id="tree-mtl" src="/path/to/tree.mtl"></a-asset-item>
* </a-assets>
*
* <a-entity obj-model="obj: #tree-obj; mtl: #tree-mtl"></a-entity>
* </a-scene>
* ```
*
* @properties
* |Property|Description|
* |:-|:-|
* |obj|Selector to an <a-asset-item> pointing to a .OBJ file or an inline path to a .OBJ file.|
* |mtl|Selector to an <a-asset-item> pointing to a .MTL file or an inline path to a .MTL file. Optional if you wish to use the material component instead.|
*/
'obj-model'?: string;
/**
* @see https://aframe.io/docs/1.3.0/components/oculus-go-controls.html
*
* The oculus-go-controls component interfaces with the Oculus Go controllers. It wraps the tracked-controls component while adding button mappings, events, and an Oculus Go controller model that highlights the touched and/or pressed buttons (trackpad, trigger).
*
* @example
* ```html
* <!-- Match Oculus Go controller if present, regardless of hand. -->
* <a-entity oculus-go-controls></a-entity>
*
* <!-- Match Oculus Go controller if present and for specified hand. -->
* <a-entity oculus-go-controls="hand: left"></a-entity>
* <a-entity oculus-go-controls="hand: right"></a-entity>
* ```
*
* @properties
* |Property|Description|Default Value|
* |:-|:-|:-|
* |armModel|Whether the arm model is used for positional data.|true|
* |buttonColor|Button colors when not pressed.|#000000|
* |buttonTouchedColor|Button colors when touched.|#777777|
* |buttonHighlightColor|Button colors when pressed and active.|#FFFFFF|