milestone 4l. manyfold.sh: add default 3D assets/templates from XR Fragments (milestone)
This commit is contained in:
		
							parent
							
								
									2c981e4060
								
							
						
					
					
						commit
						a64694edc0
					
				
					 4 changed files with 85 additions and 99 deletions
				
			
		| 
						 | 
				
			
			@ -731,21 +731,9 @@ The sidecar will define (or <strong>override</strong> already existing) extras,
 | 
			
		|||
 | 
			
		||||
<tbody>
 | 
			
		||||
<tr>
 | 
			
		||||
<td><b>#pos</b>=0,0,0</td>
 | 
			
		||||
<td>vector3</td>
 | 
			
		||||
<td>position camera to 0,0,0 (+userheight in VR)</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td><b>#pos</b>=room</td>
 | 
			
		||||
<td><b>#</b>=room1</td>
 | 
			
		||||
<td>string</td>
 | 
			
		||||
<td>position camera to position of objectname <code>room</code> (+userheight in VR)</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td><b>#rot</b>=0,90,0</td>
 | 
			
		||||
<td>vector3</td>
 | 
			
		||||
<td>rotate camera</td>
 | 
			
		||||
<td>position camera to position of objectname <code>room1</code> (+userheight in VR)</td>
 | 
			
		||||
</tr>
 | 
			
		||||
</tbody>
 | 
			
		||||
</table>
 | 
			
		||||
| 
						 | 
				
			
			@ -755,16 +743,10 @@ The sidecar will define (or <strong>override</strong> already existing) extras,
 | 
			
		|||
<p>Here’s the basic <strong>level1</strong> flow (with optional level2 features):</p>
 | 
			
		||||
 | 
			
		||||
<ol>
 | 
			
		||||
<li>the Y-coordinate of <code>pos</code> identifies the floorposition. This means that desktop-projections usually need to add 1.5m (average person height) on top (which is done automatically by VR/AR headsets), except in case of camera-switching.</li>
 | 
			
		||||
<li>set the position of the camera accordingly to the vector3 values of <code>#pos</code></li>
 | 
			
		||||
<li>if the referenced <code>#pos</code> object is animated, parent the current camera to that object (so it animates too)</li>
 | 
			
		||||
<li><code>rot</code> sets the rotation of the camera (only for non-VR/AR headsets, however a camera-value overrules this)</li>
 | 
			
		||||
<li><strong>level2</strong>: mediafragment <code>t</code> in the top-URL sets the playbackspeed and animation-range of the global scene animation</li>
 | 
			
		||||
<li>before scene load: the scene is cleared</li>
 | 
			
		||||
<li><strong>level2</strong>: after scene load: in case the scene (rootnode) contains an <code>#</code> default view with a fragment value: execute non-positional fragments via the hashbus (no top-level URL change)</li>
 | 
			
		||||
<li><strong>level2</strong>: after scene load: in case the scene (rootnode) contains an <code>#</code> default view with a fragment value: execute positional fragment via the hashbus + update top-level URL</li>
 | 
			
		||||
<li><strong>level2</strong>: in case of no default <code>#</code> view on the scene (rootnode), default player(rig) position <code>0,0,0</code> is assumed.</li>
 | 
			
		||||
<li>in case a <code>href</code> does not mention any <code>pos</code>-coordinate, the current position will be assumed</li>
 | 
			
		||||
