updated VP's in doc

This commit is contained in:
Leon van Kammen 2024-09-20 16:53:07 +02:00
parent de5fe7002a
commit c813a45eb1
4 changed files with 718 additions and 331 deletions

View file

@ -80,7 +80,7 @@ value: draft-XRFRAGMENTS-leonvankammen-00
<h1 class="special" id="abstract">Abstract</h1> <h1 class="special" id="abstract">Abstract</h1>
<p>This draft is a specification for 4D URI&rsquo;s &amp; <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> navigation, to enable a spatial web for hypermedia browsers with- or without a network-connection.<br> <p>This draft is a specification for interactive URI-controllable 3D files, enabling <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> navigation, to enable a spatial web for hypermedia browsers with- or without a network-connection.<br>
The specification uses <a href="https://www.w3.org/TR/media-frags/">W3C Media Fragments</a> and <a href="https://www.rfc-editor.org/rfc/rfc6570">URI Templates (RFC6570)</a> to promote spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br> The specification uses <a href="https://www.w3.org/TR/media-frags/">W3C Media Fragments</a> and <a href="https://www.rfc-editor.org/rfc/rfc6570">URI Templates (RFC6570)</a> to promote spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br>
XR Fragments allows us to better use existing metadata inside 3D scene(files), by connecting it to proven technologies like <a href="https://en.wikipedia.org/wiki/URI_fragment">URI Fragments</a>.<br> XR Fragments allows us to better use existing metadata inside 3D scene(files), by connecting it to proven technologies like <a href="https://en.wikipedia.org/wiki/URI_fragment">URI Fragments</a>.<br>
XR Fragments views spatial webs thru the lens of 3D scene URI&rsquo;s, rather than thru code(frameworks) or protocol-specific browsers (webbrowser e.g.).</p> XR Fragments views spatial webs thru the lens of 3D scene URI&rsquo;s, rather than thru code(frameworks) or protocol-specific browsers (webbrowser e.g.).</p>
@ -1281,90 +1281,97 @@ The XR Fragment-compatible browser can let the enduser access visual-meta(data)-
<p>Environment mapping is crucial for creating realistic reflections and lighting effects on 3D objects. <p>Environment mapping is crucial for creating realistic reflections and lighting effects on 3D objects.
To apply environment mapping efficiently in a 3D scene, traverse the scene graph and assign each object&rsquo;s environment map based on the nearest ancestor&rsquo;s texture map. This ensures that objects inherit the correct environment mapping from their closest parent with a texture, enhancing the visual consistency and realism.</p> To apply environment mapping efficiently in a 3D scene, traverse the scene graph and assign each object&rsquo;s environment map based on the nearest ancestor&rsquo;s texture map. This ensures that objects inherit the correct environment mapping from their closest parent with a texture, enhancing the visual consistency and realism.</p>
<p>&rdquo;&ldquo;&rdquo; <pre><code> +--------------------------------+
+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&ndash;+<br> | |
| |<br> | index.usdz |
| index.usdz |<br> | │ |
| │ |<br>
| └── ◻ sphere (texture:foo) | | └── ◻ sphere (texture:foo) |
| └ ◻ cube (texture:bar) | envMap = foo | └ ◻ cube (texture:bar) | envMap = foo
| └ ◻ cylinder | envMap = bar | └ ◻ cylinder | envMap = bar
+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&ndash;+</p> +--------------------------------+
<pre><code>
Most 3D viewers apply one and the same environment map for various models, however this logic
allows a more natural &amp; automatic strategy for reflection mapping.
# Transclusion (broken link) resolution
In spirit of Ted Nelson's 'transclusion resolution', there's a soft-mechanism to harden links &amp; minimize broken links in various ways:
1. defining a different transport protocol (https vs ipfs or DAT) in `src` or `href` values can make a difference
2. mirroring files on another protocol using (HTTP) errorcode tags in `src` or `href` properties
3. in case of `src`: nesting a copy of the embedded object in the placeholder object (`embeddedObject`) will not be replaced when the request fails
&gt; due to the popularity, maturity and extensiveness of HTTP codes for client/server communication, non-HTTP protocols easily map to HTTP codes (ipfs ERR_NOT_FOUND maps to 404 e.g.)
For example:
</code></pre> </code></pre>
<p>+────────────────────────────────────────────────────────+ <p>Most 3D viewers apply one and the same environment map for various models, however this logic
allows a more natural &amp; automatic strategy for reflection mapping.</p>
<h1 id="transclusion-broken-link-resolution">Transclusion (broken link) resolution</h1>
<p>In spirit of Ted Nelson&rsquo;s &lsquo;transclusion resolution&rsquo;, there&rsquo;s a soft-mechanism to harden links &amp; minimize broken links in various ways:</p>
<ol>
<li>defining a different transport protocol (https vs ipfs or DAT) in <code>src</code> or <code>href</code> values can make a difference</li>
<li>mirroring files on another protocol using (HTTP) errorcode tags in <code>src</code> or <code>href</code> properties</li>
<li>in case of <code>src</code>: nesting a copy of the embedded object in the placeholder object (<code>embeddedObject</code>) will not be replaced when the request fails</li>
</ol>
<blockquote>
<p>due to the popularity, maturity and extensiveness of HTTP codes for client/server communication, non-HTTP protocols easily map to HTTP codes (ipfs ERR_NOT_FOUND maps to 404 e.g.)</p>
</blockquote>
<p>For example:</p>
<pre><code> +────────────────────────────────────────────────────────+
│ │ │ │
│ index.gltf │ │ index.gltf │
│ │ │ │ │ │
│ │ #: #-offlinetext │ │ │ #: #-offlinetext │
│ │ │ │ │ │
│ ├── ◻ buttonA │ │ ├── ◻ buttonA │
│ │ └ href: <a href="http://foo.io/campagne.fbx">http://foo.io/campagne.fbx</a> │ │ └ href: http://foo.io/campagne.fbx │
│ │ └ href@404: ipfs://foo.io/campagne.fbx │ │ │ └ href@404: ipfs://foo.io/campagne.fbx │
│ │ └ href@400: #clienterrortext │ │ │ └ href@400: #clienterrortext │
│ │ └ ◻ offlinetext │ │ │ └ ◻ offlinetext │
│ │ │ │ │ │
│ └── ◻ embeddedObject &lt;&mdash;&mdash;&mdash; the meshdata inside embeddedObject will (not) │ └── ◻ embeddedObject &lt;--------- the meshdata inside embeddedObject will (not)
│ └ src: <a href="https://foo.io/bar.gltf">https://foo.io/bar.gltf</a> │ be flushed when the request (does not) succeed. │ └ src: https://foo.io/bar.gltf │ be flushed when the request (does not) succeed.
│ └ src@404: <a href="http://foo.io/bar.gltf">http://foo.io/bar.gltf</a> │ So worstcase the 3D data (of the time of publishing index.gltf) │ └ src@404: http://foo.io/bar.gltf │ So worstcase the 3D data (of the time of publishing index.gltf)
│ └ src@400: <a href="https://archive.org/l2kj43.gltf">https://archive.org/l2kj43.gltf</a> │ will be displayed. │ └ src@400: https://archive.org/l2kj43.gltf │ will be displayed.
│ │ │ │
+────────────────────────────────────────────────────────+</p> +────────────────────────────────────────────────────────+
<pre><code>
# Topic-based index-less Webrings
As hashtags in URLs map to the XWRG, `href`-values can be used to promote topic-based index-less webrings.&lt;br&gt;
Consider 3D scenes linking to eachother using these `href` values:
* `href: schoolA.edu/projects.gltf#math`
* `href: schoolB.edu/projects.gltf#math`
* `href: university.edu/projects.gltf#math`
These links would all show visible links to math-tagged objects in the scene.&lt;br&gt;
To filter out non-related objects one could take it a step further using filters:
* `href: schoolA.edu/projects.gltf#math&amp;-topics math`
* `href: schoolB.edu/projects.gltf#math&amp;-courses math`
* `href: university.edu/projects.gltf#math&amp;-theme math`
&gt; This would hide all object tagged with `topic`, `courses` or `theme` (including math) so that later only objects tagged with `math` will be visible
This makes spatial content multi-purpose, without the need to separate content into separate files, or show/hide things using a complex logiclayer like javascript.
# URI Templates (RFC6570)
XR Fragments adopts Level1 URI **Fragment** expansion to provide safe interactivity.&lt;br&gt;
The following demonstrates a simple video player:
</code></pre> </code></pre>
<p>+─────────────────────────────────────────────+ <h1 id="topic-based-index-less-webrings">Topic-based index-less Webrings</h1>
<p>As hashtags in URLs map to the XWRG, <code>href</code>-values can be used to promote topic-based index-less webrings.<br>
Consider 3D scenes linking to eachother using these <code>href</code> values:</p>
<ul>
<li><code>href: schoolA.edu/projects.gltf#math</code></li>
<li><code>href: schoolB.edu/projects.gltf#math</code></li>
<li><code>href: university.edu/projects.gltf#math</code></li>
</ul>
<p>These links would all show visible links to math-tagged objects in the scene.<br>
To filter out non-related objects one could take it a step further using filters:</p>
<ul>
<li><code>href: schoolA.edu/projects.gltf#math&amp;-topics math</code></li>
<li><code>href: schoolB.edu/projects.gltf#math&amp;-courses math</code></li>
<li><code>href: university.edu/projects.gltf#math&amp;-theme math</code></li>
</ul>
<blockquote>
<p>This would hide all object tagged with <code>topic</code>, <code>courses</code> or <code>theme</code> (including math) so that later only objects tagged with <code>math</code> will be visible</p>
</blockquote>
<p>This makes spatial content multi-purpose, without the need to separate content into separate files, or show/hide things using a complex logiclayer like javascript.</p>
<h1 id="uri-templates-rfc6570">URI Templates (RFC6570)</h1>
<p>XR Fragments adopts Level1 URI <strong>Fragment</strong> expansion to provide safe interactivity.<br>
The following demonstrates a simple video player:</p>
<pre><code>
+─────────────────────────────────────────────+
│ │ │ │
│ foo.usdz │<br> │ foo.usdz │
│ │ │<br> │ │ │
│ │ │<br> │ │ │
│ ├── ◻ stopbutton │ │ ├── ◻ stopbutton │
│ │ ├ #: #-stopbutton │ │ │ ├ #: #-stopbutton │
│ │ └ href: #player=stop&amp;-stopbutton │ (stop and hide stop-button) │ │ └ href: #player=stop&amp;-stopbutton │ (stop and hide stop-button)
│ │ │<br> │ │ │
│ └── ◻ plane │ │ └── ◻ plane │
│ ├ play: #t=l:0,10 │ │ ├ play: #t=l:0,10 │
│ ├ stop: #t=0,0 │ │ ├ stop: #t=0,0 │
@ -1372,9 +1379,10 @@ The following demonstrates a simple video player:
│ └ src: cat.mp4#{player} │ │ └ src: cat.mp4#{player} │
│ │ │ │
│ │ │ │
+─────────────────────────────────────────────+</p> +─────────────────────────────────────────────+
<p>&rdquo;`</p>
</code></pre>
<h1 id="additional-scene-metadata">Additional scene metadata</h1> <h1 id="additional-scene-metadata">Additional scene metadata</h1>
@ -1499,11 +1507,90 @@ Therefore a 2-button navigation-interface is the bare minimum interface:</p>
<li>the TTS reads the href-value (and/or aria-description if available)</li> <li>the TTS reads the href-value (and/or aria-description if available)</li>
</ol> </ol>
<h2 id="xr-fragment-vendor-prefixes">XR Fragment Vendor Prefixes</h2>
<p>Vendor Prefixes (XRFVP&rsquo;s) allows embedding a 3D file with popular 3D engines/framework-specific features via metadata:</p>
<table>
<thead>
<tr>
<th>what</th>
<th>XR metadata</th>
<th>Lowest common denominator</th>
</tr>
</thead>
<tbody>
<tr>
<td>XR Fragments</td>
<td>vendor-agnostic</td>
<td>camera + 3D object(file) load/embed/click/referencing</td>
</tr>
<tr>
<td>XR Fragments VP&rsquo;s</td>
<td>vendor-<strong>specific</strong></td>
<td>Entity-Component System (ECS)</td>
</tr>
</tbody>
</table>
<p>Vendor-specific metadata in a 3D scenefiles, are similar to vendor-specific <a href="https://en.wikipedia.org/wiki/CSS#Vendor_prefixes">CSS-prefixes</a> (<code>-moz-opacity: 0.2</code> e.g.).
This allows popular 3D engines/frameworks, to initialize specific features when loading a scene/object, in a progressive enhanced way.</p>
<blockquote>
<p>Why? Because not all XR interactions can be solved/standardized by embedding XR Fragments into any 3D file.
Some XR experiences need more than <strong>navigation</strong> and <strong>show/hide/filtering</strong> of objects (via click-state machines).
The lowest common denominator between s that 3D engines use entity-component-system</p>
</blockquote>
<p>For example, the following metadata can be added to a .glb file, to make an object grabbable in AFRAME:</p>
<pre><code>+────────────────────────────────────────────────────────────────────────────────────────────────────────+
│ http://y.io/z.glb | AFRAME app │
│-----------------------------------------------+--------------------------------------------------------│
│ | │
│ | after loading the glb, john can be placed into the │
│ +-[3D mesh]-+ | castle via hands, because the author added metadata to │
│ | / \ | | john via either: │
│ | / \ | | │
│ | / \ | | 1. Blender (custom property-box, no plugins needed) │
│ | |_____| | | │
│ +-----│-----+ | 2. javascript-code: │
│ │ | │
│ ├─ name: castle | for( var com in this.el.components ){ │
│ └─ tag: house baroque | this.el.object3D.userData[`-AFRAME-${com}`] = '' │
│ | } │
│ [3D mesh-+ | // save to z.glb in AFRAME inspector │
│ | ├─ name: john | │
│ | O ├─ age: 23 | │
│ | /|\ ├─ -AFRAME-grabbable: '' | &gt; inits 'grabbable' component on object john │
│ | / \ ├─ -AFRAME-material.color: '#F0A' | &gt; inits 'material' component on object john │
│ | ├─ -AFRAME-text.value: '{name}{age}'| &gt; inits 'text' component (*) with value 'john' │
│ | ├─ -THREE-material.fog: false | &gt; changes material settings in THREE.js app │
│ | ├─ -GODOT-Label3D.text: '{name}{age}'| &gt; inits 'Label3D' component (*) in Godot │
│ +--------+ | │
│ | │
├─ -AFRAME-version: '1.6.0' | &gt;
├─ -GODOT-version: '4.3' | &gt; exporters/authors can report targeted version │
│ | │
+────────────────────────────────────────────────────────────────────────────────────────────────────────+
</code></pre>
<ul>
<li>key/value syntax: -<code>&lt;vendorname&gt;</code>-<code>&lt;component|version&gt;</code>.<code>&lt;key&gt;</code> <code>[string/boolean/float/int]</code>-value</li>
</ul>
<p>String-templatevalues are evaluated as per <a href="https://www.rfc-editor.org/rfc/rfc6570">URI Templates (RFC6570)</a> Level 1.</p>
<blockquote>
<p>This &lsquo;separating of mechanism from policy&rsquo; (unix rule) does <strong>somewhat</strong> break portability of an XR experience, but still prevents (E-waste of) handcoded virtual worlds. It allows for (XR experience) metadata to survive in future 3D engines and scene-fileformats.</p>
</blockquote>
<h1 id="security-considerations">Security Considerations</h1> <h1 id="security-considerations">Security Considerations</h1>
<p>The only dynamic parts are <a href="https://www.w3.org/TR/media-frags/">W3C Media Fragments</a> and <a href="https://www.rfc-editor.org/rfc/rfc6570">URI Templates (RFC6570)</a>.<br> <p>The only dynamic parts are <a href="https://www.w3.org/TR/media-frags/">W3C Media Fragments</a> and <a href="https://www.rfc-editor.org/rfc/rfc6570">URI Templates (RFC6570)</a>.<br>
The use of URI Templates is limited to pre-defined variables and Level0 fragments-expansion only, which makes it quite safe.<br> The use of URI Templates is limited to pre-defined variables and Level0 fragments-expansion only, which makes it quite safe.<br>
In fact, it is much safer than relying on a scripting language (javascript) which can change URN too.</p> n fact, it is much safer than relying on a scripting language (javascript) which can change URN too.</p>
<h1 id="faq">FAQ</h1> <h1 id="faq">FAQ</h1>

View file

@ -93,7 +93,7 @@ value: draft-XRFRAGMENTS-leonvankammen-00
.# Abstract .# Abstract
This draft is a specification for 4D URI's & [hypermediatic](https://github.com/coderofsalvation/hypermediatic) navigation, to enable a spatial web for hypermedia browsers with- or without a network-connection.<br> This draft is a specification for interactive URI-controllable 3D files, enabling [hypermediatic](https://github.com/coderofsalvation/hypermediatic) navigation, to enable a spatial web for hypermedia browsers with- or without a network-connection.<br>
The specification uses [W3C Media Fragments](https://www.w3.org/TR/media-frags/) and [URI Templates (RFC6570)](https://www.rfc-editor.org/rfc/rfc6570) to promote spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br> The specification uses [W3C Media Fragments](https://www.w3.org/TR/media-frags/) and [URI Templates (RFC6570)](https://www.rfc-editor.org/rfc/rfc6570) to promote spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br>
XR Fragments allows us to better use existing metadata inside 3D scene(files), by connecting it to proven technologies like [URI Fragments](https://en.wikipedia.org/wiki/URI_fragment).<br> XR Fragments allows us to better use existing metadata inside 3D scene(files), by connecting it to proven technologies like [URI Fragments](https://en.wikipedia.org/wiki/URI_fragment).<br>
XR Fragments views spatial webs thru the lens of 3D scene URI's, rather than thru code(frameworks) or protocol-specific browsers (webbrowser e.g.). XR Fragments views spatial webs thru the lens of 3D scene URI's, rather than thru code(frameworks) or protocol-specific browsers (webbrowser e.g.).
@ -791,7 +791,7 @@ For usecases like importing/exporting/p2p casting a scene, the issue of external
Environment mapping is crucial for creating realistic reflections and lighting effects on 3D objects. Environment mapping is crucial for creating realistic reflections and lighting effects on 3D objects.
To apply environment mapping efficiently in a 3D scene, traverse the scene graph and assign each object's environment map based on the nearest ancestor's texture map. This ensures that objects inherit the correct environment mapping from their closest parent with a texture, enhancing the visual consistency and realism. To apply environment mapping efficiently in a 3D scene, traverse the scene graph and assign each object's environment map based on the nearest ancestor's texture map. This ensures that objects inherit the correct environment mapping from their closest parent with a texture, enhancing the visual consistency and realism.
`````` ```
+--------------------------------+ +--------------------------------+
| | | |
| index.usdz | | index.usdz |
@ -955,11 +955,67 @@ Therefore a 2-button navigation-interface is the bare minimum interface:
2. objects with href metadata can be activated via a key (enter on a keyboard) 2. objects with href metadata can be activated via a key (enter on a keyboard)
3. the TTS reads the href-value (and/or aria-description if available) 3. the TTS reads the href-value (and/or aria-description if available)
## XR Fragment Vendor Prefixes
Vendor Prefixes (XRFVP's) allows embedding a 3D file with popular 3D engines/framework-specific features via metadata:
| what | XR metadata | Lowest common denominator |
|------------------|---------------------|-------------------------------------------------------|
| XR Fragments | vendor-agnostic | camera + 3D object(file) load/embed/click/referencing |
| XR Fragments VP's| vendor-**specific** | Entity-Component System (ECS) |
Vendor-specific metadata in a 3D scenefiles, are similar to vendor-specific [CSS-prefixes](https://en.wikipedia.org/wiki/CSS#Vendor_prefixes) (`-moz-opacity: 0.2` e.g.).
This allows popular 3D engines/frameworks, to initialize specific features when loading a scene/object, in a progressive enhanced way.
> Why? Because not all XR interactions can be solved/standardized by embedding XR Fragments into any 3D file.
Some XR experiences need more than **navigation** and **show/hide/filtering** of objects (via click-state machines).
The lowest common denominator between s that 3D engines use entity-component-system
For example, the following metadata can be added to a .glb file, to make an object grabbable in AFRAME:
```
+────────────────────────────────────────────────────────────────────────────────────────────────────────+
│ http://y.io/z.glb | AFRAME app │
│-----------------------------------------------+--------------------------------------------------------│
│ | │
│ | after loading the glb, john can be placed into the │
│ +-[3D mesh]-+ | castle via hands, because the author added metadata to │
│ | / \ | | john via either: │
│ | / \ | | │
│ | / \ | | 1. Blender (custom property-box, no plugins needed) │
│ | |_____| | | │
│ +-----│-----+ | 2. javascript-code: │
│ │ | │
│ ├─ name: castle | for( var com in this.el.components ){ │
│ └─ tag: house baroque | this.el.object3D.userData[`-AFRAME-${com}`] = '' │
│ | } │
│ [3D mesh-+ | // save to z.glb in AFRAME inspector │
│ | ├─ name: john | │
│ | O ├─ age: 23 | │
│ | /|\ ├─ -AFRAME-grabbable: '' | > inits 'grabbable' component on object john │
│ | / \ ├─ -AFRAME-material.color: '#F0A' | > inits 'material' component on object john │
│ | ├─ -AFRAME-text.value: '{name}{age}'| > inits 'text' component (*) with value 'john' │
│ | ├─ -THREE-material.fog: false | > changes material settings in THREE.js app │
│ | ├─ -GODOT-Label3D.text: '{name}{age}'| > inits 'Label3D' component (*) in Godot │
│ +--------+ | │
│ | │
├─ -AFRAME-version: '1.6.0' | > │
├─ -GODOT-version: '4.3' | > exporters/authors can report targeted version │
│ | │
+────────────────────────────────────────────────────────────────────────────────────────────────────────+
```
* key/value syntax: -`<vendorname>`-`<component|version>`.`<key>` `[string/boolean/float/int]`-value
String-templatevalues are evaluated as per [URI Templates (RFC6570)](https://www.rfc-editor.org/rfc/rfc6570) Level 1.
> This 'separating of mechanism from policy' (unix rule) does **somewhat** break portability of an XR experience, but still prevents (E-waste of) handcoded virtual worlds. It allows for (XR experience) metadata to survive in future 3D engines and scene-fileformats.
# Security Considerations # Security Considerations
The only dynamic parts are [W3C Media Fragments](https://www.w3.org/TR/media-frags/) and [URI Templates (RFC6570)](https://www.rfc-editor.org/rfc/rfc6570).<br> The only dynamic parts are [W3C Media Fragments](https://www.w3.org/TR/media-frags/) and [URI Templates (RFC6570)](https://www.rfc-editor.org/rfc/rfc6570).<br>
The use of URI Templates is limited to pre-defined variables and Level0 fragments-expansion only, which makes it quite safe.<br> The use of URI Templates is limited to pre-defined variables and Level0 fragments-expansion only, which makes it quite safe.<br>
In fact, it is much safer than relying on a scripting language (javascript) which can change URN too. n fact, it is much safer than relying on a scripting language (javascript) which can change URN too.
# FAQ # FAQ

View file

@ -3,7 +3,7 @@
Jens & Leon Internet Engineering Task Force L.R. van Kammen Jens & Leon Internet Engineering Task Force L.R. van Kammen
Internet-Draft 12 July 2024 Internet-Draft 20 September 2024
Intended status: Informational Intended status: Informational
@ -13,10 +13,10 @@ Intended status: Informational
Abstract Abstract
This draft is a specification for 4D URI's & hypermediatic This draft is a specification for interactive URI-controllable 3D
(https://github.com/coderofsalvation/hypermediatic) navigation, to files, enabling hypermediatic (https://github.com/coderofsalvation/
enable a spatial web for hypermedia browsers with- or without a hypermediatic) navigation, to enable a spatial web for hypermedia
network-connection. browsers with- or without a network-connection.
The specification uses W3C Media Fragments (https://www.w3.org/TR/ The specification uses W3C Media Fragments (https://www.w3.org/TR/
media-frags/) and URI Templates (RFC6570) (https://www.rfc- media-frags/) and URI Templates (RFC6570) (https://www.rfc-
editor.org/rfc/rfc6570) to promote spatial addressibility, sharing, editor.org/rfc/rfc6570) to promote spatial addressibility, sharing,
@ -46,16 +46,16 @@ Status of This Memo
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 13 January 2025. This Internet-Draft will expire on 24 March 2025.
van Kammen Expires 13 January 2025 [Page 1] van Kammen Expires 24 March 2025 [Page 1]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
Copyright Notice Copyright Notice
@ -104,23 +104,27 @@ Table of Contents
17.2. URL and Data URI . . . . . . . . . . . . . . . . . . . . 29 17.2. URL and Data URI . . . . . . . . . . . . . . . . . . . . 29
18. Importing/exporting . . . . . . . . . . . . . . . . . . . . . 30 18. Importing/exporting . . . . . . . . . . . . . . . . . . . . . 30
19. Reflection Mapping . . . . . . . . . . . . . . . . . . . . . 30 19. Reflection Mapping . . . . . . . . . . . . . . . . . . . . . 30
20. Additional scene metadata . . . . . . . . . . . . . . . . . . 31 20. Transclusion (broken link) resolution . . . . . . . . . . . . 30
21. Accessibility interface . . . . . . . . . . . . . . . . . . . 33 21. Topic-based index-less Webrings . . . . . . . . . . . . . . . 31
van Kammen Expires 13 January 2025 [Page 2] van Kammen Expires 24 March 2025 [Page 2]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
21.1. Two-button navigation . . . . . . . . . . . . . . . . . 34 22. URI Templates (RFC6570) . . . . . . . . . . . . . . . . . . . 32
22. Security Considerations . . . . . . . . . . . . . . . . . . . 34 23. Additional scene metadata . . . . . . . . . . . . . . . . . . 32
23. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 24. Accessibility interface . . . . . . . . . . . . . . . . . . . 33
24. authors . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 24.1. Two-button navigation . . . . . . . . . . . . . . . . . 34
25. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 35 24.2. XR Fragment Vendor Prefixes . . . . . . . . . . . . . . 35
26. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 35 25. Security Considerations . . . . . . . . . . . . . . . . . . . 37
27. Appendix: Definitions . . . . . . . . . . . . . . . . . . . . 35 26. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
27. authors . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
28. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 38
29. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 38
30. Appendix: Definitions . . . . . . . . . . . . . . . . . . . . 38
1. Introduction 1. Introduction
@ -161,13 +165,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 24 March 2025 [Page 3]
van Kammen Expires 13 January 2025 [Page 3]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
XR Fragments tries to seek to connect the world of text (semantical XR Fragments tries to seek to connect the world of text (semantical
@ -221,9 +221,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 4] van Kammen Expires 24 March 2025 [Page 4]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
+───────────────────────────────────────────────────────────────────────────────────────────────+ +───────────────────────────────────────────────────────────────────────────────────────────────+
@ -277,9 +277,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 5] van Kammen Expires 24 March 2025 [Page 5]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
* allowing 3D assets/nodes to publish XR Fragments to themselves/ * allowing 3D assets/nodes to publish XR Fragments to themselves/
@ -333,9 +333,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 6] van Kammen Expires 24 March 2025 [Page 6]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
+=========+======================+=====================================+ +=========+======================+=====================================+
@ -389,9 +389,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 7] van Kammen Expires 24 March 2025 [Page 7]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
4. Conventions and Definitions 4. Conventions and Definitions
@ -445,9 +445,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 8] van Kammen Expires 24 March 2025 [Page 8]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
my.io/scene.fbx my.io/scene.fbx
@ -501,9 +501,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 9] van Kammen Expires 24 March 2025 [Page 9]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
|Media Fragments |media fragment |#t=0,2&loop |play (and | |Media Fragments |media fragment |#t=0,2&loop |play (and |
@ -557,9 +557,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 10] van Kammen Expires 24 March 2025 [Page 10]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
6.2. Fragment-to-metadata mapping 6.2. Fragment-to-metadata mapping
@ -613,9 +613,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 11] van Kammen Expires 24 March 2025 [Page 11]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
| | | | |metadata (bar:#t=0 | | | | | |metadata (bar:#t=0 |
@ -669,9 +669,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 12] van Kammen Expires 24 March 2025 [Page 12]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
| temporal | s=x | 1 | set playback | | temporal | s=x | 1 | set playback |
@ -725,9 +725,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 13] van Kammen Expires 24 March 2025 [Page 13]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
| | | | uv | | | | | uv |
@ -781,9 +781,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 14] van Kammen Expires 24 March 2025 [Page 14]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
+──────────────────────────────────────────────────────────+ +──────────────────────────────────────────────────────────+
@ -837,9 +837,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 15] van Kammen Expires 24 March 2025 [Page 15]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
1. the Y-coordinate of pos identifies the floorposition. This means 1. the Y-coordinate of pos identifies the floorposition. This means
@ -893,9 +893,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 16] van Kammen Expires 24 March 2025 [Page 16]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
1. IF a #cube matches a custom property-key (of an object) in the 3D 1. IF a #cube matches a custom property-key (of an object) in the 3D
@ -949,9 +949,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 17] van Kammen Expires 24 March 2025 [Page 17]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
+────────────────────────────────────────────────────────+ +─────────────────────────+ +────────────────────────────────────────────────────────+ +─────────────────────────+
@ -1005,9 +1005,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 18] van Kammen Expires 24 March 2025 [Page 18]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
6. <b>external</b> src values should be served with appropriate 6. <b>external</b> src values should be served with appropriate
@ -1061,9 +1061,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 19] van Kammen Expires 24 March 2025 [Page 19]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
+==========+==================+============================+ +==========+==================+============================+
@ -1117,9 +1117,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 20] van Kammen Expires 24 March 2025 [Page 20]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
» example implementation » example implementation
@ -1173,9 +1173,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 21] van Kammen Expires 24 March 2025 [Page 21]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
* calculate the <b>bounding box</b> of the instanced scene, and * calculate the <b>bounding box</b> of the instanced scene, and
@ -1229,9 +1229,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 22] van Kammen Expires 24 March 2025 [Page 22]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
| NOTE: hardcoded framestart/framestop uses sampleRate/fps of | NOTE: hardcoded framestart/framestop uses sampleRate/fps of
@ -1285,9 +1285,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 23] van Kammen Expires 24 March 2025 [Page 23]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
+==========+==============================================+ +==========+==============================================+
@ -1341,9 +1341,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 24] van Kammen Expires 24 March 2025 [Page 24]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
7. detect exclude keys like -foo (reference regex= /^-/ ) 7. detect exclude keys like -foo (reference regex= /^-/ )
@ -1397,9 +1397,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 25] van Kammen Expires 24 March 2025 [Page 25]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
Instead of just throwing together all kinds media types into one Instead of just throwing together all kinds media types into one
@ -1453,9 +1453,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 26] van Kammen Expires 24 March 2025 [Page 26]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
http://y.io/z.fbx | Derived XRWG (expressed as JSON) http://y.io/z.fbx | Derived XRWG (expressed as JSON)
@ -1509,9 +1509,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 27] van Kammen Expires 24 March 2025 [Page 27]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
* wordmatch *inside* src text * wordmatch *inside* src text
@ -1565,9 +1565,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 28] van Kammen Expires 24 March 2025 [Page 28]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
* out-of-the-box (de)multiplex human text and metadata in one go * out-of-the-box (de)multiplex human text and metadata in one go
@ -1621,9 +1621,9 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 29] van Kammen Expires 24 March 2025 [Page 29]
Internet-Draft XR Fragments July 2024 Internet-Draft XR Fragments September 2024
18. Importing/exporting 18. Importing/exporting
@ -1644,100 +1644,131 @@ Internet-Draft XR Fragments July 2024
from their closest parent with a texture, enhancing the visual from their closest parent with a texture, enhancing the visual
consistency and realism. consistency and realism.
`````` +--------------------------------+ +--------------------------------+
| | | |
| index.usdz | | index.usdz |
| │ | | │ |
| └── ◻ sphere (texture:foo) | | └ ◻ cube (texture:bar) | envMap = | └── ◻ sphere (texture:foo) |
foo | └ ◻ cylinder | envMap = bar +--------------------------------+ | └ ◻ cube (texture:bar) | envMap = foo
| └ ◻ cylinder | envMap = bar
+--------------------------------+
Most 3D viewers apply one and the same environment map for various models, however this logic Most 3D viewers apply one and the same environment map for various
allows a more natural & automatic strategy for reflection mapping. models, however this logic allows a more natural & automatic strategy
for reflection mapping.
# Transclusion (broken link) resolution 20. Transclusion (broken link) resolution
In spirit of Ted Nelson's 'transclusion resolution', there's a soft-mechanism to harden links & minimize broken links in various ways: In spirit of Ted Nelson's 'transclusion resolution', there's a soft-
mechanism to harden links & minimize broken links in various ways:
1. defining a different transport protocol (https vs ipfs or DAT) in `src` or `href` values can make a difference 1. defining a different transport protocol (https vs ipfs or DAT) in
2. mirroring files on another protocol using (HTTP) errorcode tags in `src` or `href` properties src or href values can make a difference
3. in case of `src`: nesting a copy of the embedded object in the placeholder object (`embeddedObject`) will not be replaced when the request fails 2. mirroring files on another protocol using (HTTP) errorcode tags
in src or href properties
3. in case of src: nesting a copy of the embedded object in the
placeholder object (embeddedObject) will not be replaced when the
request fails
| due to the popularity, maturity and extensiveness of HTTP codes
| for client/server communication, non-HTTP protocols easily map to
| HTTP codes (ipfs ERR_NOT_FOUND maps to 404 e.g.)
van Kammen Expires 24 March 2025 [Page 30]
Internet-Draft XR Fragments September 2024
> due to the popularity, maturity and extensiveness of HTTP codes for client/server communication, non-HTTP protocols easily map to HTTP codes (ipfs ERR_NOT_FOUND maps to 404 e.g.)
For example: For example:
+────────────────────────────────────────────────────────+ │ │ │ +────────────────────────────────────────────────────────+
index.gltf │ │ │ │ │ │ #: #-offlinetext │ │ │ │ │ ├── ◻ buttonA │ │ │ │ │
└ href: http://foo.io/campagne.fbx (http://foo.io/campagne.fbx) │ │ │ │ index.gltf │
└ href@404: ipfs://foo.io/campagne.fbx │ │ │ └ href@400: │ │ │
#clienterrortext │ │ │ └ ◻ offlinetext │ │ │ │ │ └── ◻ embeddedObject │ │ #: #-offlinetext │
<--------- the meshdata inside embeddedObject will (not) │ └ src: │ │ │
https://foo.io/bar.gltf (https://foo.io/bar.gltf) │ be flushed when │ ├── ◻ buttonA │
the request (does not) succeed. │ └ src@404: http://foo.io/bar.gltf │ │ └ href: http://foo.io/campagne.fbx │
│ │ └ href@404: ipfs://foo.io/campagne.fbx │
│ │ └ href@400: #clienterrortext │
│ │ └ ◻ offlinetext │
van Kammen Expires 13 January 2025 [Page 30] │ │ │
│ └── ◻ embeddedObject <--------- the meshdata inside embeddedObject will (not)
Internet-Draft XR Fragments July 2024 │ └ src: https://foo.io/bar.gltf │ be flushed when the request (does not) succeed.
│ └ src@404: http://foo.io/bar.gltf │ So worstcase the 3D data (of the time of publishing index.gltf)
│ └ src@400: https://archive.org/l2kj43.gltf │ will be displayed.
(http://foo.io/bar.gltf) │ So worstcase the 3D data (of the time of │ │
publishing index.gltf) │ └ src@400: https://archive.org/l2kj43.gltf
(https://archive.org/l2kj43.gltf) │ will be displayed. │ │
+────────────────────────────────────────────────────────+ +────────────────────────────────────────────────────────+
# Topic-based index-less Webrings 21. Topic-based index-less Webrings
As hashtags in URLs map to the XWRG, `href`-values can be used to promote topic-based index-less webrings.<br> As hashtags in URLs map to the XWRG, href-values can be used to
Consider 3D scenes linking to eachother using these `href` values: promote topic-based index-less webrings.
Consider 3D scenes linking to eachother using these href values:
* `href: schoolA.edu/projects.gltf#math` * href: schoolA.edu/projects.gltf#math
* `href: schoolB.edu/projects.gltf#math` * href: schoolB.edu/projects.gltf#math
* `href: university.edu/projects.gltf#math` * href: university.edu/projects.gltf#math
These links would all show visible links to math-tagged objects in the scene.<br> These links would all show visible links to math-tagged objects in
To filter out non-related objects one could take it a step further using filters: the scene.
To filter out non-related objects one could take it a step further
using filters:
* `href: schoolA.edu/projects.gltf#math&-topics math` * href: schoolA.edu/projects.gltf#math&-topics math
* `href: schoolB.edu/projects.gltf#math&-courses math` * href: schoolB.edu/projects.gltf#math&-courses math
* `href: university.edu/projects.gltf#math&-theme math` * href: university.edu/projects.gltf#math&-theme math
> This would hide all object tagged with `topic`, `courses` or `theme` (including math) so that later only objects tagged with `math` will be visible | This would hide all object tagged with topic, courses or theme
| (including math) so that later only objects tagged with math will
| be visible
This makes spatial content multi-purpose, without the need to separate content into separate files, or show/hide things using a complex logiclayer like javascript. This makes spatial content multi-purpose, without the need to
separate content into separate files, or show/hide things using a
complex logiclayer like javascript.
# URI Templates (RFC6570)
XR Fragments adopts Level1 URI **Fragment** expansion to provide safe interactivity.<br>
van Kammen Expires 24 March 2025 [Page 31]
Internet-Draft XR Fragments September 2024
22. URI Templates (RFC6570)
XR Fragments adopts Level1 URI *Fragment* expansion to provide safe
interactivity.
The following demonstrates a simple video player: The following demonstrates a simple video player:
+─────────────────────────────────────────────+ │ │ │ foo.usdz │ +─────────────────────────────────────────────+
│ │
│ foo.usdz │
│ │ │ │ │ │
│ │ │ │ │ │
│ ├── ◻ stopbutton │ │ │ ├ #: #-stopbutton │ │ │ └ href: │ ├── ◻ stopbutton │
#player=stop&-stopbutton │ (stop and hide stop-button) │ │ │ │ │ ├ #: #-stopbutton │
│ └── ◻ plane │ │ ├ play: #t=l:0,10 │ │ ├ stop: #t=0,0 │ │ ├ href: │ │ └ href: #player=stop&-stopbutton │ (stop and hide stop-button)
#player=play&stopbutton │ (play and show stop-button) │ └ src: │ │ │
cat.mp4#{player} │ │ │ │ │ │ └── ◻ plane │
│ ├ play: #t=l:0,10 │
│ ├ stop: #t=0,0 │
│ ├ href: #player=play&stopbutton │ (play and show stop-button)
│ └ src: cat.mp4#{player} │
│ │
│ │
+─────────────────────────────────────────────+ +─────────────────────────────────────────────+
``` 23. Additional scene metadata
20. Additional scene metadata
XR Fragments does not aim to redefine the metadata-space or XR Fragments does not aim to redefine the metadata-space or
accessibility-space by introducing its own cataloging-metadata accessibility-space by introducing its own cataloging-metadata
fields. Instead, it encourages browsers to scan nodes for the fields. Instead, it encourages browsers to scan nodes for the
following custom properties: following custom properties:
van Kammen Expires 13 January 2025 [Page 31]
Internet-Draft XR Fragments July 2024
* SPDX (https://spdx.dev/) license information * SPDX (https://spdx.dev/) license information
* ARIA (https://www.w3.org/WAI/standards-guidelines/aria/) * ARIA (https://www.w3.org/WAI/standards-guidelines/aria/)
attributes (aria-*: .....) attributes (aria-*: .....)
@ -1751,6 +1782,18 @@ Internet-Draft XR Fragments July 2024
promotes accessibility and allows scene transcripts. Please start promotes accessibility and allows scene transcripts. Please start
aria-description with a verb to aid transcripts. aria-description with a verb to aid transcripts.
van Kammen Expires 24 March 2025 [Page 32]
Internet-Draft XR Fragments September 2024
| Example: object 'tryceratops' with aria-description: is a huge | Example: object 'tryceratops' with aria-description: is a huge
| dinosaurus standing on a #mountain generates transcript | dinosaurus standing on a #mountain generates transcript
| #tryceratops is a huge dinosaurus standing on a #mountain, where | #tryceratops is a huge dinosaurus standing on a #mountain, where
@ -1787,26 +1830,26 @@ Internet-Draft XR Fragments July 2024
| * = these are interchangable (only one needs to be defined) | * = these are interchangable (only one needs to be defined)
van Kammen Expires 13 January 2025 [Page 32]
Internet-Draft XR Fragments July 2024
There's no silver bullet when it comes to metadata, so one should There's no silver bullet when it comes to metadata, so one should
support where the metadata is/goes. support where the metadata is/goes.
| These attributes can be scanned and presented during an href or | These attributes can be scanned and presented during an href or
| src eye/mouse-over. | src eye/mouse-over.
21. Accessibility interface 24. Accessibility interface
The addressibility of XR Fragments allows for unique 3D-to-text The addressibility of XR Fragments allows for unique 3D-to-text
transcripts, as well as an textual interface to navigate 3D content. transcripts, as well as an textual interface to navigate 3D content.
Spec: Spec:
<Br> <Br>
van Kammen Expires 24 March 2025 [Page 33]
Internet-Draft XR Fragments September 2024
1. The enduser must be able to enable an accessibility-mode (which 1. The enduser must be able to enable an accessibility-mode (which
persists across application/webpage restarts) persists across application/webpage restarts)
2. Accessibility-mode must contain a text-input for the user to 2. Accessibility-mode must contain a text-input for the user to
@ -1842,15 +1885,7 @@ Internet-Draft XR Fragments July 2024
https://.../... in case a 3D node exist with name abc and href https://.../... in case a 3D node exist with name abc and href
value https://.../... value https://.../...
24.1. Two-button navigation
van Kammen Expires 13 January 2025 [Page 33]
Internet-Draft XR Fragments July 2024
21.1. Two-button navigation
For specific user-profiles, gyroscope/mouse/keyboard/audio/visuals For specific user-profiles, gyroscope/mouse/keyboard/audio/visuals
will not be available. will not be available.
@ -1864,17 +1899,136 @@ Internet-Draft XR Fragments July 2024
3. the TTS reads the href-value (and/or aria-description if 3. the TTS reads the href-value (and/or aria-description if
available) available)
22. Security Considerations
van Kammen Expires 24 March 2025 [Page 34]
Internet-Draft XR Fragments September 2024
24.2. XR Fragment Vendor Prefixes
Vendor Prefixes (XRFVP's) allows embedding a 3D file with popular 3D
engines/framework-specific features via metadata:
+==============+===================+==============================+
| what | XR metadata | Lowest common denominator |
+==============+===================+==============================+
| XR Fragments | vendor-agnostic | camera + 3D object(file) |
| | | load/embed/click/referencing |
+--------------+-------------------+------------------------------+
| XR Fragments | vendor-*specific* | Entity-Component System |
| VP's | | (ECS) |
+--------------+-------------------+------------------------------+
Table 14
Vendor-specific metadata in a 3D scenefiles, are similar to vendor-
specific CSS-prefixes (https://en.wikipedia.org/wiki/
CSS#Vendor_prefixes) (-moz-opacity: 0.2 e.g.). This allows popular
3D engines/frameworks, to initialize specific features when loading a
scene/object, in a progressive enhanced way.
| Why? Because not all XR interactions can be solved/standardized
| by embedding XR Fragments into any 3D file. Some XR experiences
| need more than *navigation* and *show/hide/filtering* of objects
| (via click-state machines). The lowest common denominator between
| s that 3D engines use entity-component-system
For example, the following metadata can be added to a .glb file, to
make an object grabbable in AFRAME:
van Kammen Expires 24 March 2025 [Page 35]
Internet-Draft XR Fragments September 2024
+────────────────────────────────────────────────────────────────────────────────────────────────────────+
│ http://y.io/z.glb | AFRAME app │
│-----------------------------------------------+--------------------------------------------------------│
│ | │
│ | after loading the glb, john can be placed into the │
│ +-[3D mesh]-+ | castle via hands, because the author added metadata to │
│ | / \ | | john via either: │
│ | / \ | | │
│ | / \ | | 1. Blender (custom property-box, no plugins needed) │
│ | |_____| | | │
│ +-----│-----+ | 2. javascript-code: │
│ │ | │
│ ├─ name: castle | for( var com in this.el.components ){ │
│ └─ tag: house baroque | this.el.object3D.userData[`-AFRAME-${com}`] = '' │
│ | } │
│ [3D mesh-+ | // save to z.glb in AFRAME inspector │
│ | ├─ name: john | │
│ | O ├─ age: 23 | │
│ | /|\ ├─ -AFRAME-grabbable: '' | > inits 'grabbable' component on object john │
│ | / \ ├─ -AFRAME-material.color: '#F0A' | > inits 'material' component on object john │
│ | ├─ -AFRAME-text.value: '{name}{age}'| > inits 'text' component (*) with value 'john' │
│ | ├─ -THREE-material.fog: false | > changes material settings in THREE.js app │
│ | ├─ -GODOT-Label3D.text: '{name}{age}'| > inits 'Label3D' component (*) in Godot │
│ +--------+ | │
│ | │
├─ -AFRAME-version: '1.6.0' | > │
├─ -GODOT-version: '4.3' | > exporters/authors can report targeted version │
│ | │
+────────────────────────────────────────────────────────────────────────────────────────────────────────+
* key/value syntax: -<vendorname>-<component|version>.<key>
[string/boolean/float/int]-value
String-templatevalues are evaluated as per URI Templates (RFC6570)
(https://www.rfc-editor.org/rfc/rfc6570) Level 1.
| This 'separating of mechanism from policy' (unix rule) does
| *somewhat* break portability of an XR experience, but still
| prevents (E-waste of) handcoded virtual worlds. It allows for (XR
| experience) metadata to survive in future 3D engines and scene-
| fileformats.
van Kammen Expires 24 March 2025 [Page 36]
Internet-Draft XR Fragments September 2024
25. Security Considerations
The only dynamic parts are W3C Media Fragments The only dynamic parts are W3C Media Fragments
(https://www.w3.org/TR/media-frags/) and URI Templates (RFC6570) (https://www.w3.org/TR/media-frags/) and URI Templates (RFC6570)
(https://www.rfc-editor.org/rfc/rfc6570). (https://www.rfc-editor.org/rfc/rfc6570).
The use of URI Templates is limited to pre-defined variables and The use of URI Templates is limited to pre-defined variables and
Level0 fragments-expansion only, which makes it quite safe. Level0 fragments-expansion only, which makes it quite safe.
In fact, it is much safer than relying on a scripting language n fact, it is much safer than relying on a scripting language
(javascript) which can change URN too. (javascript) which can change URN too.
23. FAQ 26. FAQ
*Q:* Why is everything HTTP GET-based, what about POST/PUT/DELETE *Q:* Why is everything HTTP GET-based, what about POST/PUT/DELETE
HATEOS HATEOS
@ -1898,14 +2052,6 @@ Internet-Draft XR Fragments July 2024
scripting language. scripting language.
XR Fragments supports filtering objects in a scene only, because in XR Fragments supports filtering objects in a scene only, because in
the history of the javascript-powered web, showing/hiding document- the history of the javascript-powered web, showing/hiding document-
van Kammen Expires 13 January 2025 [Page 34]
Internet-Draft XR Fragments July 2024
entities seems to be one of the most popular basic usecases. entities seems to be one of the most popular basic usecases.
Doing advanced scripting & networkrequests under the hood are Doing advanced scripting & networkrequests under the hood are
obviously interesting endavours, but this is something which should obviously interesting endavours, but this is something which should
@ -1915,16 +2061,24 @@ Internet-Draft XR Fragments July 2024
place, to 'extend' experiences, in contrast to code/javascript inside place, to 'extend' experiences, in contrast to code/javascript inside
hypermedia documents (this turned out as a hypermedia antipattern). hypermedia documents (this turned out as a hypermedia antipattern).
24. authors 27. authors
* Leon van Kammen (@lvk@mastodon.online) * Leon van Kammen (@lvk@mastodon.online)
* Jens Finkhäuser (@jens@social.finkhaeuser.de) * Jens Finkhäuser (@jens@social.finkhaeuser.de)
25. IANA Considerations
van Kammen Expires 24 March 2025 [Page 37]
Internet-Draft XR Fragments September 2024
28. IANA Considerations
This document has no IANA actions. This document has no IANA actions.
26. Acknowledgments 29. Acknowledgments
* NLNET (https://nlnet.nl) * NLNET (https://nlnet.nl)
* Future of Text (https://futureoftext.org) * Future of Text (https://futureoftext.org)
@ -1939,7 +2093,7 @@ Internet-Draft XR Fragments July 2024
* Brandel Zackernuk * Brandel Zackernuk
* Mark Anderson * Mark Anderson
27. Appendix: Definitions 30. Appendix: Definitions
+=================+=============================================+ +=================+=============================================+
| definition | explanation | | definition | explanation |
@ -1954,14 +2108,6 @@ Internet-Draft XR Fragments July 2024
| 3D object | an object inside a scene characterized by | | 3D object | an object inside a scene characterized by |
| | vertex-, face- and customproperty data. | | | vertex-, face- and customproperty data. |
+-----------------+---------------------------------------------+ +-----------------+---------------------------------------------+
van Kammen Expires 13 January 2025 [Page 35]
Internet-Draft XR Fragments July 2024
| URI | some resource at something somewhere via | | URI | some resource at something somewhere via |
| | someprotocol (http://me.com/foo.glb#foo or | | | someprotocol (http://me.com/foo.glb#foo or |
| | e76f8efec8efce98e6f see interpeer.io | | | e76f8efec8efce98e6f see interpeer.io |
@ -1976,6 +2122,14 @@ Internet-Draft XR Fragments July 2024
| | Object(nodes), relevant to machines and a | | | Object(nodes), relevant to machines and a |
| | human minority (academics/developers) | | | human minority (academics/developers) |
+-----------------+---------------------------------------------+ +-----------------+---------------------------------------------+
van Kammen Expires 24 March 2025 [Page 38]
Internet-Draft XR Fragments September 2024
| XR fragment | URI Fragment with spatial hints like | | XR fragment | URI Fragment with spatial hints like |
| | #pos=0,0,0&t=1,100 e.g. | | | #pos=0,0,0&t=1,100 e.g. |
+-----------------+---------------------------------------------+ +-----------------+---------------------------------------------+
@ -2010,14 +2164,6 @@ Internet-Draft XR Fragments July 2024
| | indirectly visible/editable in XR. | | | indirectly visible/editable in XR. |
+-----------------+---------------------------------------------+ +-----------------+---------------------------------------------+
| requestless | metadata which never spawns new requests | | requestless | metadata which never spawns new requests |
van Kammen Expires 13 January 2025 [Page 36]
Internet-Draft XR Fragments July 2024
| metadata | (unlike RDF/HTML, which can cause | | metadata | (unlike RDF/HTML, which can cause |
| | framerate-dropping, hence not used a lot in | | | framerate-dropping, hence not used a lot in |
| | games) | | | games) |
@ -2032,6 +2178,14 @@ Internet-Draft XR Fragments July 2024
| extrospective | outward sensemaking ("I'm fairly sure John | | extrospective | outward sensemaking ("I'm fairly sure John |
| | is a person who lives in oklahoma") | | | is a person who lives in oklahoma") |
+-----------------+---------------------------------------------+ +-----------------+---------------------------------------------+
van Kammen Expires 24 March 2025 [Page 39]
Internet-Draft XR Fragments September 2024
| ◻ | ascii representation of an 3D object/mesh | | ◻ | ascii representation of an 3D object/mesh |
+-----------------+---------------------------------------------+ +-----------------+---------------------------------------------+
| (un)obtrusive | obtrusive: wrapping human text/thought in | | (un)obtrusive | obtrusive: wrapping human text/thought in |
@ -2052,7 +2206,7 @@ Internet-Draft XR Fragments July 2024
| | XML | | | XML |
+-----------------+---------------------------------------------+ +-----------------+---------------------------------------------+
Table 14 Table 15
@ -2069,4 +2223,18 @@ Internet-Draft XR Fragments July 2024
van Kammen Expires 13 January 2025 [Page 37]
van Kammen Expires 24 March 2025 [Page 40]

View file

@ -10,7 +10,7 @@
<workgroup>Jens &amp; Leon Internet Engineering Task Force</workgroup> <workgroup>Jens &amp; Leon Internet Engineering Task Force</workgroup>
<abstract> <abstract>
<t>This draft is a specification for 4D URI's &amp; <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> navigation, to enable a spatial web for hypermedia browsers with- or without a network-connection.<br /> <t>This draft is a specification for interactive URI-controllable 3D files, enabling <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> navigation, to enable a spatial web for hypermedia browsers with- or without a network-connection.<br />
The specification uses <eref target="https://www.w3.org/TR/media-frags/">W3C Media Fragments</eref> and <eref target="https://www.rfc-editor.org/rfc/rfc6570">URI Templates (RFC6570)</eref> to promote spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br /> The specification uses <eref target="https://www.w3.org/TR/media-frags/">W3C Media Fragments</eref> and <eref target="https://www.rfc-editor.org/rfc/rfc6570">URI Templates (RFC6570)</eref> to promote spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br />
@ -1134,99 +1134,105 @@ The XR Fragment-compatible browser can let the enduser access visual-meta(data)-
<section anchor="reflection-mapping"><name>Reflection Mapping</name> <section anchor="reflection-mapping"><name>Reflection Mapping</name>
<t>Environment mapping is crucial for creating realistic reflections and lighting effects on 3D objects. <t>Environment mapping is crucial for creating realistic reflections and lighting effects on 3D objects.
To apply environment mapping efficiently in a 3D scene, traverse the scene graph and assign each object's environment map based on the nearest ancestor's texture map. This ensures that objects inherit the correct environment mapping from their closest parent with a texture, enhancing the visual consistency and realism.</t> To apply environment mapping efficiently in a 3D scene, traverse the scene graph and assign each object's environment map based on the nearest ancestor's texture map. This ensures that objects inherit the correct environment mapping from their closest parent with a texture, enhancing the visual consistency and realism.</t>
<t>``````
+--------------------------------+<br /> <artwork><![CDATA[ +--------------------------------+
| |<br /> | |
| index.usdz |<br /> | index.usdz |
| │ |<br /> | │ |
| └── ◻ sphere (texture:foo) | | └── ◻ sphere (texture:foo) |
| └ ◻ cube (texture:bar) | envMap = foo | └ ◻ cube (texture:bar) | envMap = foo
| └ ◻ cylinder | envMap = bar | └ ◻ cylinder | envMap = bar
+--------------------------------+</t> +--------------------------------+
<artwork><![CDATA[
Most 3D viewers apply one and the same environment map for various models, however this logic
allows a more natural & automatic strategy for reflection mapping.
# Transclusion (broken link) resolution
In spirit of Ted Nelson's 'transclusion resolution', there's a soft-mechanism to harden links & minimize broken links in various ways:
1. defining a different transport protocol (https vs ipfs or DAT) in `src` or `href` values can make a difference
2. mirroring files on another protocol using (HTTP) errorcode tags in `src` or `href` properties
3. in case of `src`: nesting a copy of the embedded object in the placeholder object (`embeddedObject`) will not be replaced when the request fails
> due to the popularity, maturity and extensiveness of HTTP codes for client/server communication, non-HTTP protocols easily map to HTTP codes (ipfs ERR_NOT_FOUND maps to 404 e.g.)
For example:
]]> ]]>
</artwork> </artwork>
<t>+────────────────────────────────────────────────────────+ <t>Most 3D viewers apply one and the same environment map for various models, however this logic
allows a more natural &amp; automatic strategy for reflection mapping.</t>
</section>
<section anchor="transclusion-broken-link-resolution"><name>Transclusion (broken link) resolution</name>
<t>In spirit of Ted Nelson's 'transclusion resolution', there's a soft-mechanism to harden links &amp; minimize broken links in various ways:</t>
<ol spacing="compact">
<li>defining a different transport protocol (https vs ipfs or DAT) in <tt>src</tt> or <tt>href</tt> values can make a difference</li>
<li>mirroring files on another protocol using (HTTP) errorcode tags in <tt>src</tt> or <tt>href</tt> properties</li>
<li>in case of <tt>src</tt>: nesting a copy of the embedded object in the placeholder object (<tt>embeddedObject</tt>) will not be replaced when the request fails</li>
</ol>
<blockquote><t>due to the popularity, maturity and extensiveness of HTTP codes for client/server communication, non-HTTP protocols easily map to HTTP codes (ipfs ERR_NOT_FOUND maps to 404 e.g.)</t>
</blockquote><t>For example:</t>
<artwork><![CDATA[ +────────────────────────────────────────────────────────+
│ │ │ │
│ index.gltf │ │ index.gltf │
│ │ │ │ │ │
│ │ #: #-offlinetext │ │ │ #: #-offlinetext │
│ │ │ │ │ │
│ ├── ◻ buttonA │ │ ├── ◻ buttonA │
│ │ └ href: <eref target="http://foo.io/campagne.fbx">http://foo.io/campagne.fbx</eref> │ │ └ href: http://foo.io/campagne.fbx │
│ │ └ href@404: ipfs://foo.io/campagne.fbx │ │ │ └ href@404: ipfs://foo.io/campagne.fbx │
│ │ └ href@400: #clienterrortext │ │ │ └ href@400: #clienterrortext │
│ │ └ ◻ offlinetext │ │ │ └ ◻ offlinetext │
│ │ │ │ │ │
│ └── ◻ embeddedObject &lt;--------- the meshdata inside embeddedObject will (not) │ └── ◻ embeddedObject <--------- the meshdata inside embeddedObject will (not)
│ └ src: <eref target="https://foo.io/bar.gltf">https://foo.io/bar.gltf</eref> │ be flushed when the request (does not) succeed. │ └ src: https://foo.io/bar.gltf │ be flushed when the request (does not) succeed.
│ └ src@404: <eref target="http://foo.io/bar.gltf">http://foo.io/bar.gltf</eref> │ So worstcase the 3D data (of the time of publishing index.gltf) │ └ src@404: http://foo.io/bar.gltf │ So worstcase the 3D data (of the time of publishing index.gltf)
│ └ src@400: <eref target="https://archive.org/l2kj43.gltf">https://archive.org/l2kj43.gltf</eref> │ will be displayed. │ └ src@400: https://archive.org/l2kj43.gltf │ will be displayed.
│ │ │ │
+────────────────────────────────────────────────────────+</t> +────────────────────────────────────────────────────────+
<artwork><![CDATA[
# Topic-based index-less Webrings
As hashtags in URLs map to the XWRG, `href`-values can be used to promote topic-based index-less webrings.<br>
Consider 3D scenes linking to eachother using these `href` values:
* `href: schoolA.edu/projects.gltf#math`
* `href: schoolB.edu/projects.gltf#math`
* `href: university.edu/projects.gltf#math`
These links would all show visible links to math-tagged objects in the scene.<br>
To filter out non-related objects one could take it a step further using filters:
* `href: schoolA.edu/projects.gltf#math&-topics math`
* `href: schoolB.edu/projects.gltf#math&-courses math`
* `href: university.edu/projects.gltf#math&-theme math`
> This would hide all object tagged with `topic`, `courses` or `theme` (including math) so that later only objects tagged with `math` will be visible
This makes spatial content multi-purpose, without the need to separate content into separate files, or show/hide things using a complex logiclayer like javascript.
# URI Templates (RFC6570)
XR Fragments adopts Level1 URI **Fragment** expansion to provide safe interactivity.<br>
The following demonstrates a simple video player:
]]> ]]>
</artwork> </artwork>
<t>+─────────────────────────────────────────────+ </section>
<section anchor="topic-based-index-less-webrings"><name>Topic-based index-less Webrings</name>
<t>As hashtags in URLs map to the XWRG, <tt>href</tt>-values can be used to promote topic-based index-less webrings.<br />
Consider 3D scenes linking to eachother using these <tt>href</tt> values:</t>
<ul spacing="compact">
<li><tt>href: schoolA.edu/projects.gltf#math</tt></li>
<li><tt>href: schoolB.edu/projects.gltf#math</tt></li>
<li><tt>href: university.edu/projects.gltf#math</tt></li>
</ul>
<t>These links would all show visible links to math-tagged objects in the scene.<br />
To filter out non-related objects one could take it a step further using filters:</t>
<ul spacing="compact">
<li><tt>href: schoolA.edu/projects.gltf#math&amp;-topics math</tt></li>
<li><tt>href: schoolB.edu/projects.gltf#math&amp;-courses math</tt></li>
<li><tt>href: university.edu/projects.gltf#math&amp;-theme math</tt></li>
</ul>
<blockquote><t>This would hide all object tagged with <tt>topic</tt>, <tt>courses</tt> or <tt>theme</tt> (including math) so that later only objects tagged with <tt>math</tt> will be visible</t>
</blockquote><t>This makes spatial content multi-purpose, without the need to separate content into separate files, or show/hide things using a complex logiclayer like javascript.</t>
</section>
<section anchor="uri-templates-rfc6570"><name>URI Templates (RFC6570)</name>
<t>XR Fragments adopts Level1 URI <strong>Fragment</strong> expansion to provide safe interactivity.<br />
The following demonstrates a simple video player:</t>
<artwork><![CDATA[
+─────────────────────────────────────────────+
│ │ │ │
│ foo.usdz │<br /> │ foo.usdz │
│ │ │<br /> │ │ │
│ │ │<br /> │ │ │
│ ├── ◻ stopbutton │ │ ├── ◻ stopbutton │
│ │ ├ #: #-stopbutton │ │ │ ├ #: #-stopbutton │
│ │ └ href: #player=stop&amp;-stopbutton │ (stop and hide stop-button) │ │ └ href: #player=stop&-stopbutton │ (stop and hide stop-button)
│ │ │<br /> │ │ │
│ └── ◻ plane │ │ └── ◻ plane │
│ ├ play: #t=l:0,10 │ │ ├ play: #t=l:0,10 │
│ ├ stop: #t=0,0 │ │ ├ stop: #t=0,0 │
│ ├ href: #player=play&amp;stopbutton │ (play and show stop-button) │ ├ href: #player=play&stopbutton │ (play and show stop-button)
│ └ src: cat.mp4#{player} │ │ └ src: cat.mp4#{player} │
│ │ │ │
│ │ │ │
+─────────────────────────────────────────────+</t> +─────────────────────────────────────────────+
<t>```</t>
]]>
</artwork>
</section> </section>
<section anchor="additional-scene-metadata"><name>Additional scene metadata</name> <section anchor="additional-scene-metadata"><name>Additional scene metadata</name>
@ -1339,6 +1345,76 @@ Therefore a 2-button navigation-interface is the bare minimum interface:</t>
<li>the TTS reads the href-value (and/or aria-description if available)</li> <li>the TTS reads the href-value (and/or aria-description if available)</li>
</ol> </ol>
</section> </section>
<section anchor="xr-fragment-vendor-prefixes"><name>XR Fragment Vendor Prefixes</name>
<t>Vendor Prefixes (XRFVP's) allows embedding a 3D file with popular 3D engines/framework-specific features via metadata:</t>
<table>
<thead>
<tr>
<th>what</th>
<th>XR metadata</th>
<th>Lowest common denominator</th>
</tr>
</thead>
<tbody>
<tr>
<td>XR Fragments</td>
<td>vendor-agnostic</td>
<td>camera + 3D object(file) load/embed/click/referencing</td>
</tr>
<tr>
<td>XR Fragments VP's</td>
<td>vendor-<strong>specific</strong></td>
<td>Entity-Component System (ECS)</td>
</tr>
</tbody>
</table><t>Vendor-specific metadata in a 3D scenefiles, are similar to vendor-specific <eref target="https://en.wikipedia.org/wiki/CSS#Vendor_prefixes">CSS-prefixes</eref> (<tt>-moz-opacity: 0.2</tt> e.g.).
This allows popular 3D engines/frameworks, to initialize specific features when loading a scene/object, in a progressive enhanced way.</t>
<blockquote><t>Why? Because not all XR interactions can be solved/standardized by embedding XR Fragments into any 3D file.
Some XR experiences need more than <strong>navigation</strong> and <strong>show/hide/filtering</strong> of objects (via click-state machines).
The lowest common denominator between s that 3D engines use entity-component-system</t>
</blockquote><t>For example, the following metadata can be added to a .glb file, to make an object grabbable in AFRAME:</t>
<artwork><![CDATA[+────────────────────────────────────────────────────────────────────────────────────────────────────────+
│ http://y.io/z.glb | AFRAME app │
│-----------------------------------------------+--------------------------------------------------------│
│ | │
│ | after loading the glb, john can be placed into the │
│ +-[3D mesh]-+ | castle via hands, because the author added metadata to │
│ | / \ | | john via either: │
│ | / \ | | │
│ | / \ | | 1. Blender (custom property-box, no plugins needed) │
│ | |_____| | | │
│ +-----│-----+ | 2. javascript-code: │
│ │ | │
│ ├─ name: castle | for( var com in this.el.components ){ │
│ └─ tag: house baroque | this.el.object3D.userData[`-AFRAME-${com}`] = '' │
│ | } │
│ [3D mesh-+ | // save to z.glb in AFRAME inspector │
│ | ├─ name: john | │
│ | O ├─ age: 23 | │
│ | /|\ ├─ -AFRAME-grabbable: '' | > inits 'grabbable' component on object john │
│ | / \ ├─ -AFRAME-material.color: '#F0A' | > inits 'material' component on object john │
│ | ├─ -AFRAME-text.value: '{name}{age}'| > inits 'text' component (*) with value 'john' │
│ | ├─ -THREE-material.fog: false | > changes material settings in THREE.js app │
│ | ├─ -GODOT-Label3D.text: '{name}{age}'| > inits 'Label3D' component (*) in Godot │
│ +--------+ | │
│ | │
├─ -AFRAME-version: '1.6.0' | > │
├─ -GODOT-version: '4.3' | > exporters/authors can report targeted version │
│ | │
+────────────────────────────────────────────────────────────────────────────────────────────────────────+
]]>
</artwork>
<ul spacing="compact">
<li>key/value syntax: -<tt>&lt;vendorname&gt;</tt>-<tt>&lt;component|version&gt;</tt>.<tt>&lt;key&gt;</tt> <tt>[string/boolean/float/int]</tt>-value</li>
</ul>
<t>String-templatevalues are evaluated as per <eref target="https://www.rfc-editor.org/rfc/rfc6570">URI Templates (RFC6570)</eref> Level 1.</t>
<blockquote><t>This 'separating of mechanism from policy' (unix rule) does <strong>somewhat</strong> break portability of an XR experience, but still prevents (E-waste of) handcoded virtual worlds. It allows for (XR experience) metadata to survive in future 3D engines and scene-fileformats.</t>
</blockquote></section>
</section> </section>
<section anchor="security-considerations"><name>Security Considerations</name> <section anchor="security-considerations"><name>Security Considerations</name>
@ -1346,7 +1422,7 @@ Therefore a 2-button navigation-interface is the bare minimum interface:</t>
The use of URI Templates is limited to pre-defined variables and Level0 fragments-expansion only, which makes it quite safe.<br /> The use of URI Templates is limited to pre-defined variables and Level0 fragments-expansion only, which makes it quite safe.<br />
In fact, it is much safer than relying on a scripting language (javascript) which can change URN too.</t> n fact, it is much safer than relying on a scripting language (javascript) which can change URN too.</t>
</section> </section>
<section anchor="faq"><name>FAQ</name> <section anchor="faq"><name>FAQ</name>