<li>the Y-coordinate of `room1 identifies the floorposition. This means that desktop-projections usually need to add 1.5m (average person height) on top (which is done automatically by VR/AR headsets), except in case of camera-switching.</li>
 | 
			
		||||
<li>set the position of the camera accordingly to the vector3 values of <code>room1</code></li>
 | 
			
		||||
<li>if the referenced <code>#room1</code> object is animated, parent the current camera to that object (so it animates too)</li>
 | 
			
		||||
<li>in case a <code>href</code> does not mention any 3D object, the current position will be assumed</li>
 | 
			
		||||
</ol>
 | 
			
		||||
 | 
			
		||||
<p>Here’s an ascii representation of a 3D scene-graph which contains 3D objects <code>◻</code> and their metadata:</p>
 | 
			
		||||
| 
						 | 
				
			
			@ -786,6 +768,17 @@ The sidecar will define (or <strong>override</strong> already existing) extras,
 | 
			
		|||
<p>An XR Fragment-compatible browser viewing this scene, allows the end-user to interact with the <code>buttonA</code> and <code>buttonB</code>.<br>
 | 
			
		||||
In case of <code>buttonA</code> the end-user will be teleported to another location and time in the <strong>current loaded scene</strong>, but <code>buttonB</code> will <strong>replace the current scene</strong> with a new one, like <code>other.fbx</code>, and assume camera coordinate <code>0,0,0</code></p>
 | 
			
		||||
 | 
			
		||||
<p><strong>Non-normative</strong>:</p>
 | 
			
		||||
 | 
			
		||||
<ol start="5">
 | 
			
		||||
<li><code>rot</code> sets the rotation of the camera (only for non-VR/AR headsets, however a camera-value overrules this)</li>
 | 
			
		||||
<li><strong>level2</strong>: mediafragment <code>t</code> in the top-URL sets the playbackspeed and animation-range of the global scene animation</li>
 | 
			
		||||
<li>before scene load: the scene is cleared</li>
 | 
			
		||||
<li><strong>level2</strong>: after scene load: in case the scene (rootnode) contains an <code>#</code> default view with a fragment value: execute non-positional fragments via the hashbus (no top-level URL change)</li>
 | 
			
		||||
<li><strong>level2</strong>: after scene load: in case the scene (rootnode) contains an <code>#</code> default view with a fragment value: execute positional fragment via the hashbus + update top-level URL</li>
 | 
			
		||||
<li><strong>level2</strong>: in case of no default <code>#</code> view on the scene (rootnode), default player(rig) position <code>0,0,0</code> is assumed.</li>
 | 
			
		||||
</ol>
 | 
			
		||||
 | 
			
		||||
<h1 id="top-level-url-processing">Top-level URL processing</h1>
 | 
			
		||||
 | 
			
		||||
<blockquote>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -442,25 +442,17 @@ Example URI's:
 | 
			
		|||
 | 
			
		||||
| fragment | type | functionality |
 | 
			
		||||
|----------|--------|------------------------------|
 | 
			
		||||
| <b>#pos</b>=0,0,0 | vector3 |position camera to 0,0,0 (+userheight in VR)  |
 | 
			
		||||
| <b>#pos</b>=room | string | position camera to position of objectname `room` (+userheight in VR) |
 | 
			
		||||
| <b>#rot</b>=0,90,0 | vector3 | rotate camera    |
 | 
			
		||||
| <b>#</b>=room1 | string | position camera to position of objectname `room1` (+userheight in VR) |
 | 
			
		||||
 | 
			
		||||
[» example implementation](https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/three/xrf/pos.js)<br>
 | 
			
		||||
[» discussion](https://github.com/coderofsalvation/xrfragment/issues/5)<br>
 | 
			
		||||
 | 
			
		||||
Here's the basic **level1** flow (with optional level2 features): 
 | 
			
		||||
 | 
			
		||||
1. the Y-coordinate of `pos` identifies the floorposition. This means that desktop-projections usually need to add 1.5m (average person height) on top (which is done automatically by VR/AR headsets), except in case of camera-switching.
 | 
			
		||||
2. set the position of the camera accordingly to the vector3 values of `#pos`
 | 
			
		||||
3. if the referenced `#pos` object is animated, parent the current camera to that object (so it animates too)
 | 
			
		||||
4. `rot` sets the rotation of the camera (only for non-VR/AR headsets, however a camera-value overrules this)
 | 
			
		||||
5. **level2**: mediafragment `t` in the top-URL sets the playbackspeed and animation-range of the global scene animation
 | 
			
		||||
6. before scene load: the scene is cleared
 | 
			
		||||
7. **level2**: after scene load: in case the scene (rootnode) contains an `#` default view with a fragment value: execute non-positional fragments via the hashbus (no top-level URL change)
 | 
			
		||||
8. **level2**: after scene load: in case the scene (rootnode) contains an `#` default view with a fragment value: execute positional fragment via the hashbus + update top-level URL
 | 
			
		||||
9. **level2**: in case of no default `#` view on the scene (rootnode), default player(rig) position `0,0,0` is assumed.
 | 
			
		||||
10. in case a `href` does not mention any `pos`-coordinate, the current position will be assumed 
 | 
			
		||||
1. the Y-coordinate of `room1 identifies the floorposition. This means that desktop-projections usually need to add 1.5m (average person height) on top (which is done automatically by VR/AR headsets), except in case of camera-switching.
 | 
			
		||||
2. set the position of the camera accordingly to the vector3 values of `room1`
 | 
			
		||||
3. if the referenced `#room1` object is animated, parent the current camera to that object (so it animates too)
 | 
			
		||||
4. in case a `href` does not mention any 3D object, the current position will be assumed 
 | 
			
		||||
 | 
			
		||||
Here's an ascii representation of a 3D scene-graph which contains 3D objects `◻` and their metadata:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -482,6 +474,15 @@ Here's an ascii representation of a 3D scene-graph which contains 3D objects `
 | 
			
		|||
An XR Fragment-compatible browser viewing this scene, allows the end-user to interact with the `buttonA` and `buttonB`.<br>
 | 
			
		||||
In case of `buttonA` the end-user will be teleported to another location and time in the **current loaded scene**, but `buttonB` will **replace the current scene** with a new one, like `other.fbx`, and assume camera coordinate `0,0,0`
 | 
			
		||||
 | 
			
		||||
**Non-normative**:
 | 
			
		||||
 | 
			
		||||
5. `rot` sets the rotation of the camera (only for non-VR/AR headsets, however a camera-value overrules this)
 | 
			
		||||
6. **level2**: mediafragment `t` in the top-URL sets the playbackspeed and animation-range of the global scene animation
 | 
			
		||||
7. before scene load: the scene is cleared
 | 
			
		||||
8. **level2**: after scene load: in case the scene (rootnode) contains an `#` default view with a fragment value: execute non-positional fragments via the hashbus (no top-level URL change)
 | 
			
		||||
9. **level2**: after scene load: in case the scene (rootnode) contains an `#` default view with a fragment value: execute positional fragment via the hashbus + update top-level URL
 | 
			
		||||
10. **level2**: in case of no default `#` view on the scene (rootnode), default player(rig) position `0,0,0` is assumed.
 | 
			
		||||
 | 
			
		||||
# Top-level URL processing
 | 
			
		||||
 | 
			
		||||
> Example URL:  `://foo/world.gltf#room1&t=10`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -870,20 +870,14 @@ Internet-Draft                XR Fragments                September 2025
 | 
			
		|||
 | 
			
		||||
11.  Navigating 3D
 | 
			
		||||
 | 
			
		||||
        +====================+=========+==========================+
 | 
			
		||||
        | fragment           | type    | functionality            |
 | 
			
		||||
        +====================+=========+==========================+
 | 
			
		||||
        | <b>#pos</b>=0,0,0  | vector3 | position camera to 0,0,0 |
 | 
			
		||||
        |                    |         | (+userheight in VR)      |
 | 
			
		||||
        +--------------------+---------+--------------------------+
 | 
			
		||||
        | <b>#pos</b>=room   | string  | position camera to       |
 | 
			
		||||
        |                    |         | position of objectname   |
 | 
			
		||||
        |                    |         | room (+userheight in VR) |
 | 
			
		||||
        +--------------------+---------+--------------------------+
 | 
			
		||||
        | <b>#rot</b>=0,90,0 | vector3 | rotate camera            |
 | 
			
		||||
        +--------------------+---------+--------------------------+
 | 
			
		||||
    +================+========+======================================+
 | 
			
		||||
    | fragment       | type   | functionality                        |
 | 
			
		||||
    +================+========+======================================+
 | 
			
		||||
    | <b>#</b>=room1 | string | position camera to position of       |
 | 
			
		||||
    |                |        | objectname room1 (+userheight in VR) |
 | 
			
		||||
    +----------------+--------+--------------------------------------+
 | 
			
		||||
 | 
			
		||||
                                  Table 7
 | 
			
		||||
                                 Table 7
 | 
			
		||||
 | 
			
		||||
   » example implementation
 | 
			
		||||
   (https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/
 | 
			
		||||
| 
						 | 
				
			
			@ -891,6 +885,12 @@ Internet-Draft                XR Fragments                September 2025
 | 
			
		|||
   » discussion (https://github.com/coderofsalvation/xrfragment/
 | 
			
		||||
   issues/5)
 | 
			
		||||
 | 
			
		||||
   Here's the basic *level1* flow (with optional level2 features):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
van Kammen                Expires 5 March 2026                 [Page 16]
 | 
			
		||||
| 
						 | 
				
			
			@ -898,31 +898,16 @@ van Kammen                Expires 5 March 2026                 [Page 16]
 | 
			
		|||
Internet-Draft                XR Fragments                September 2025
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   Here's the basic *level1* flow (with optional level2 features):
 | 
			
		||||
 | 
			
		||||
   1.   the Y-coordinate of pos identifies the floorposition.  This
 | 
			
		||||
        means that desktop-projections usually need to add 1.5m (average
 | 
			
		||||
        person height) on top (which is done automatically by VR/AR
 | 
			
		||||
        headsets), except in case of camera-switching.
 | 
			
		||||
   2.   set the position of the camera accordingly to the vector3 values
 | 
			
		||||
        of #pos
 | 
			
		||||
   3.   if the referenced #pos object is animated, parent the current
 | 
			
		||||
        camera to that object (so it animates too)
 | 
			
		||||
   4.   rot sets the rotation of the camera (only for non-VR/AR
 | 
			
		||||
        headsets, however a camera-value overrules this)
 | 
			
		||||
   5.   *level2*: mediafragment t in the top-URL sets the playbackspeed
 | 
			
		||||
        and animation-range of the global scene animation
 | 
			
		||||
   6.   before scene load: the scene is cleared
 | 
			
		||||
   7.   *level2*: after scene load: in case the scene (rootnode)
 | 
			
		||||
        contains an # default view with a fragment value: execute non-
 | 
			
		||||
        positional fragments via the hashbus (no top-level URL change)
 | 
			
		||||
   8.   *level2*: after scene load: in case the scene (rootnode)
 | 
			
		||||
        contains an # default view with a fragment value: execute
 | 
			
		||||
        positional fragment via the hashbus + update top-level URL
 | 
			
		||||
   9.   *level2*: in case of no default # view on the scene (rootnode),
 | 
			
		||||
        default player(rig) position 0,0,0 is assumed.
 | 
			
		||||
   10.  in case a href does not mention any pos-coordinate, the current
 | 
			
		||||
        position will be assumed
 | 
			
		||||
   1.  the Y-coordinate of `room1 identifies the floorposition.  This
 | 
			
		||||
       means that desktop-projections usually need to add 1.5m (average
 | 
			
		||||
       person height) on top (which is done automatically by VR/AR
 | 
			
		||||
       headsets), except in case of camera-switching.
 | 
			
		||||
   2.  set the position of the camera accordingly to the vector3 values
 | 
			
		||||
       of room1
 | 
			
		||||
   3.  if the referenced #room1 object is animated, parent the current
 | 
			
		||||
       camera to that object (so it animates too)
 | 
			
		||||
   4.  in case a href does not mention any 3D object, the current
 | 
			
		||||
       position will be assumed
 | 
			
		||||
 | 
			
		||||
   Here's an ascii representation of a 3D scene-graph which contains 3D
 | 
			
		||||
   objects ◻ and their metadata:
 | 
			
		||||
| 
						 | 
				
			
			@ -946,6 +931,21 @@ Internet-Draft                XR Fragments                September 2025
 | 
			
		|||
   *replace the current scene* with a new one, like other.fbx, and
 | 
			
		||||
   assume camera coordinate 0,0,0
 | 
			
		||||
 | 
			
		||||
   *Non-normative*:
 | 
			
		||||
 | 
			
		||||
   5.  rot sets the rotation of the camera (only for non-VR/AR headsets,
 | 
			
		||||
       however a camera-value overrules this)
 | 
			
		||||
   6.  *level2*: mediafragment t in the top-URL sets the playbackspeed
 | 
			
		||||
       and animation-range of the global scene animation
 | 
			
		||||
   7.  before scene load: the scene is cleared
 | 
			
		||||
   8.  *level2*: after scene load: in case the scene (rootnode) contains
 | 
			
		||||
       an # default view with a fragment value: execute non-positional
 | 
			
		||||
       fragments via the hashbus (no top-level URL change)
 | 
			
		||||
   9.  *level2*: after scene load: in case the scene (rootnode) contains
 | 
			
		||||
       an # default view with a fragment value: execute positional
 | 
			
		||||
       fragment via the hashbus + update top-level URL
 | 
			
		||||
   10. *level2*: in case of no default # view on the scene (rootnode),
 | 
			
		||||
       default player(rig) position 0,0,0 is assumed.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -610,21 +610,9 @@ The sidecar will define (or <strong>override</strong> already existing) extras,
 | 
			
		|||
 | 
			
		||||
<tbody>
 | 
			
		||||
<tr>
 | 
			
		||||
<td><b>#pos</b>=0,0,0</td>
 | 
			
		||||
<td>vector3</td>
 | 
			
		||||
<td>position camera to 0,0,0 (+userheight in VR)</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td><b>#pos</b>=room</td>
 | 
			
		||||
<td><b>#</b>=room1</td>
 | 
			
		||||
<td>string</td>
 | 
			
		||||
<td>position camera to position of objectname <tt>room</tt> (+userheight in VR)</td>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td><b>#rot</b>=0,90,0</td>
 | 
			
		||||
<td>vector3</td>
 | 
			
		||||
<td>rotate camera</td>
 | 
			
		||||
<td>position camera to position of objectname <tt>room1</tt> (+userheight in VR)</td>
 | 
			
		||||
</tr>
 | 
			
		||||
</tbody>
 | 
			
		||||
</table><t><eref target="https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/three/xrf/pos.js">» example implementation</eref><br />
 | 
			
		||||
| 
						 | 
				
			
			@ -634,16 +622,10 @@ The sidecar will define (or <strong>override</strong> already existing) extras,
 | 
			
		|||
<t>Here's the basic <strong>level1</strong> flow (with optional level2 features):</t>
 | 
			
		||||
 | 
			
		||||
<ol spacing="compact">
 | 
			
		||||
<li>the Y-coordinate of <tt>pos</tt> identifies the floorposition. This means that desktop-projections usually need to add 1.5m (average person height) on top (which is done automatically by VR/AR headsets), except in case of camera-switching.</li>
 | 
			
		||||
<li>set the position of the camera accordingly to the vector3 values of <tt>#pos</tt></li>
 | 
			
		||||
<li>if the referenced <tt>#pos</tt> object is animated, parent the current camera to that object (so it animates too)</li>
 | 
			
		||||
<li><tt>rot</tt> sets the rotation of the camera (only for non-VR/AR headsets, however a camera-value overrules this)</li>
 | 
			
		||||
<li><strong>level2</strong>: mediafragment <tt>t</tt> in the top-URL sets the playbackspeed and animation-range of the global scene animation</li>
 | 
			
		||||
<li>before scene load: the scene is cleared</li>
 | 
			
		||||
<li><strong>level2</strong>: after scene load: in case the scene (rootnode) contains an <tt>#</tt> default view with a fragment value: execute non-positional fragments via the hashbus (no top-level URL change)</li>
 | 
			
		||||
<li><strong>level2</strong>: after scene load: in case the scene (rootnode) contains an <tt>#</tt> default view with a fragment value: execute positional fragment via the hashbus + update top-level URL</li>
 | 
			
		||||
<li><strong>level2</strong>: in case of no default <tt>#</tt> view on the scene (rootnode), default player(rig) position <tt>0,0,0</tt> is assumed.</li>
 | 
			
		||||
<li>in case a <tt>href</tt> does not mention any <tt>pos</tt>-coordinate, the current position will be assumed</li>
 | 
			
		||||
<li>the Y-coordinate of `room1 identifies the floorposition. This means that desktop-projections usually need to add 1.5m (average person height) on top (which is done automatically by VR/AR headsets), except in case of camera-switching.</li>
 | 
			
		||||
<li>set the position of the camera accordingly to the vector3 values of <tt>room1</tt></li>
 | 
			
		||||
<li>if the referenced <tt>#room1</tt> object is animated, parent the current camera to that object (so it animates too)</li>
 | 
			
		||||
<li>in case a <tt>href</tt> does not mention any 3D object, the current position will be assumed</li>
 | 
			
		||||
</ol>
 | 
			
		||||
<t>Here's an ascii representation of a 3D scene-graph which contains 3D objects <tt>◻</tt> and their metadata:</t>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -664,6 +646,16 @@ The sidecar will define (or <strong>override</strong> already existing) extras,
 | 
			
		|||
<t>An XR Fragment-compatible browser viewing this scene, allows the end-user to interact with the <tt>buttonA</tt> and <tt>buttonB</tt>.<br />
 | 
			
		||||
 | 
			
		||||
In case of <tt>buttonA</tt> the end-user will be teleported to another location and time in the <strong>current loaded scene</strong>, but <tt>buttonB</tt> will <strong>replace the current scene</strong> with a new one, like <tt>other.fbx</tt>, and assume camera coordinate <tt>0,0,0</tt></t>
 | 
			
		||||
<t><strong>Non-normative</strong>:</t>
 | 
			
		||||
 | 
			
		||||
<ol spacing="compact" start="5">
 | 
			
		||||
<li><tt>rot</tt> sets the rotation of the camera (only for non-VR/AR headsets, however a camera-value overrules this)</li>
 | 
			
		||||
<li><strong>level2</strong>: mediafragment <tt>t</tt> in the top-URL sets the playbackspeed and animation-range of the global scene animation</li>
 | 
			
		||||
<li>before scene load: the scene is cleared</li>
 | 
			
		||||
<li><strong>level2</strong>: after scene load: in case the scene (rootnode) contains an <tt>#</tt> default view with a fragment value: execute non-positional fragments via the hashbus (no top-level URL change)</li>
 | 
			
		||||
<li><strong>level2</strong>: after scene load: in case the scene (rootnode) contains an <tt>#</tt> default view with a fragment value: execute positional fragment via the hashbus + update top-level URL</li>
 | 
			
		||||
<li><strong>level2</strong>: in case of no default <tt>#</tt> view on the scene (rootnode), default player(rig) position <tt>0,0,0</tt> is assumed.</li>
 | 
			
		||||
</ol>
 | 
			
		||||
</section>
 | 
			
		||||
 | 
			
		||||
<section anchor="top-level-url-processing"><name>Top-level URL processing</name>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue