spec simplify + overhaul

This commit is contained in:
Leon van Kammen 2025-09-19 19:53:30 +02:00
parent 7f42e7f5aa
commit ec07443201
5 changed files with 764 additions and 224 deletions

View file

@ -93,8 +93,88 @@ These heuristics, enable features that are both meaningful and consistent across
<p>Almost every idea in this document is demonstrated at <a href="https://xrfragment.org">https://xrfragment.org</a></p> <p>Almost every idea in this document is demonstrated at <a href="https://xrfragment.org">https://xrfragment.org</a></p>
</blockquote> </blockquote>
<section data-matter="main"> <section data-matter="main">
<h1 id="quick-reference">Quick reference</h1>
<ol>
<li><a href="#abstract">Abstract</a></li>
<li><a href="#index">Index</a></li>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#what-is-xr-fragments">What is XR Fragments</a></li>
<li><a href="#hfl-hypermediatic-feedback-loop-for-xr-browsers">HFL (Hypermediatic Feedback Loop) for XR Browsers</a></li>
<li><a href="#conventions-and-definitions">Conventions and Definitions</a>
<ol>
<li><a href="#xr-fragment-url-grammar">XR Fragment URL Grammar</a></li>
</ol></li>
<li><a href="#spatial-referencing-3d">Spatial Referencing 3D</a></li>
<li><a href="#level0-files">Level0: Files</a>
<ol>
<li><a href="#via-href-metadata">via href metadata</a></li>
<li><a href="#via-chained-extension">via chained extension</a></li>
<li><a href="#via-subdocuments-xattr">via subdocuments/xattr</a></li>
<li><a href="#json-sidecar-file">JSON sidecar-file</a></li>
</ol></li>
<li><a href="#level1-uri">Level1: URI</a>
<ol>
<li><a href="#list-of-uri-fragments">List of URI Fragments</a></li>
<li><a href="#list-of-explicit-metadata">List of explicit metadata</a></li>
</ol></li>
<li><a href="#level2-href-links">Level2: href links</a>
<ol>
<li><a href="#interaction-behaviour">Interaction behaviour</a></li>
<li><a href="#xr-viewer-implementation">XR Viewer implementation</a></li>
</ol></li>
<li><a href="#level3-media-fragments">Level3: Media Fragments</a>
<ol>
<li><a href="#animation-s-timeline">Animation(s) timeline</a></li>
<li><a href="#specify-playback-loopmode">Specify playback loopmode</a></li>
<li><a href="#controlling-embedded-content">Controlling embedded content</a></li>
</ol></li>
<li><a href="#level4-prefix-operators">Level4: prefix operators</a>
<ol>
<li><a href="#object-teleports">Object teleports</a></li>
<li><a href="#object-multipliers">Object multipliers</a></li>
<li><a href="#de-selectors-and">De/selectors (+ and -)</a></li>
<li><a href="#sharing-object-or-file">Sharing object or file (#|)</a></li>
<li><a href="#xrf-uri-scheme">xrf:// URI scheme</a></li>
</ol></li>
<li><a href="#level5-uri-templates-rfc6570">Level5: URI Templates (RFC6570)</a></li>
<li><a href="#top-level-url-processing">Top-level URL processing</a>
<ol>
<li><a href="#ux">UX</a></li>
</ol></li>
<li><a href="#example-navigating-content-href-portals">Example: Navigating content href portals</a>
<ol>
<li><a href="#walking-surfaces">Walking surfaces</a></li>
</ol></li>
<li><a href="#example-virtual-world-rings">Example: Virtual world rings</a></li>
<li><a href="#additional-scene-metadata">Additional scene metadata</a></li>
<li><a href="#accessibility-interface">Accessibility interface</a>
<ol>
<li><a href="#two-button-navigation">Two-button navigation</a></li>
<li><a href="#overlap-with-fileformat-specific-extensions">Overlap with fileformat-specific extensions</a></li>
</ol></li>
<li><a href="#vendor-prefixes">Vendor Prefixes</a></li>
<li><a href="#security-considerations">Security Considerations</a></li>
<li><a href="#faq">FAQ</a></li>
<li><a href="#authors">Authors</a></li>
<li><a href="#iana-considerations">IANA Considerations</a></li>
<li><a href="#acknowledgments">Acknowledgments</a></li>
<li><a href="#appendix-definitions">Appendix: Definitions</a></li>
</ol>
<h1 id="introduction">Introduction</h1> <h1 id="introduction">Introduction</h1>
<p><span class="index" id="idxref:0"></span></p>
<p>How can we add more control to existing text and 3D scenes, without introducing new dataformats?<br> <p>How can we add more control to existing text and 3D scenes, without introducing new dataformats?<br>
Historically, there&rsquo;s many attempts to create the ultimate 3D fileformat.<br> Historically, there&rsquo;s many attempts to create the ultimate 3D fileformat.<br>
The lowest common denominator is: designers describing/tagging/naming things using <strong>plain text</strong>.<br> The lowest common denominator is: designers describing/tagging/naming things using <strong>plain text</strong>.<br>
@ -118,6 +198,8 @@ XR Fragments exploits the fact that all 3D models already contain such metadata:
<h1 id="what-is-xr-fragments">What is XR Fragments</h1> <h1 id="what-is-xr-fragments">What is XR Fragments</h1>
<p><span class="index" id="idxref:1"></span></p>
<p>XR Fragments utilizes URLs:</p> <p>XR Fragments utilizes URLs:</p>
<ol> <ol>
@ -129,6 +211,8 @@ XR Fragments exploits the fact that all 3D models already contain such metadata:
<h1 id="hfl-hypermediatic-feedback-loop-for-xr-browsers">HFL (Hypermediatic Feedback Loop) for XR Browsers</h1> <h1 id="hfl-hypermediatic-feedback-loop-for-xr-browsers">HFL (Hypermediatic Feedback Loop) for XR Browsers</h1>
<p><span class="index" id="idxref:2"></span> for XR Browsers)</p>
<p><code>href</code> metadata traditionally implies <strong>click</strong> AND <strong>navigate</strong>, however XR Fragments adds stateless <strong>click</strong> (<code>xrf://....</code>) via the <code>xrf://</code> scheme, which does not change the top-level URL-adress (of the browser). <p><code>href</code> metadata traditionally implies <strong>click</strong> AND <strong>navigate</strong>, however XR Fragments adds stateless <strong>click</strong> (<code>xrf://....</code>) via the <code>xrf://</code> scheme, which does not change the top-level URL-adress (of the browser).
This allows for many extra interactions via URLs, which otherwise needs a scripting language. This allows for many extra interactions via URLs, which otherwise needs a scripting language.
These are called <strong>hashbus</strong>-only events/</p> These are called <strong>hashbus</strong>-only events/</p>
@ -226,10 +310,14 @@ These are called <strong>hashbus</strong>-only events/</p>
<h1 id="conventions-and-definitions">Conventions and Definitions</h1> <h1 id="conventions-and-definitions">Conventions and Definitions</h1>
<p><span class="index" id="idxref:3"></span></p>
<p>See appendix below in case certain terms are not clear.</p> <p>See appendix below in case certain terms are not clear.</p>
<h2 id="xr-fragment-url-grammar">XR Fragment URL Grammar</h2> <h2 id="xr-fragment-url-grammar">XR Fragment URL Grammar</h2>
<p><span class="index" id="idxref:4"></span></p>
<p>For typical HTTP-like browsers/applications:</p> <p>For typical HTTP-like browsers/applications:</p>
<pre><code>reserved = gen-delims / sub-delims <pre><code>reserved = gen-delims / sub-delims
@ -272,6 +360,8 @@ That way, if the link gets shared, the XR Fragments implementation at <code>http
<h1 id="spatial-referencing-3d">Spatial Referencing 3D</h1> <h1 id="spatial-referencing-3d">Spatial Referencing 3D</h1>
<p><span class="index" id="idxref:5"></span></p>
<p>3D files contain an hierarchy of objects.<br> <p>3D files contain an hierarchy of objects.<br>
XR Fragments assumes the following objectname-to-URI-Fragment mapping, in order to deeplink 3D objects:</p> XR Fragments assumes the following objectname-to-URI-Fragment mapping, in order to deeplink 3D objects:</p>
@ -310,6 +400,9 @@ For example, to render a portal with a preview-version of the scene, create an 3
<h1 id="level0-files">Level0: Files</h1> <h1 id="level0-files">Level0: Files</h1>
<p><span class="index" id="idxref:6"></span>
<span class="index" id="idxref:7"></span></p>
<p>These are <strong>optional</strong> auto-loaded <a href="">side-car files</a> to enable hasslefree <a href="#XR%20Movies">XR Movies</a>.<br> <p>These are <strong>optional</strong> auto-loaded <a href="">side-car files</a> to enable hasslefree <a href="#XR%20Movies">XR Movies</a>.<br>
they can accomodate developers or applications who (for whatever reason) must not modify the 3D scene-file (a <code>.glb</code> e.g.).</p> they can accomodate developers or applications who (for whatever reason) must not modify the 3D scene-file (a <code>.glb</code> e.g.).</p>
@ -415,6 +508,8 @@ The sidecar will define (or <strong>override</strong> already existing) extras,
<h1 id="level1-uri">Level1: URI</h1> <h1 id="level1-uri">Level1: URI</h1>
<p><span class="index" id="idxref:8"></span></p>
<blockquote> <blockquote>
<p><strong>XR Fragments allows deeplinking of 3D objects by mapping objectnames to URI fragments</strong></p> <p><strong>XR Fragments allows deeplinking of 3D objects by mapping objectnames to URI fragments</strong></p>
</blockquote> </blockquote>
@ -479,7 +574,7 @@ Instead of forcing authors to combine 3D/2D objects programmatically (publishing
<p>?-linked and #-linked navigation are JUST one possible way to implement XR Fragments: the essential goal is to allow a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.</p> <p>?-linked and #-linked navigation are JUST one possible way to implement XR Fragments: the essential goal is to allow a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.</p>
</blockquote> </blockquote>
<h1 id="list-of-uri-fragments">List of URI Fragments</h1> <h2 id="list-of-uri-fragments">List of URI Fragments</h2>
<table> <table>
<thead> <thead>
@ -508,7 +603,7 @@ Instead of forcing authors to combine 3D/2D objects programmatically (publishing
</tbody> </tbody>
</table> </table>
<h1 id="list-of-explicit-metadata">List of *<em>explicit</em> metadata</h1> <h2 id="list-of-explicit-metadata">List of *<em>explicit</em> metadata</h2>
<p>These are the possible &lsquo;extras&rsquo; for 3D nodes and sidecar-files</p> <p>These are the possible &lsquo;extras&rsquo; for 3D nodes and sidecar-files</p>
@ -536,6 +631,8 @@ Instead of forcing authors to combine 3D/2D objects programmatically (publishing
<h1 id="level2-href-links">Level2: href links</h1> <h1 id="level2-href-links">Level2: href links</h1>
<p><span class="index" id="idxref:9"></span></p>
<p>Explicit href metadata (&lsquo;extras&rsquo;) in a 3D object (of a 3D file), hint the viewer that the user &ldquo;can interact&rdquo; with that object :</p> <p>Explicit href metadata (&lsquo;extras&rsquo;) in a 3D object (of a 3D file), hint the viewer that the user &ldquo;can interact&rdquo; with that object :</p>
<p>| fragment | type | example value | <p>| fragment | type | example value |
@ -565,6 +662,8 @@ Instead of forcing authors to combine 3D/2D objects programmatically (publishing
<h1 id="level3-media-fragments">Level3: Media Fragments</h1> <h1 id="level3-media-fragments">Level3: Media Fragments</h1>
<p><span class="index" id="idxref:10"></span></p>
<blockquote> <blockquote>
<p>these allow for XR Movies with a controllable timeline using <code>href</code> URI&rsquo;s with Media Fragments</p> <p>these allow for XR Movies with a controllable timeline using <code>href</code> URI&rsquo;s with Media Fragments</p>
</blockquote> </blockquote>
@ -628,6 +727,8 @@ XR Fragments Level3 makes the 3D timeline, as well as URL-referenced files <stro
<h1 id="level4-prefix-operators">Level4: prefix operators</h1> <h1 id="level4-prefix-operators">Level4: prefix operators</h1>
<p><span class="index" id="idxref:11"></span></p>
<p>Prefixing objectnames with the following simple operators allow for <strong>extremely powerful</strong> XR interactions:</p> <p>Prefixing objectnames with the following simple operators allow for <strong>extremely powerful</strong> XR interactions:</p>
<ul> <ul>
@ -787,8 +888,17 @@ Clicking the href-value below will:</p>
<p><strong>compliance with RFC 3986</strong>: unimplemented/unknown URI schemes (<code>xrf:...</code> e.g.) will not update the top-level URL</p> <p><strong>compliance with RFC 3986</strong>: unimplemented/unknown URI schemes (<code>xrf:...</code> e.g.) will not update the top-level URL</p>
</blockquote> </blockquote>
<h1 id="level5-uri-templates-rfc6570">Level5: URI Templates (RFC6570)</h1>
<p><span class="index" id="idxref:12"></span>)</p>
<p>XR Fragments adopts Level1 URI <strong>Fragment</strong> expansion to provide safe interactivity.<br>
This is non-normative, and the draft spec is available on request.</p>
<h1 id="top-level-url-processing">Top-level URL processing</h1> <h1 id="top-level-url-processing">Top-level URL processing</h1>
<p><span class="index" id="idxref:13"></span></p>
<blockquote> <blockquote>
<p>Example URL: <code>://foo/world.gltf#room1&amp;t=10&amp;cam</code></p> <p>Example URL: <code>://foo/world.gltf#room1&amp;t=10&amp;cam</code></p>
</blockquote> </blockquote>
@ -813,6 +923,8 @@ Clicking the href-value below will:</p>
<h1 id="example-navigating-content-href-portals">Example: Navigating content href portals</h1> <h1 id="example-navigating-content-href-portals">Example: Navigating content href portals</h1>
<p><span class="index" id="idxref:14"></span></p>
<p>navigation, portals &amp; mutations</p> <p>navigation, portals &amp; mutations</p>
<table> <table>
@ -873,7 +985,9 @@ Clicking the href-value below will:</p>
<p>optionally the viewer can offer thumbstick, mouse or joystick teleport-tools for non-roomscale VR/AR setups.</p> <p>optionally the viewer can offer thumbstick, mouse or joystick teleport-tools for non-roomscale VR/AR setups.</p>
</blockquote> </blockquote>
<h1 id="virtual-world-rings">Virtual world rings</h1> <h1 id="example-virtual-world-rings">Example: Virtual world rings</h1>
<p><span class="index" id="idxref:15"></span></p>
<p>Consider 3D scenes linking to eachother using these <code>href</code> values, attached to 3D button-objects:</p> <p>Consider 3D scenes linking to eachother using these <code>href</code> values, attached to 3D button-objects:</p>
@ -892,13 +1006,10 @@ Now consider adding a &lsquo;webring index&rsquo;-button to each file, with this
<p>This would allow displaying the (remote 3D file) webring menu with various href-buttons inside, all centrally curated by the workgroup.</p> <p>This would allow displaying the (remote 3D file) webring menu with various href-buttons inside, all centrally curated by the workgroup.</p>
<h1 id="level5-uri-templates-rfc6570">Level5: URI Templates (RFC6570)</h1>
<p>XR Fragments adopts Level1 URI <strong>Fragment</strong> expansion to provide safe interactivity.<br>
This is non-normative, and the draft spec is available on request.</p>
<h1 id="additional-scene-metadata">Additional scene metadata</h1> <h1 id="additional-scene-metadata">Additional scene metadata</h1>
<p><span class="index" id="idxref:16"></span></p>
<p>XR Fragments does not aim to redefine the metadata-space or accessibility-space by introducing its own cataloging-metadata fields. <p>XR Fragments does not aim to redefine the metadata-space or accessibility-space by introducing its own cataloging-metadata fields.
Instead, it encourages browsers to scan nodes for the following custom properties:</p> Instead, it encourages browsers to scan nodes for the following custom properties:</p>
@ -997,6 +1108,8 @@ Instead, it encourages browsers to scan nodes for the following custom propertie
<h1 id="accessibility-interface">Accessibility interface</h1> <h1 id="accessibility-interface">Accessibility interface</h1>
<p><span class="index" id="idxref:17"></span></p>
<p>The addressibility of XR Fragments allows for unique 3D-to-text transcripts, as well as an textual interface to navigate 3D content.<br> <p>The addressibility of XR Fragments allows for unique 3D-to-text transcripts, as well as an textual interface to navigate 3D content.<br>
Spec:<br><Br></p> Spec:<br><Br></p>
@ -1057,7 +1170,9 @@ If a glTF implementation does not support a particular extension, the (XRF) extr
<p><strong>Example 2</strong> If an Extensions uses XR Fragments in URI&rsquo;s (<code>href: #otherroom</code> or <code>href: xrf://-walls</code> in OMI_LINK e.g.), then perform them according to XR Fragment spec (teleport user). But only once: ignore further overlapping metadata for that usecase.</p> <p><strong>Example 2</strong> If an Extensions uses XR Fragments in URI&rsquo;s (<code>href: #otherroom</code> or <code>href: xrf://-walls</code> in OMI_LINK e.g.), then perform them according to XR Fragment spec (teleport user). But only once: ignore further overlapping metadata for that usecase.</p>
</blockquote> </blockquote>
<h2 id="vendor-prefixes">Vendor Prefixes</h2> <h1 id="vendor-prefixes">Vendor Prefixes</h1>
<p><span class="index" id="idxref:18"></span></p>
<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.). <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> This allows popular 3D engines/frameworks, to initialize specific features when loading a scene/object, in a progressive enhanced way.</p>
@ -1145,12 +1260,16 @@ The lowest common denominator between 3D engines is the &lsquo;entity&rsquo;-par
<h1 id="security-considerations">Security Considerations</h1> <h1 id="security-considerations">Security Considerations</h1>
<p><span class="index" id="idxref:19"></span></p>
<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>
n 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>
<p><span class="index" id="idxref:20"></span></p>
<p><strong>Q:</strong> Why is everything HTTP GET-based, what about POST/PUT/DELETE HATEOS<br> <p><strong>Q:</strong> Why is everything HTTP GET-based, what about POST/PUT/DELETE HATEOS<br>
<strong>A:</strong> Because it&rsquo;s out of scope: XR Fragment specifies a read-only way to surf XR documents. These things belong in the application layer (for example, an XR Hypermedia browser can decide to support POST/PUT/DELETE requests for embedded HTML thru <code>src</code> values)</p> <strong>A:</strong> Because it&rsquo;s out of scope: XR Fragment specifies a read-only way to surf XR documents. These things belong in the application layer (for example, an XR Hypermedia browser can decide to support POST/PUT/DELETE requests for embedded HTML thru <code>src</code> values)</p>
@ -1164,6 +1283,8 @@ Non-HTML Hypermedia browsers should make browser extensions the right place, to
<h1 id="authors">authors</h1> <h1 id="authors">authors</h1>
<p><span class="index" id="idxref:21"></span></p>
<ul> <ul>
<li>Leon van Kammen (@lvk@mastodon.online)</li> <li>Leon van Kammen (@lvk@mastodon.online)</li>
<li>Jens Finkhäuser (@jens@social.finkhaeuser.de)</li> <li>Jens Finkhäuser (@jens@social.finkhaeuser.de)</li>
@ -1171,10 +1292,14 @@ Non-HTML Hypermedia browsers should make browser extensions the right place, to
<h1 id="iana-considerations">IANA Considerations</h1> <h1 id="iana-considerations">IANA Considerations</h1>
<p><span class="index" id="idxref:22"></span></p>
<p>This document has no IANA actions.</p> <p>This document has no IANA actions.</p>
<h1 id="acknowledgments">Acknowledgments</h1> <h1 id="acknowledgments">Acknowledgments</h1>
<p><span class="index" id="idxref:23"></span></p>
<ul> <ul>
<li><a href="https://nlnet.nl">NLNET</a></li> <li><a href="https://nlnet.nl">NLNET</a></li>
<li><a href="https://futureoftext.org">Future of Text</a></li> <li><a href="https://futureoftext.org">Future of Text</a></li>
@ -1192,6 +1317,8 @@ Non-HTML Hypermedia browsers should make browser extensions the right place, to
<h1 id="appendix-definitions">Appendix: Definitions</h1> <h1 id="appendix-definitions">Appendix: Definitions</h1>
<p><span class="index" id="idxref:24"></span></p>
<table> <table>
<thead> <thead>
<tr> <tr>
@ -1342,6 +1469,149 @@ Non-HTML Hypermedia browsers should make browser extensions the right place, to
</tr> </tr>
</tbody> </tbody>
</table> </table>
<h1 id="index-section">Index</h1>
<div class="index">
<dl>
<dt>A</dt>
<dd>
<ul>
<li>
Accessibility interface <a class="index-return" href="#idxref:17"><sup>[go]</sup></a></li>
<li>
Acknowledgments <a class="index-return" href="#idxref:23"><sup>[go]</sup></a></li>
<li>
Additional scene metadata <a class="index-return" href="#idxref:16"><sup>[go]</sup></a></li>
<li>
Appendix: Definitions <a class="index-return" href="#idxref:24"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>C</dt>
<dd>
<ul>
<li>
Conventions and Definitions <a class="index-return" href="#idxref:3"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>E</dt>
<dd>
<ul>
<li>
Example: Navigating content href portals <a class="index-return" href="#idxref:14"><sup>[go]</sup></a></li>
<li>
Example: Virtual world rings <a class="index-return" href="#idxref:15"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>F</dt>
<dd>
<ul>
<li>
FAQ <a class="index-return" href="#idxref:20"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>H</dt>
<dd>
<ul>
<li>
HFL (Hypermediatic Feedback Loop <a class="index-return" href="#idxref:2"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>I</dt>
<dd>
<ul>
<li>
IANA Considerations <a class="index-return" href="#idxref:22"><sup>[go]</sup></a></li>
<li>
Introduction <a class="index-return" href="#idxref:0"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>L</dt>
<dd>
<ul>
<li>
Level0: Files <a class="index-return" href="#idxref:6"><sup>[go]</sup></a> <a class="index-return" href="#idxref:7"><sup>[go]</sup></a></li>
<li>
Level1: URI <a class="index-return" href="#idxref:8"><sup>[go]</sup></a></li>
<li>
Level2: href links <a class="index-return" href="#idxref:9"><sup>[go]</sup></a></li>
<li>
Level3: Media Fragments <a class="index-return" href="#idxref:10"><sup>[go]</sup></a></li>
<li>
Level4: prefix operators <a class="index-return" href="#idxref:11"><sup>[go]</sup></a></li>
<li>
Level5: URI Templates (RFC6570 <a class="index-return" href="#idxref:12"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>S</dt>
<dd>
<ul>
<li>
Security Considerations <a class="index-return" href="#idxref:19"><sup>[go]</sup></a></li>
<li>
Spatial Referencing 3D <a class="index-return" href="#idxref:5"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>T</dt>
<dd>
<ul>
<li>
Top-level URL processing <a class="index-return" href="#idxref:13"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>V</dt>
<dd>
<ul>
<li>
Vendor Prefixes <a class="index-return" href="#idxref:18"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>W</dt>
<dd>
<ul>
<li>
What is XR Fragments <a class="index-return" href="#idxref:1"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>X</dt>
<dd>
<ul>
<li>
XR Fragment URL Grammar <a class="index-return" href="#idxref:4"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
<dl>
<dt>a</dt>
<dd>
<ul>
<li>
authors <a class="index-return" href="#idxref:21"><sup>[go]</sup></a></li>
</ul>
</dd>
</dl>
</div>
</section> </section>
</body> </body>

View file

@ -106,7 +106,57 @@ These heuristics, enable features that are both meaningful and consistent across
{mainmatter} {mainmatter}
# Quick reference
1. [Abstract](#abstract)
1. [Index](#index)
1. [Introduction](#introduction)
1. [What is XR Fragments](#what-is-xr-fragments)
1. [HFL (Hypermediatic Feedback Loop) for XR Browsers](#hfl-hypermediatic-feedback-loop-for-xr-browsers)
1. [Conventions and Definitions](#conventions-and-definitions)
1. [XR Fragment URL Grammar](#xr-fragment-url-grammar)
1. [Spatial Referencing 3D](#spatial-referencing-3d)
1. [Level0: Files](#level0-files)
1. [via href metadata](#via-href-metadata)
1. [via chained extension](#via-chained-extension)
1. [via subdocuments/xattr](#via-subdocuments-xattr)
1. [JSON sidecar-file](#json-sidecar-file)
1. [Level1: URI](#level1-uri)
1. [List of URI Fragments](#list-of-uri-fragments)
1. [List of explicit metadata](#list-of-explicit-metadata)
1. [Level2: href links](#level2-href-links)
1. [Interaction behaviour](#interaction-behaviour)
1. [XR Viewer implementation](#xr-viewer-implementation)
1. [Level3: Media Fragments](#level3-media-fragments)
1. [Animation(s) timeline](#animation-s-timeline)
1. [Specify playback loopmode](#specify-playback-loopmode)
1. [Controlling embedded content](#controlling-embedded-content)
1. [Level4: prefix operators](#level4-prefix-operators)
1. [Object teleports](#object-teleports)
1. [Object multipliers](#object-multipliers)
1. [De/selectors (+ and -)](#de-selectors-and)
1. [Sharing object or file (#|)](#sharing-object-or-file)
1. [xrf:// URI scheme](#xrf-uri-scheme)
1. [Level5: URI Templates (RFC6570)](#level5-uri-templates-rfc6570)
1. [Top-level URL processing](#top-level-url-processing)
1. [UX](#ux)
1. [Example: Navigating content href portals](#example-navigating-content-href-portals)
1. [Walking surfaces](#walking-surfaces)
1. [Example: Virtual world rings](#example-virtual-world-rings)
1. [Additional scene metadata](#additional-scene-metadata)
1. [Accessibility interface](#accessibility-interface)
1. [Two-button navigation](#two-button-navigation)
1. [Overlap with fileformat-specific extensions](#overlap-with-fileformat-specific-extensions)
1. [Vendor Prefixes](#vendor-prefixes)
1. [Security Considerations](#security-considerations)
1. [FAQ](#faq)
1. [Authors](#authors)
1. [IANA Considerations](#iana-considerations)
1. [Acknowledgments](#acknowledgments)
1. [Appendix: Definitions](#appendix-definitions)
# Introduction # Introduction
(!Introduction)
How can we add more control to existing text and 3D scenes, without introducing new dataformats?<br> How can we add more control to existing text and 3D scenes, without introducing new dataformats?<br>
Historically, there's many attempts to create the ultimate 3D fileformat.<br> Historically, there's many attempts to create the ultimate 3D fileformat.<br>
@ -126,6 +176,7 @@ It solves:
> NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible > NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible
# What is XR Fragments # What is XR Fragments
(!What is XR Fragments )
XR Fragments utilizes URLs: XR Fragments utilizes URLs:
@ -136,6 +187,7 @@ XR Fragments utilizes URLs:
# HFL (Hypermediatic Feedback Loop) for XR Browsers # HFL (Hypermediatic Feedback Loop) for XR Browsers
(!HFL (Hypermediatic Feedback Loop) for XR Browsers)
`href` metadata traditionally implies **click** AND **navigate**, however XR Fragments adds stateless **click** (`xrf://....`) via the `xrf://` scheme, which does not change the top-level URL-adress (of the browser). `href` metadata traditionally implies **click** AND **navigate**, however XR Fragments adds stateless **click** (`xrf://....`) via the `xrf://` scheme, which does not change the top-level URL-adress (of the browser).
This allows for many extra interactions via URLs, which otherwise needs a scripting language. This allows for many extra interactions via URLs, which otherwise needs a scripting language.
@ -169,10 +221,12 @@ XR Fragments itself are [hypermediatic](https://github.com/coderofsalvation/hype
> An important aspect of HFL is that URI Fragments can be triggered without updating the top-level URI (default href-behaviour) thru their own 'bus' (`xrf://#.....`). This decoupling between navigation and interaction prevents non-standard things like (`href`:`javascript:dosomething()`). > An important aspect of HFL is that URI Fragments can be triggered without updating the top-level URI (default href-behaviour) thru their own 'bus' (`xrf://#.....`). This decoupling between navigation and interaction prevents non-standard things like (`href`:`javascript:dosomething()`).
# Conventions and Definitions # Conventions and Definitions
(!Conventions and Definitions)
See appendix below in case certain terms are not clear. See appendix below in case certain terms are not clear.
## XR Fragment URL Grammar ## XR Fragment URL Grammar
(! XR Fragment URL Grammar )
For typical HTTP-like browsers/applications: For typical HTTP-like browsers/applications:
@ -196,6 +250,7 @@ In other words, the URL updates to: `https://me.com?https://me.com/other.glb` wh
That way, if the link gets shared, the XR Fragments implementation at `https://me.com` can load the latter (and still indicates which XR Fragments entrypoint-experience/client was used). That way, if the link gets shared, the XR Fragments implementation at `https://me.com` can load the latter (and still indicates which XR Fragments entrypoint-experience/client was used).
# Spatial Referencing 3D # Spatial Referencing 3D
(!Spatial Referencing 3D )
3D files contain an hierarchy of objects.<br> 3D files contain an hierarchy of objects.<br>
XR Fragments assumes the following objectname-to-URI-Fragment mapping, in order to deeplink 3D objects: XR Fragments assumes the following objectname-to-URI-Fragment mapping, in order to deeplink 3D objects:
@ -229,6 +284,8 @@ For example, to render a portal with a preview-version of the scene, create an 3
> It also allows **sourceportation**, which basically means the enduser can teleport to the original XR Document of an `src` embedded object, and see a visible connection to the particular embedded object. Basically an embedded link becoming an outbound link by activating it. > It also allows **sourceportation**, which basically means the enduser can teleport to the original XR Document of an `src` embedded object, and see a visible connection to the particular embedded object. Basically an embedded link becoming an outbound link by activating it.
# Level0: Files # Level0: Files
(!Level0: Files )
(!Level0: Files)
These are **optional** auto-loaded [side-car files]() to enable hasslefree [XR Movies](#XR%20Movies).<br> These are **optional** auto-loaded [side-car files]() to enable hasslefree [XR Movies](#XR%20Movies).<br>
they can accomodate developers or applications who (for whatever reason) must not modify the 3D scene-file (a `.glb` e.g.). they can accomodate developers or applications who (for whatever reason) must not modify the 3D scene-file (a `.glb` e.g.).
@ -325,6 +382,7 @@ The sidecar will define (or **override** already existing) extras, which can be
``` ```
# Level1: URI # Level1: URI
(!Level1: URI)
> **XR Fragments allows deeplinking of 3D objects by mapping objectnames to URI fragments** > **XR Fragments allows deeplinking of 3D objects by mapping objectnames to URI fragments**
@ -386,7 +444,7 @@ Below you can see how this translates back into good-old URLs:
> ?-linked and #-linked navigation are JUST one possible way to implement XR Fragments: the essential goal is to allow a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation. > ?-linked and #-linked navigation are JUST one possible way to implement XR Fragments: the essential goal is to allow a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.
# List of URI Fragments ## List of URI Fragments
| fragment | type | example | info | | fragment | type | example | info |
|-------------------|------------|--------------------|----------------------------------------------------------------------| |-------------------|------------|--------------------|----------------------------------------------------------------------|
@ -394,7 +452,7 @@ Below you can see how this translates back into good-old URLs:
| [Media Fragments](https://www.w3.org/TR/media-frags/) | [media fragment](#media%20fragments%20and%20datatypes) | `#t=0,2&loop` | play (and loop) 3D animation from 0 seconds till 2 seconds| | [Media Fragments](https://www.w3.org/TR/media-frags/) | [media fragment](#media%20fragments%20and%20datatypes) | `#t=0,2&loop` | play (and loop) 3D animation from 0 seconds till 2 seconds|
# List of **explicit* metadata ## List of **explicit* metadata
These are the possible 'extras' for 3D nodes and sidecar-files These are the possible 'extras' for 3D nodes and sidecar-files
@ -404,6 +462,7 @@ These are the possible 'extras' for 3D nodes and sidecar-files
# Level2: href links # Level2: href links
(!Level2: href links)
Explicit href metadata ('extras') in a 3D object (of a 3D file), hint the viewer that the user ''can interact'' with that object : Explicit href metadata ('extras') in a 3D object (of a 3D file), hint the viewer that the user ''can interact'' with that object :
@ -431,6 +490,7 @@ The imported/teleported destination can be another object in the same scene-file
> NOTE: hashbus links (`xrf://#foo&bar`) don't change the toplevel URL, which makes it ideal for interactions (in contrast to typical `#roomC` navigation, which benefit back/forward browser-buttons), see <a href="#hashbus">hashbus</a> for more info. > NOTE: hashbus links (`xrf://#foo&bar`) don't change the toplevel URL, which makes it ideal for interactions (in contrast to typical `#roomC` navigation, which benefit back/forward browser-buttons), see <a href="#hashbus">hashbus</a> for more info.
# Level3: Media Fragments # Level3: Media Fragments
(!Level3: Media Fragments )
> these allow for XR Movies with a controllable timeline using `href` URI's with Media Fragments > these allow for XR Movies with a controllable timeline using `href` URI's with Media Fragments
@ -488,6 +548,7 @@ use [[URI Templates]] to control embedded media, for example a simple video-play
``` ```
# Level4: prefix operators # Level4: prefix operators
(!Level4: prefix operators)
Prefixing objectnames with the following simple operators allow for **extremely powerful** XR interactions: Prefixing objectnames with the following simple operators allow for **extremely powerful** XR interactions:
@ -603,7 +664,15 @@ The `xrf:` scheme will just do 2 & 3 (so the URL-values will not leak into the t
> **compliance with RFC 3986**: unimplemented/unknown URI schemes (`xrf:...` e.g.) will not update the top-level URL > **compliance with RFC 3986**: unimplemented/unknown URI schemes (`xrf:...` e.g.) will not update the top-level URL
# Level5: URI Templates (RFC6570)
(!Level5: URI Templates (RFC6570))
XR Fragments adopts Level1 URI **Fragment** expansion to provide safe interactivity.<br>
This is non-normative, and the draft spec is available on request.
# Top-level URL processing # Top-level URL processing
(!Top-level URL processing)
> Example URL: `://foo/world.gltf#room1&t=10&cam` > Example URL: `://foo/world.gltf#room1&t=10&cam`
@ -623,6 +692,7 @@ End-users should always have read/write access to:
# Example: Navigating content href portals # Example: Navigating content href portals
(!Example: Navigating content href portals)
navigation, portals & mutations navigation, portals & mutations
@ -662,7 +732,8 @@ XR Fragment-compatible viewers can infer this data based scanning the scene for:
> optionally the viewer can offer thumbstick, mouse or joystick teleport-tools for non-roomscale VR/AR setups. > optionally the viewer can offer thumbstick, mouse or joystick teleport-tools for non-roomscale VR/AR setups.
# Virtual world rings # Example: Virtual world rings
(!Example: Virtual world rings )
Consider 3D scenes linking to eachother using these `href` values, attached to 3D button-objects: Consider 3D scenes linking to eachother using these `href` values, attached to 3D button-objects:
@ -678,12 +749,8 @@ Now consider adding a 'webring index'-button to each file, with this href-value:
This would allow displaying the (remote 3D file) webring menu with various href-buttons inside, all centrally curated by the workgroup. This would allow displaying the (remote 3D file) webring menu with various href-buttons inside, all centrally curated by the workgroup.
# Level5: URI Templates (RFC6570)
XR Fragments adopts Level1 URI **Fragment** expansion to provide safe interactivity.<br>
This is non-normative, and the draft spec is available on request.
# Additional scene metadata # Additional scene metadata
(!Additional scene metadata )
XR Fragments does not aim to redefine the metadata-space or accessibility-space by introducing its own cataloging-metadata fields. XR Fragments does not aim to redefine the metadata-space or accessibility-space by introducing its own cataloging-metadata fields.
Instead, it encourages browsers to scan nodes for the following custom properties: Instead, it encourages browsers to scan nodes for the following custom properties:
@ -727,6 +794,7 @@ There's no silver bullet when it comes to metadata, so XR Fragment-implementatio
> These attributes can be scanned and presented during an `href` or `src` eye/mouse-over. > These attributes can be scanned and presented during an `href` or `src` eye/mouse-over.
# Accessibility interface # Accessibility interface
(!Accessibility interface)
The addressibility of XR Fragments allows for unique 3D-to-text transcripts, as well as an textual interface to navigate 3D content.<br> The addressibility of XR Fragments allows for unique 3D-to-text transcripts, as well as an textual interface to navigate 3D content.<br>
Spec:<br><Br> Spec:<br><Br>
@ -778,7 +846,8 @@ If a glTF implementation does not support a particular extension, the (XRF) extr
> **Example 2** If an Extensions uses XR Fragments in URI's (`href: #otherroom` or `href: xrf://-walls` in OMI_LINK e.g.), then perform them according to XR Fragment spec (teleport user). But only once: ignore further overlapping metadata for that usecase. > **Example 2** If an Extensions uses XR Fragments in URI's (`href: #otherroom` or `href: xrf://-walls` in OMI_LINK e.g.), then perform them according to XR Fragment spec (teleport user). But only once: ignore further overlapping metadata for that usecase.
## Vendor Prefixes # Vendor Prefixes
(!Vendor Prefixes )
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.). 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. This allows popular 3D engines/frameworks, to initialize specific features when loading a scene/object, in a progressive enhanced way.
@ -837,12 +906,14 @@ String-templatevalues are evaluated as per [URI Templates (RFC6570)](https://www
# Security Considerations # 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>
n 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
(!FAQ )
**Q:** Why is everything HTTP GET-based, what about POST/PUT/DELETE HATEOS<br> **Q:** Why is everything HTTP GET-based, what about POST/PUT/DELETE HATEOS<br>
**A:** Because it's out of scope: XR Fragment specifies a read-only way to surf XR documents. These things belong in the application layer (for example, an XR Hypermedia browser can decide to support POST/PUT/DELETE requests for embedded HTML thru `src` values) **A:** Because it's out of scope: XR Fragment specifies a read-only way to surf XR documents. These things belong in the application layer (for example, an XR Hypermedia browser can decide to support POST/PUT/DELETE requests for embedded HTML thru `src` values)
@ -856,15 +927,18 @@ Doing advanced scripting & networkrequests under the hood are obviously interest
Non-HTML Hypermedia browsers should make browser extensions the right place, to 'extend' experiences, in contrast to code/javascript inside hypermedia documents (this turned out as a hypermedia antipattern). Non-HTML Hypermedia browsers should make browser extensions the right place, to 'extend' experiences, in contrast to code/javascript inside hypermedia documents (this turned out as a hypermedia antipattern).
# authors # authors
(!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)
# IANA Considerations # IANA Considerations
(!IANA Considerations)
This document has no IANA actions. This document has no IANA actions.
# Acknowledgments # Acknowledgments
(!Acknowledgments)
* [NLNET](https://nlnet.nl) * [NLNET](https://nlnet.nl)
* [Future of Text](https://futureoftext.org) * [Future of Text](https://futureoftext.org)
@ -880,6 +954,7 @@ This document has no IANA actions.
* Mark Anderson * Mark Anderson
# Appendix: Definitions # Appendix: Definitions
(!Appendix: Definitions )
|definition | explanation | |definition | explanation |
|----------------------|--------------------------------------------------------------------------------------------------------------------------------------| |----------------------|--------------------------------------------------------------------------------------------------------------------------------------|

View file

@ -86,26 +86,26 @@ Copyright Notice
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1. Quick reference . . . . . . . . . . . . . . . . . . . . . . . 3
2. What is XR Fragments . . . . . . . . . . . . . . . . . . . . 4 2. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4
3. HFL (Hypermediatic Feedback Loop) for XR Browsers . . . . . . 4 3. What is XR Fragments . . . . . . . . . . . . . . . . . . . . 5
4. Conventions and Definitions . . . . . . . . . . . . . . . . . 6 4. HFL (Hypermediatic Feedback Loop) for XR Browsers . . . . . . 5
4.1. XR Fragment URL Grammar . . . . . . . . . . . . . . . . . 6 5. Conventions and Definitions . . . . . . . . . . . . . . . . . 8
5. Spatial Referencing 3D . . . . . . . . . . . . . . . . . . . 6 5.1. XR Fragment URL Grammar . . . . . . . . . . . . . . . . . 8
6. Level0: Files . . . . . . . . . . . . . . . . . . . . . . . . 7 6. Spatial Referencing 3D . . . . . . . . . . . . . . . . . . . 8
6.1. via href metadata . . . . . . . . . . . . . . . . . . . . 7 7. Level0: Files . . . . . . . . . . . . . . . . . . . . . . . . 9
6.2. via chained extension . . . . . . . . . . . . . . . . . . 8 7.1. via href metadata . . . . . . . . . . . . . . . . . . . . 9
6.3. via subdocuments/xattr . . . . . . . . . . . . . . . . . 8 7.2. via chained extension . . . . . . . . . . . . . . . . . . 10
6.4. JSON sidecar-file . . . . . . . . . . . . . . . . . . . . 9 7.3. via subdocuments/xattr . . . . . . . . . . . . . . . . . 10
7. Level1: URI . . . . . . . . . . . . . . . . . . . . . . . . . 9 7.4. JSON sidecar-file . . . . . . . . . . . . . . . . . . . . 11
8. List of URI Fragments . . . . . . . . . . . . . . . . . . . . 11 8. Level1: URI . . . . . . . . . . . . . . . . . . . . . . . . . 11
9. List of *_explicit_ metadata . . . . . . . . . . . . . . . . 12 8.1. List of URI Fragments . . . . . . . . . . . . . . . . . . 13
10. Level2: href links . . . . . . . . . . . . . . . . . . . . . 12 8.2. List of *_explicit_ metadata . . . . . . . . . . . . . . 14
10.1. Interaction behaviour . . . . . . . . . . . . . . . . . 12 9. Level2: href links . . . . . . . . . . . . . . . . . . . . . 14
10.2. XR Viewer implementation . . . . . . . . . . . . . . . . 12 9.1. Interaction behaviour . . . . . . . . . . . . . . . . . . 14
11. Level3: Media Fragments . . . . . . . . . . . . . . . . . . . 13 9.2. XR Viewer implementation . . . . . . . . . . . . . . . . 14
11.1. Animation(s) timeline . . . . . . . . . . . . . . . . . 13 10. Level3: Media Fragments . . . . . . . . . . . . . . . . . . . 15
11.2. Specify playback loopmode . . . . . . . . . . . . . . . 13 10.1. Animation(s) timeline . . . . . . . . . . . . . . . . . 15
@ -114,32 +114,93 @@ van Kammen Expires 23 March 2026 [Page 2]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
11.3. Controlling embedded content . . . . . . . . . . . . . . 14 10.2. Specify playback loopmode . . . . . . . . . . . . . . . 15
12. Level4: prefix operators . . . . . . . . . . . . . . . . . . 14 10.3. Controlling embedded content . . . . . . . . . . . . . . 16
12.1. Object teleports (!) . . . . . . . . . . . . . . . . . . 14 11. Level4: prefix operators . . . . . . . . . . . . . . . . . . 16
12.2. Object multipliers (*) . . . . . . . . . . . . . . . . . 16 11.1. Object teleports (!) . . . . . . . . . . . . . . . . . . 16
12.3. De/selectors (+ and -) . . . . . . . . . . . . . . . . . 16 11.2. Object multipliers (*) . . . . . . . . . . . . . . . . . 18
12.4. Sharing object or file (#|) . . . . . . . . . . . . . . 16 11.3. De/selectors (+ and -) . . . . . . . . . . . . . . . . . 18
12.5. xrf:// URI scheme . . . . . . . . . . . . . . . . . . . 17 11.4. Sharing object or file (#|) . . . . . . . . . . . . . . 18
13. Top-level URL processing . . . . . . . . . . . . . . . . . . 17 11.5. xrf:// URI scheme . . . . . . . . . . . . . . . . . . . 19
13.1. UX . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 12. Level5: URI Templates (RFC6570) . . . . . . . . . . . . . . . 19
14. Example: Navigating content href portals . . . . . . . . . . 18 13. Top-level URL processing . . . . . . . . . . . . . . . . . . 19
14.1. Walking surfaces . . . . . . . . . . . . . . . . . . . . 19 13.1. UX . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
15. Virtual world rings . . . . . . . . . . . . . . . . . . . . . 19 14. Example: Navigating content href portals . . . . . . . . . . 20
16. Level5: URI Templates (RFC6570) . . . . . . . . . . . . . . . 20 14.1. Walking surfaces . . . . . . . . . . . . . . . . . . . . 21
17. Additional scene metadata . . . . . . . . . . . . . . . . . . 20 15. Example: Virtual world rings . . . . . . . . . . . . . . . . 21
18. Accessibility interface . . . . . . . . . . . . . . . . . . . 21 16. Additional scene metadata . . . . . . . . . . . . . . . . . . 22
18.1. Two-button navigation . . . . . . . . . . . . . . . . . 22 17. Accessibility interface . . . . . . . . . . . . . . . . . . . 23
18.2. Overlap with fileformat-specific extensions . . . . . . 22 17.1. Two-button navigation . . . . . . . . . . . . . . . . . 24
18.3. Vendor Prefixes . . . . . . . . . . . . . . . . . . . . 23 17.2. Overlap with fileformat-specific extensions . . . . . . 25
19. Security Considerations . . . . . . . . . . . . . . . . . . . 26 18. Vendor Prefixes . . . . . . . . . . . . . . . . . . . . . . . 25
20. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 19. Security Considerations . . . . . . . . . . . . . . . . . . . 28
21. authors . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 20. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
22. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27 21. authors . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
23. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 27 22. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 29
24. Appendix: Definitions . . . . . . . . . . . . . . . . . . . . 27 23. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 29
24. Appendix: Definitions . . . . . . . . . . . . . . . . . . . . 29
1. Introduction 1. Quick reference
1. Abstract (#abstract)
2. Index (#index)
3. Introduction (#introduction)
4. What is XR Fragments (#what-is-xr-fragments)
5. HFL (Hypermediatic Feedback Loop) for XR Browsers (#hfl-
hypermediatic-feedback-loop-for-xr-browsers)
6. Conventions and Definitions (#conventions-and-definitions)
1. XR Fragment URL Grammar (#xr-fragment-url-grammar)
7. Spatial Referencing 3D (#spatial-referencing-3d)
8. Level0: Files (#level0-files)
1. via href metadata (#via-href-metadata)
2. via chained extension (#via-chained-extension)
3. via subdocuments/xattr (#via-subdocuments-xattr)
4. JSON sidecar-file (#json-sidecar-file)
9. Level1: URI (#level1-uri)
1. List of URI Fragments (#list-of-uri-fragments)
2. List of explicit metadata (#list-of-explicit-metadata)
10. Level2: href links (#level2-href-links)
1. Interaction behaviour (#interaction-behaviour)
2. XR Viewer implementation (#xr-viewer-implementation)
van Kammen Expires 23 March 2026 [Page 3]
Internet-Draft XR Fragments September 2025
11. Level3: Media Fragments (#level3-media-fragments)
1. Animation(s) timeline (#animation-s-timeline)
2. Specify playback loopmode (#specify-playback-loopmode)
3. Controlling embedded content (#controlling-embedded-content)
12. Level4: prefix operators (#level4-prefix-operators)
1. Object teleports (#object-teleports)
2. Object multipliers (#object-multipliers)
3. De/selectors (+ and -) (#de-selectors-and)
4. Sharing object or file (#|) (#sharing-object-or-file)
5. xrf:// URI scheme (#xrf-uri-scheme)
13. Level5: URI Templates (RFC6570) (#level5-uri-templates-rfc6570)
14. Top-level URL processing (#top-level-url-processing)
1. UX (#ux)
15. Example: Navigating content href portals (#example-navigating-
content-href-portals)
1. Walking surfaces (#walking-surfaces)
16. Example: Virtual world rings (#example-virtual-world-rings)
17. Additional scene metadata (#additional-scene-metadata)
18. Accessibility interface (#accessibility-interface)
1. Two-button navigation (#two-button-navigation)
2. Overlap with fileformat-specific extensions (#overlap-with-
fileformat-specific-extensions)
19. Vendor Prefixes (#vendor-prefixes)
20. Security Considerations (#security-considerations)
21. FAQ (#faq)
22. Authors (#authors)
23. IANA Considerations (#iana-considerations)
24. Acknowledgments (#acknowledgments)
25. Appendix: Definitions (#appendix-definitions)
2. Introduction
How can we add more control to existing text and 3D scenes, without How can we add more control to existing text and 3D scenes, without
introducing new dataformats? introducing new dataformats?
@ -155,21 +216,22 @@ Internet-Draft XR Fragments September 2025
It solves: It solves:
van Kammen Expires 23 March 2026 [Page 4]
Internet-Draft XR Fragments September 2025
1. addressibility and hypermediatic 1. addressibility and hypermediatic
(https://github.com/coderofsalvation/hypermediatic) navigation of (https://github.com/coderofsalvation/hypermediatic) navigation of
3D scenes/objects: URI Fragments (https://en.wikipedia.org/wiki/ 3D scenes/objects: URI Fragments (https://en.wikipedia.org/wiki/
URI_fragment) using src/href spatial metadata URI_fragment) using src/href spatial metadata
2. Interlinking text & spatial objects by collapsing space into a 2. Interlinking text & spatial objects by collapsing space into a
Word Graph (XRWG) to show visible links (#visible-links) Word Graph (XRWG) to show visible links (#visible-links)
van Kammen Expires 23 March 2026 [Page 3]
Internet-Draft XR Fragments September 2025
3. unlocking spatial potential of the (originally 2D) hashtag (which 3. unlocking spatial potential of the (originally 2D) hashtag (which
jumps to a chapter) for navigating XR documents jumps to a chapter) for navigating XR documents
4. refraining from introducing scripting-engines for mundane tasks 4. refraining from introducing scripting-engines for mundane tasks
@ -180,7 +242,7 @@ Internet-Draft XR Fragments September 2025
| NOTE: The chapters in this document are ordered from highlevel to | NOTE: The chapters in this document are ordered from highlevel to
| lowlevel (technical) as much as possible | lowlevel (technical) as much as possible
2. What is XR Fragments 3. What is XR Fragments
XR Fragments utilizes URLs: XR Fragments utilizes URLs:
@ -193,7 +255,9 @@ Internet-Draft XR Fragments September 2025
4. externally: progressively enhance a 3D (file) into an experience 4. externally: progressively enhance a 3D (file) into an experience
via sidecarfiles (https://en.wikipedia.org/wiki/Sidecar_file) via sidecarfiles (https://en.wikipedia.org/wiki/Sidecar_file)
3. HFL (Hypermediatic Feedback Loop) for XR Browsers 4. HFL (Hypermediatic Feedback Loop) for XR Browsers
for XR Browsers)
href metadata traditionally implies *click* AND *navigate*, however href metadata traditionally implies *click* AND *navigate*, however
XR Fragments adds stateless *click* (xrf://....) via the xrf:// XR Fragments adds stateless *click* (xrf://....) via the xrf://
@ -210,6 +274,14 @@ Internet-Draft XR Fragments September 2025
This opens up the following benefits for traditional & future This opens up the following benefits for traditional & future
webbrowsers: webbrowsers:
van Kammen Expires 23 March 2026 [Page 5]
Internet-Draft XR Fragments September 2025
* hypermediatic (https://github.com/coderofsalvation/hypermediatic) * hypermediatic (https://github.com/coderofsalvation/hypermediatic)
loading/clicking 3D assets (gltf/fbx e.g.) natively (with or loading/clicking 3D assets (gltf/fbx e.g.) natively (with or
without using HTML). without using HTML).
@ -218,14 +290,6 @@ Internet-Draft XR Fragments September 2025
to trigger walk-animation for object person) to trigger walk-animation for object person)
* potentially collapsing the 3D scene to an wordgraph (for essential * potentially collapsing the 3D scene to an wordgraph (for essential
navigation purposes) controllable thru a hash(tag)bus navigation purposes) controllable thru a hash(tag)bus
van Kammen Expires 23 March 2026 [Page 4]
Internet-Draft XR Fragments September 2025
* completely bypassing the security-trap of loading external scripts * completely bypassing the security-trap of loading external scripts
(by loading 3D model-files, not HTML-javascriptable resources) (by loading 3D model-files, not HTML-javascriptable resources)
@ -234,6 +298,46 @@ Internet-Draft XR Fragments September 2025
agnostic, though pseudo-XR Fragment browsers *can* be implemented on agnostic, though pseudo-XR Fragment browsers *can* be implemented on
top of HTML/Javascript. top of HTML/Javascript.
van Kammen Expires 23 March 2026 [Page 6]
Internet-Draft XR Fragments September 2025
+=========+======================+=====================================+ +=========+======================+=====================================+
|principle|3D URL |HTML 2D URL | |principle|3D URL |HTML 2D URL |
+=========+======================+=====================================+ +=========+======================+=====================================+
@ -273,26 +377,28 @@ Internet-Draft XR Fragments September 2025
Table 1 Table 1
van Kammen Expires 23 March 2026 [Page 5]
Internet-Draft XR Fragments September 2025
| An important aspect of HFL is that URI Fragments can be triggered | An important aspect of HFL is that URI Fragments can be triggered
| without updating the top-level URI (default href-behaviour) thru | without updating the top-level URI (default href-behaviour) thru
| their own 'bus' (xrf://#.....). This decoupling between | their own 'bus' (xrf://#.....). This decoupling between
| navigation and interaction prevents non-standard things like | navigation and interaction prevents non-standard things like
| (href:javascript:dosomething()). | (href:javascript:dosomething()).
4. Conventions and Definitions
van Kammen Expires 23 March 2026 [Page 7]
Internet-Draft XR Fragments September 2025
5. Conventions and Definitions
See appendix below in case certain terms are not clear. See appendix below in case certain terms are not clear.
4.1. XR Fragment URL Grammar 5.1. XR Fragment URL Grammar
For typical HTTP-like browsers/applications: For typical HTTP-like browsers/applications:
@ -324,7 +430,7 @@ Internet-Draft XR Fragments September 2025
https://me.com can load the latter (and still indicates which XR https://me.com can load the latter (and still indicates which XR
Fragments entrypoint-experience/client was used). Fragments entrypoint-experience/client was used).
5. Spatial Referencing 3D 6. Spatial Referencing 3D
3D files contain an hierarchy of objects. 3D files contain an hierarchy of objects.
XR Fragments assumes the following objectname-to-URI-Fragment XR Fragments assumes the following objectname-to-URI-Fragment
@ -333,7 +439,13 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 6]
van Kammen Expires 23 March 2026 [Page 8]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -369,14 +481,14 @@ Internet-Draft XR Fragments September 2025
| embedded object. Basically an embedded link becoming an outbound | embedded object. Basically an embedded link becoming an outbound
| link by activating it. | link by activating it.
6. Level0: Files 7. Level0: Files
These are *optional* auto-loaded side-car files to enable hasslefree These are *optional* auto-loaded side-car files to enable hasslefree
XR Movies (#XR%20Movies). XR Movies (#XR%20Movies).
they can accomodate developers or applications who (for whatever they can accomodate developers or applications who (for whatever
reason) must not modify the 3D scene-file (a .glb e.g.). reason) must not modify the 3D scene-file (a .glb e.g.).
6.1. via href metadata 7.1. via href metadata
scene.glb <--- 'href' extra [heuristic] detected inside! scene.glb <--- 'href' extra [heuristic] detected inside!
scene.png (preview thumbnail) scene.png (preview thumbnail)
@ -389,7 +501,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 7] van Kammen Expires 23 March 2026 [Page 9]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -398,7 +510,7 @@ Internet-Draft XR Fragments September 2025
* The viewer should poll for the above mentioned sidecar-file * The viewer should poll for the above mentioned sidecar-file
extensions (and present accordingly) extensions (and present accordingly)
6.2. via chained extension 7.2. via chained extension
scene.xrf.glb <--- '.xrf.' sidecar file heuristic detected! scene.xrf.glb <--- '.xrf.' sidecar file heuristic detected!
scene.xrf.png (preview thumbnail) scene.xrf.png (preview thumbnail)
@ -414,7 +526,7 @@ Internet-Draft XR Fragments September 2025
* the chained-extension heuristic .xrf. should be present in the * the chained-extension heuristic .xrf. should be present in the
filename (scene.xrf.glb e.g.) filename (scene.xrf.glb e.g.)
6.3. via subdocuments/xattr 7.3. via subdocuments/xattr
More secure protocols (Nextgraph e.g.) don't allow for simply polling More secure protocols (Nextgraph e.g.) don't allow for simply polling
files. In such case, subdocuments or extended attributes should be files. In such case, subdocuments or extended attributes should be
@ -445,12 +557,12 @@ myspreadsheet.ods
van Kammen Expires 23 March 2026 [Page 8] van Kammen Expires 23 March 2026 [Page 10]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
6.4. JSON sidecar-file 7.4. JSON sidecar-file
For developers, sidecar-file can allow for defining *explicit* XR For developers, sidecar-file can allow for defining *explicit* XR
Fragments links (>level1), outside of the 3D file. Fragments links (>level1), outside of the 3D file.
@ -485,7 +597,7 @@ Internet-Draft XR Fragments September 2025
// now the XR Fragments parser can process the XR Fragments userData 'extras' in the scene // now the XR Fragments parser can process the XR Fragments userData 'extras' in the scene
7. Level1: URI 8. Level1: URI
| *XR Fragments allows deeplinking of 3D objects by mapping | *XR Fragments allows deeplinking of 3D objects by mapping
| objectnames to URI fragments* | objectnames to URI fragments*
@ -501,7 +613,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 9] van Kammen Expires 23 March 2026 [Page 11]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -557,7 +669,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 10] van Kammen Expires 23 March 2026 [Page 12]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -588,7 +700,7 @@ Internet-Draft XR Fragments September 2025
| Hypermediatic FeedbackLoop (HFL) between external and internal 4D | Hypermediatic FeedbackLoop (HFL) between external and internal 4D
| navigation. | navigation.
8. List of URI Fragments 8.1. List of URI Fragments
+=======================+======================================+===========+=============+ +=======================+======================================+===========+=============+
|fragment |type |example |info | |fragment |type |example |info |
@ -613,14 +725,14 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 11] van Kammen Expires 23 March 2026 [Page 13]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
Table 3 Table 3
9. List of *_explicit_ metadata 8.2. List of *_explicit_ metadata
These are the possible 'extras' for 3D nodes and sidecar-files These are the possible 'extras' for 3D nodes and sidecar-files
@ -634,7 +746,7 @@ Internet-Draft XR Fragments September 2025
Table 4 Table 4
10. Level2: href links 9. Level2: href links
Explicit href metadata ('extras') in a 3D object (of a 3D file), hint Explicit href metadata ('extras') in a 3D object (of a 3D file), hint
the viewer that the user ''can interact'' with that object : the viewer that the user ''can interact'' with that object :
@ -646,7 +758,7 @@ Internet-Draft XR Fragments September 2025
://somefile.gltf#foo ://somefile.gltf#foo
| |
10.1. Interaction behaviour 9.1. Interaction behaviour
When clicking an ''href''-value, the user(camera) is teleport to the When clicking an ''href''-value, the user(camera) is teleport to the
referenced object. referenced object.
@ -654,7 +766,7 @@ Internet-Draft XR Fragments September 2025
The imported/teleported destination can be another object in the same The imported/teleported destination can be another object in the same
scene-file, or a different file. scene-file, or a different file.
10.2. XR Viewer implementation 9.2. XR Viewer implementation
| *spec* | *action* | *feature* | |-|-|-| | level0+1 | hover 3D file | *spec* | *action* | *feature* | |-|-|-| | level0+1 | hover 3D file
href (#via-href-metadata) | show the preview PNG thumbnail (if any). href (#via-href-metadata) | show the preview PNG thumbnail (if any).
@ -669,7 +781,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 12] van Kammen Expires 23 March 2026 [Page 14]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -685,7 +797,7 @@ Internet-Draft XR Fragments September 2025
| #roomC navigation, which benefit back/forward browser-buttons), | #roomC navigation, which benefit back/forward browser-buttons),
| see <a href="#hashbus">hashbus</a> for more info. | see <a href="#hashbus">hashbus</a> for more info.
11. Level3: Media Fragments 10. Level3: Media Fragments
| these allow for XR Movies with a controllable timeline using href | these allow for XR Movies with a controllable timeline using href
| URI's with Media Fragments | URI's with Media Fragments
@ -701,7 +813,7 @@ Internet-Draft XR Fragments September 2025
- href: xrf:news.glb?clone#t=0 to instance and play another - href: xrf:news.glb?clone#t=0 to instance and play another
experience experience
11.1. Animation(s) timeline 10.1. Animation(s) timeline
controls the animation(s) of the scene (or src resource which controls the animation(s) of the scene (or src resource which
contains a timeline) contains a timeline)
@ -716,7 +828,7 @@ Internet-Draft XR Fragments September 2025
| Use [[#s 🌱]] to control playback speed | Use [[#s 🌱]] to control playback speed
11.2. Specify playback loopmode 10.2. Specify playback loopmode
This compensates a missing element from Media Fragments to enable/ This compensates a missing element from Media Fragments to enable/
disable temporal looping. . disable temporal looping. .
@ -725,7 +837,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 13] van Kammen Expires 23 March 2026 [Page 15]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -734,7 +846,7 @@ Internet-Draft XR Fragments September 2025
animation/video/audio loop | | <b>#-loop</b> | string | disables animation/video/audio loop | | <b>#-loop</b> | string | disables
animation/video/audio loop | animation/video/audio loop |
11.3. Controlling embedded content 10.3. Controlling embedded content
use [[URI Templates]] to control embedded media, for example a simple use [[URI Templates]] to control embedded media, for example a simple
video-player: video-player:
@ -753,7 +865,7 @@ Internet-Draft XR Fragments September 2025
└── ◻ playbutton_external └── ◻ playbutton_external
└ href: https://my.org/animation.glb#!&t=3,10 <-- import & play external anim └ href: https://my.org/animation.glb#!&t=3,10 <-- import & play external anim
12. Level4: prefix operators 11. Level4: prefix operators
Prefixing objectnames with the following simple operators allow for Prefixing objectnames with the following simple operators allow for
*extremely powerful* XR interactions: *extremely powerful* XR interactions:
@ -768,7 +880,7 @@ Internet-Draft XR Fragments September 2025
| to teleport a menu, #*block to clone a grabbable block, #|object | to teleport a menu, #*block to clone a grabbable block, #|object
| to share an object | to share an object
12.1. Object teleports (!) 11.1. Object teleports (!)
Prefixing an object with an exclamation-symbol, will teleport a Prefixing an object with an exclamation-symbol, will teleport a
(local or remote) referenced object from/to its original/usercamera (local or remote) referenced object from/to its original/usercamera
@ -781,7 +893,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 14] van Kammen Expires 23 March 2026 [Page 16]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -837,7 +949,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 15] van Kammen Expires 23 March 2026 [Page 17]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -855,7 +967,7 @@ Internet-Draft XR Fragments September 2025
| *NOTE*: combining instance-operators allows dynamic construction | *NOTE*: combining instance-operators allows dynamic construction
| of 3D scenes (#london&!welcomeMenu&!fadeBox e.g.) | of 3D scenes (#london&!welcomeMenu&!fadeBox e.g.)
12.2. Object multipliers (*) 11.2. Object multipliers (*)
The star-prefix will clone a (local or remote) referenced object to The star-prefix will clone a (local or remote) referenced object to
the usercamera's location, and make it grabbable. the usercamera's location, and make it grabbable.
@ -865,7 +977,7 @@ Internet-Draft XR Fragments September 2025
| infinitely *clones* the referenced object (instead of | infinitely *clones* the referenced object (instead of
| repositioning the object). | repositioning the object).
12.3. De/selectors (+ and -) 11.3. De/selectors (+ and -)
* href: #-welcome (or #+welcome) * href: #-welcome (or #+welcome)
@ -878,7 +990,7 @@ Internet-Draft XR Fragments September 2025
| *NOTE:* the latter shows that (de)selectors can also be with | *NOTE:* the latter shows that (de)selectors can also be with
| regular href (#href)-values | regular href (#href)-values
12.4. Sharing object or file (#|) 11.4. Sharing object or file (#|)
The pipe-symbol (|) sends a (targeted) object to the OS. Clicking The pipe-symbol (|) sends a (targeted) object to the OS. Clicking
the href-value below will: the href-value below will:
@ -893,7 +1005,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 16] van Kammen Expires 23 March 2026 [Page 18]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -901,7 +1013,7 @@ Internet-Draft XR Fragments September 2025
| *NOTE*: sharing is limited to (internal objects) via xrf: scheme- | *NOTE*: sharing is limited to (internal objects) via xrf: scheme-
| only | only
12.5. xrf:// URI scheme 11.5. xrf:// URI scheme
Prefixing the xrf: to href (#href)-values *will prevent* level2 Prefixing the xrf: to href (#href)-values *will prevent* level2
(#📜%20level2:%20explicit%20links) href (#href)-values from changing (#📜%20level2:%20explicit%20links) href (#href)-values from changing
@ -924,6 +1036,14 @@ Internet-Draft XR Fragments September 2025
| *compliance with RFC 3986*: unimplemented/unknown URI schemes | *compliance with RFC 3986*: unimplemented/unknown URI schemes
| (xrf:... e.g.) will not update the top-level URL | (xrf:... e.g.) will not update the top-level URL
12. Level5: URI Templates (RFC6570)
)
XR Fragments adopts Level1 URI *Fragment* expansion to provide safe
interactivity.
This is non-normative, and the draft spec is available on request.
13. Top-level URL processing 13. Top-level URL processing
| Example URL: ://foo/world.gltf#room1&t=10&cam | Example URL: ://foo/world.gltf#room1&t=10&cam
@ -937,6 +1057,15 @@ Internet-Draft XR Fragments September 2025
0,0,0 as camera coordinate (XR: add user-height) (example (https: 0,0,0 as camera coordinate (XR: add user-height) (example (https:
//github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/ //github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/
three/navigator.js#L31]])) three/navigator.js#L31]]))
van Kammen Expires 23 March 2026 [Page 19]
Internet-Draft XR Fragments September 2025
3. IF a camera-object exists with name cam assume that user(camera) 3. IF a camera-object exists with name cam assume that user(camera)
position position
@ -946,14 +1075,6 @@ Internet-Draft XR Fragments September 2025
1. the current (toplevel) <b>URL</b> (an URLbar etc) 1. the current (toplevel) <b>URL</b> (an URLbar etc)
2. URL-history (a <b>back/forward</b> button e.g.) 2. URL-history (a <b>back/forward</b> button e.g.)
van Kammen Expires 23 March 2026 [Page 17]
Internet-Draft XR Fragments September 2025
3. Clicking/Touching an href navigates (and updates the URL) to 3. Clicking/Touching an href navigates (and updates the URL) to
another scene/file (and coordinate e.g. in case the URL contains another scene/file (and coordinate e.g. in case the URL contains
XR Fragments). XR Fragments).
@ -993,6 +1114,14 @@ Internet-Draft XR Fragments September 2025
(https://github.com/coderofsalvation/xrfragment/blob/dev/example/ (https://github.com/coderofsalvation/xrfragment/blob/dev/example/
aframe/sandbox/index.html#L26-L29) for an example wearable) aframe/sandbox/index.html#L26-L29) for an example wearable)
van Kammen Expires 23 March 2026 [Page 20]
Internet-Draft XR Fragments September 2025
6. make sure that the ''back-button'' of the ''browser-history'' 6. make sure that the ''back-button'' of the ''browser-history''
always refers to the previous position (see [here (https://github always refers to the previous position (see [here (https://github
.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/three/xrf/ .com/coderofsalvation/xrfragment/blob/main/src/3rd/js/three/xrf/
@ -1002,14 +1131,6 @@ Internet-Draft XR Fragments September 2025
using camera-portal collision (the back-button could cause a using camera-portal collision (the back-button could cause a
teleport-loop if the previous position is too close) teleport-loop if the previous position is too close)
van Kammen Expires 23 March 2026 [Page 18]
Internet-Draft XR Fragments September 2025
8. href-events should bubble upward the node-tree (from children to 8. href-events should bubble upward the node-tree (from children to
ancestors, so that ancestors can also conain an href), however ancestors, so that ancestors can also conain an href), however
only 1 href can be executed at the same time. only 1 href can be executed at the same time.
@ -1041,7 +1162,7 @@ Internet-Draft XR Fragments September 2025
| optionally the viewer can offer thumbstick, mouse or joystick | optionally the viewer can offer thumbstick, mouse or joystick
| teleport-tools for non-roomscale VR/AR setups. | teleport-tools for non-roomscale VR/AR setups.
15. Virtual world rings 15. Example: Virtual world rings
Consider 3D scenes linking to eachother using these href values, Consider 3D scenes linking to eachother using these href values,
attached to 3D button-objects: attached to 3D button-objects:
@ -1050,6 +1171,13 @@ Internet-Draft XR Fragments September 2025
* href: schoolB.edu/projects.gltf#math * href: schoolB.edu/projects.gltf#math
* href: university.edu/projects.gltf#math * href: university.edu/projects.gltf#math
van Kammen Expires 23 March 2026 [Page 21]
Internet-Draft XR Fragments September 2025
This would teleport users to the math-projects of those universities. This would teleport users to the math-projects of those universities.
Now consider adding a 'webring index'-button to each file, with this Now consider adding a 'webring index'-button to each file, with this
href-value: href-value:
@ -1059,20 +1187,7 @@ Internet-Draft XR Fragments September 2025
This would allow displaying the (remote 3D file) webring menu with This would allow displaying the (remote 3D file) webring menu with
various href-buttons inside, all centrally curated by the workgroup. various href-buttons inside, all centrally curated by the workgroup.
16. Additional scene metadata
van Kammen Expires 23 March 2026 [Page 19]
Internet-Draft XR Fragments September 2025
16. Level5: URI Templates (RFC6570)
XR Fragments adopts Level1 URI *Fragment* expansion to provide safe
interactivity.
This is non-normative, and the draft spec is available on request.
17. 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
@ -1111,17 +1226,17 @@ Internet-Draft XR Fragments September 2025
| the hashtags are clickable XR Fragments (activating the visible- | the hashtags are clickable XR Fragments (activating the visible-
| links in the XR browser). | links in the XR browser).
Individual nodes can be enriched with such metadata, but most
importantly the scene node:
van Kammen Expires 23 March 2026 [Page 22]
van Kammen Expires 23 March 2026 [Page 20]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
Individual nodes can be enriched with such metadata, but most
importantly the scene node:
+================================+=========================+ +================================+=========================+
| metadata key | example value | | metadata key | example value |
+================================+=========================+ +================================+=========================+
@ -1155,7 +1270,7 @@ Internet-Draft XR Fragments September 2025
| 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.
18. Accessibility interface 17. 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.
@ -1166,18 +1281,19 @@ Internet-Draft XR Fragments September 2025
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
enter text enter text
3. Accessibility-mode must contain a flexible textlog for the user
to read (via screenreader, screen, or TTS e.g.)
4. the textlog contains aria-descriptions, and its narration
(Screenreader e.g.) can be skipped (via 2-button navigation)
van Kammen Expires 23 March 2026 [Page 21]
van Kammen Expires 23 March 2026 [Page 23]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
3. Accessibility-mode must contain a flexible textlog for the user
to read (via screenreader, screen, or TTS e.g.)
4. the textlog contains aria-descriptions, and its narration
(Screenreader e.g.) can be skipped (via 2-button navigation)
5. The back command should navigate back to the previous URL (alias 5. The back command should navigate back to the previous URL (alias
for browser-backbutton) for browser-backbutton)
6. The forward command should navigate back to the next URL (alias 6. The forward command should navigate back to the next URL (alias
@ -1205,7 +1321,7 @@ Internet-Draft XR Fragments September 2025
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://.../...
18.1. Two-button navigation 17.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.
@ -1219,7 +1335,18 @@ Internet-Draft XR Fragments September 2025
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)
18.2. Overlap with fileformat-specific extensions
van Kammen Expires 23 March 2026 [Page 24]
Internet-Draft XR Fragments September 2025
17.2. Overlap with fileformat-specific extensions
Some 3D scene-fileformats have support for extensions. What if the Some 3D scene-fileformats have support for extensions. What if the
functionality of those overlap? For example, GLTF has the OMI_LINK functionality of those overlap? For example, GLTF has the OMI_LINK
@ -1227,13 +1354,6 @@ Internet-Draft XR Fragments September 2025
| Priority Order and Precedence, otherwise fallback applies | Priority Order and Precedence, otherwise fallback applies
van Kammen Expires 23 March 2026 [Page 22]
Internet-Draft XR Fragments September 2025
1.*Extensions Take Precedence*: Since glTF-specific extensions are 1.*Extensions Take Precedence*: Since glTF-specific extensions are
designed with the formats specific needs and optimizations in mind, designed with the formats specific needs and optimizations in mind,
they should take precedence over extras metadata in cases where both they should take precedence over extras metadata in cases where both
@ -1260,7 +1380,7 @@ Internet-Draft XR Fragments September 2025
| them according to XR Fragment spec (teleport user). But only | them according to XR Fragment spec (teleport user). But only
| once: ignore further overlapping metadata for that usecase. | once: ignore further overlapping metadata for that usecase.
18.3. Vendor Prefixes 18. Vendor Prefixes
Vendor-specific metadata in a 3D scenefiles, are similar to vendor- Vendor-specific metadata in a 3D scenefiles, are similar to vendor-
specific CSS-prefixes (https://en.wikipedia.org/wiki/ specific CSS-prefixes (https://en.wikipedia.org/wiki/
@ -1277,15 +1397,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 25]
van Kammen Expires 23 March 2026 [Page 23]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -1341,7 +1453,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 24] van Kammen Expires 23 March 2026 [Page 26]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -1397,7 +1509,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 25] van Kammen Expires 23 March 2026 [Page 27]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -1453,7 +1565,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 26] van Kammen Expires 23 March 2026 [Page 28]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -1509,7 +1621,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 27] van Kammen Expires 23 March 2026 [Page 29]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -1565,7 +1677,7 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 28] van Kammen Expires 23 March 2026 [Page 30]
Internet-Draft XR Fragments September 2025 Internet-Draft XR Fragments September 2025
@ -1621,4 +1733,4 @@ Internet-Draft XR Fragments September 2025
van Kammen Expires 23 March 2026 [Page 29] van Kammen Expires 23 March 2026 [Page 31]

View file

@ -28,8 +28,87 @@ These heuristics, enable features that are both meaningful and consistent across
<middle> <middle>
<section anchor="quick-reference"><name>Quick reference</name>
<ol spacing="compact">
<li><eref target="#abstract">Abstract</eref></li>
<li><eref target="#index">Index</eref></li>
<li><eref target="#introduction">Introduction</eref></li>
<li><eref target="#what-is-xr-fragments">What is XR Fragments</eref></li>
<li><eref target="#hfl-hypermediatic-feedback-loop-for-xr-browsers">HFL (Hypermediatic Feedback Loop) for XR Browsers</eref></li>
<li><t><eref target="#conventions-and-definitions">Conventions and Definitions</eref></t>
<ol spacing="compact">
<li><eref target="#xr-fragment-url-grammar">XR Fragment URL Grammar</eref></li>
</ol></li>
<li><eref target="#spatial-referencing-3d">Spatial Referencing 3D</eref></li>
<li><t><eref target="#level0-files">Level0: Files</eref></t>
<ol spacing="compact">
<li><eref target="#via-href-metadata">via href metadata</eref></li>
<li><eref target="#via-chained-extension">via chained extension</eref></li>
<li><eref target="#via-subdocuments-xattr">via subdocuments/xattr</eref></li>
<li><eref target="#json-sidecar-file">JSON sidecar-file</eref></li>
</ol></li>
<li><t><eref target="#level1-uri">Level1: URI</eref></t>
<ol spacing="compact">
<li><eref target="#list-of-uri-fragments">List of URI Fragments</eref></li>
<li><eref target="#list-of-explicit-metadata">List of explicit metadata</eref></li>
</ol></li>
<li><t><eref target="#level2-href-links">Level2: href links</eref></t>
<ol spacing="compact">
<li><eref target="#interaction-behaviour">Interaction behaviour</eref></li>
<li><eref target="#xr-viewer-implementation">XR Viewer implementation</eref></li>
</ol></li>
<li><t><eref target="#level3-media-fragments">Level3: Media Fragments</eref></t>
<ol spacing="compact">
<li><eref target="#animation-s-timeline">Animation(s) timeline</eref></li>
<li><eref target="#specify-playback-loopmode">Specify playback loopmode</eref></li>
<li><eref target="#controlling-embedded-content">Controlling embedded content</eref></li>
</ol></li>
<li><t><eref target="#level4-prefix-operators">Level4: prefix operators</eref></t>
<ol spacing="compact">
<li><eref target="#object-teleports">Object teleports</eref></li>
<li><eref target="#object-multipliers">Object multipliers</eref></li>
<li><eref target="#de-selectors-and">De/selectors (+ and -)</eref></li>
<li><eref target="#sharing-object-or-file">Sharing object or file (#|)</eref></li>
<li><eref target="#xrf-uri-scheme">xrf:// URI scheme</eref></li>
</ol></li>
<li><eref target="#level5-uri-templates-rfc6570">Level5: URI Templates (RFC6570)</eref></li>
<li><t><eref target="#top-level-url-processing">Top-level URL processing</eref></t>
<ol spacing="compact">
<li><eref target="#ux">UX</eref></li>
</ol></li>
<li><t><eref target="#example-navigating-content-href-portals">Example: Navigating content href portals</eref></t>
<ol spacing="compact">
<li><eref target="#walking-surfaces">Walking surfaces</eref></li>
</ol></li>
<li><eref target="#example-virtual-world-rings">Example: Virtual world rings</eref></li>
<li><eref target="#additional-scene-metadata">Additional scene metadata</eref></li>
<li><t><eref target="#accessibility-interface">Accessibility interface</eref></t>
<ol spacing="compact">
<li><eref target="#two-button-navigation">Two-button navigation</eref></li>
<li><eref target="#overlap-with-fileformat-specific-extensions">Overlap with fileformat-specific extensions</eref></li>
</ol></li>
<li><eref target="#vendor-prefixes">Vendor Prefixes</eref></li>
<li><eref target="#security-considerations">Security Considerations</eref></li>
<li><eref target="#faq">FAQ</eref></li>
<li><eref target="#authors">Authors</eref></li>
<li><eref target="#iana-considerations">IANA Considerations</eref></li>
<li><eref target="#acknowledgments">Acknowledgments</eref></li>
<li><eref target="#appendix-definitions">Appendix: Definitions</eref></li>
</ol>
</section>
<section anchor="introduction"><name>Introduction</name> <section anchor="introduction"><name>Introduction</name>
<t>How can we add more control to existing text and 3D scenes, without introducing new dataformats?<br /> <iref item="Introduction"/><t>How can we add more control to existing text and 3D scenes, without introducing new dataformats?<br />
Historically, there's many attempts to create the ultimate 3D fileformat.<br /> Historically, there's many attempts to create the ultimate 3D fileformat.<br />
@ -50,7 +129,7 @@ XR Fragments exploits the fact that all 3D models already contain such metadata:
</blockquote></section> </blockquote></section>
<section anchor="what-is-xr-fragments"><name>What is XR Fragments</name> <section anchor="what-is-xr-fragments"><name>What is XR Fragments</name>
<t>XR Fragments utilizes URLs:</t> <iref item="What is XR Fragments"/><t>XR Fragments utilizes URLs:</t>
<ol spacing="compact"> <ol spacing="compact">
<li>for 3D viewers/browser to manipulate the camera or objects (via URI fragments)</li> <li>for 3D viewers/browser to manipulate the camera or objects (via URI fragments)</li>
@ -61,6 +140,7 @@ XR Fragments exploits the fact that all 3D models already contain such metadata:
</section> </section>
<section anchor="hfl-hypermediatic-feedback-loop-for-xr-browsers"><name>HFL (Hypermediatic Feedback Loop) for XR Browsers</name> <section anchor="hfl-hypermediatic-feedback-loop-for-xr-browsers"><name>HFL (Hypermediatic Feedback Loop) for XR Browsers</name>
<t><iref item="HFL (Hypermediatic Feedback Loop"/> for XR Browsers)</t>
<t><tt>href</tt> metadata traditionally implies <strong>click</strong> AND <strong>navigate</strong>, however XR Fragments adds stateless <strong>click</strong> (<tt>xrf://....</tt>) via the <tt>xrf://</tt> scheme, which does not change the top-level URL-adress (of the browser). <t><tt>href</tt> metadata traditionally implies <strong>click</strong> AND <strong>navigate</strong>, however XR Fragments adds stateless <strong>click</strong> (<tt>xrf://....</tt>) via the <tt>xrf://</tt> scheme, which does not change the top-level URL-adress (of the browser).
This allows for many extra interactions via URLs, which otherwise needs a scripting language. This allows for many extra interactions via URLs, which otherwise needs a scripting language.
These are called <strong>hashbus</strong>-only events/</t> These are called <strong>hashbus</strong>-only events/</t>
@ -148,10 +228,10 @@ These are called <strong>hashbus</strong>-only events/</t>
</blockquote></section> </blockquote></section>
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name> <section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>
<t>See appendix below in case certain terms are not clear.</t> <iref item="Conventions and Definitions"/><t>See appendix below in case certain terms are not clear.</t>
<section anchor="xr-fragment-url-grammar"><name>XR Fragment URL Grammar</name> <section anchor="xr-fragment-url-grammar"><name>XR Fragment URL Grammar</name>
<t>For typical HTTP-like browsers/applications:</t> <iref item="XR Fragment URL Grammar"/><t>For typical HTTP-like browsers/applications:</t>
<artwork><![CDATA[reserved = gen-delims / sub-delims <artwork><![CDATA[reserved = gen-delims / sub-delims
gen-delims = "#" / "&" gen-delims = "#" / "&"
@ -188,7 +268,7 @@ That way, if the link gets shared, the XR Fragments implementation at <tt>https:
</section> </section>
<section anchor="spatial-referencing-3d"><name>Spatial Referencing 3D</name> <section anchor="spatial-referencing-3d"><name>Spatial Referencing 3D</name>
<t>3D files contain an hierarchy of objects.<br /> <iref item="Spatial Referencing 3D"/><t>3D files contain an hierarchy of objects.<br />
XR Fragments assumes the following objectname-to-URI-Fragment mapping, in order to deeplink 3D objects:</t> XR Fragments assumes the following objectname-to-URI-Fragment mapping, in order to deeplink 3D objects:</t>
@ -222,7 +302,7 @@ For example, to render a portal with a preview-version of the scene, create an 3
</blockquote></section> </blockquote></section>
<section anchor="level0-files"><name>Level0: Files</name> <section anchor="level0-files"><name>Level0: Files</name>
<t>These are <strong>optional</strong> auto-loaded <eref target="">side-car files</eref> to enable hasslefree <eref target="#XR%20Movies">XR Movies</eref>.<br /> <iref item="Level0: Files"/><iref item="Level0: Files"/><t>These are <strong>optional</strong> auto-loaded <eref target="">side-car files</eref> to enable hasslefree <eref target="#XR%20Movies">XR Movies</eref>.<br />
they can accomodate developers or applications who (for whatever reason) must not modify the 3D scene-file (a <tt>.glb</tt> e.g.).</t> they can accomodate developers or applications who (for whatever reason) must not modify the 3D scene-file (a <tt>.glb</tt> e.g.).</t>
@ -319,7 +399,7 @@ The sidecar will define (or <strong>override</strong> already existing) extras,
</section> </section>
<section anchor="level1-uri"><name>Level1: URI</name> <section anchor="level1-uri"><name>Level1: URI</name>
<blockquote><t><strong>XR Fragments allows deeplinking of 3D objects by mapping objectnames to URI fragments</strong></t> <iref item="Level1: URI"/><blockquote><t><strong>XR Fragments allows deeplinking of 3D objects by mapping objectnames to URI fragments</strong></t>
</blockquote><t>XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br /> </blockquote><t>XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br />
Instead of forcing authors to combine 3D/2D objects programmatically (publishing thru a game-editor e.g.), XR Fragments <strong>integrates all</strong> which allows a universal viewing experience.<br /> Instead of forcing authors to combine 3D/2D objects programmatically (publishing thru a game-editor e.g.), XR Fragments <strong>integrates all</strong> which allows a universal viewing experience.<br />
@ -376,8 +456,7 @@ But approaches things from a higherlevel local-first 3D hypermedia browser-persp
]]> ]]>
</artwork> </artwork>
<blockquote><t>?-linked and #-linked navigation are JUST one possible way to implement XR Fragments: the essential goal is to allow a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.</t> <blockquote><t>?-linked and #-linked navigation are JUST one possible way to implement XR Fragments: the essential goal is to allow a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.</t>
</blockquote></section> </blockquote>
<section anchor="list-of-uri-fragments"><name>List of URI Fragments</name> <section anchor="list-of-uri-fragments"><name>List of URI Fragments</name>
<table> <table>
<thead> <thead>
@ -429,9 +508,10 @@ But approaches things from a higherlevel local-first 3D hypermedia browser-persp
</tr> </tr>
</tbody> </tbody>
</table></section> </table></section>
</section>
<section anchor="level2-href-links"><name>Level2: href links</name> <section anchor="level2-href-links"><name>Level2: href links</name>
<t>Explicit href metadata ('extras') in a 3D object (of a 3D file), hint the viewer that the user ''can interact'' with that object :</t> <iref item="Level2: href links"/><t>Explicit href metadata ('extras') in a 3D object (of a 3D file), hint the viewer that the user ''can interact'' with that object :</t>
<t>| fragment | type | example value | <t>| fragment | type | example value |
|<tt>href</tt>| string (uri or predefined view) | <tt>#pyramid</tt><br /> |<tt>href</tt>| string (uri or predefined view) | <tt>#pyramid</tt><br />
<tt>#lastvisit</tt><br /> <tt>#lastvisit</tt><br />
@ -459,7 +539,7 @@ But approaches things from a higherlevel local-first 3D hypermedia browser-persp
</section> </section>
<section anchor="level3-media-fragments"><name>Level3: Media Fragments</name> <section anchor="level3-media-fragments"><name>Level3: Media Fragments</name>
<blockquote><t>these allow for XR Movies with a controllable timeline using <tt>href</tt> URI's with Media Fragments</t> <iref item="Level3: Media Fragments"/><blockquote><t>these allow for XR Movies with a controllable timeline using <tt>href</tt> URI's with Media Fragments</t>
</blockquote><t>Just like with 2D media-files, W3C mediafragments (<tt>#t=1,2</tt>) can be used to control a timeline via the <eref target="##t">#t</eref> primitive. </blockquote><t>Just like with 2D media-files, W3C mediafragments (<tt>#t=1,2</tt>) can be used to control a timeline via the <eref target="##t">#t</eref> primitive.
XR Fragments Level3 makes the 3D timeline, as well as URL-referenced files <strong>controllable</strong> via Media Fragments like:</t> XR Fragments Level3 makes the 3D timeline, as well as URL-referenced files <strong>controllable</strong> via Media Fragments like:</t>
@ -514,7 +594,7 @@ XR Fragments Level3 makes the 3D timeline, as well as URL-referenced files <stro
</section> </section>
<section anchor="level4-prefix-operators"><name>Level4: prefix operators</name> <section anchor="level4-prefix-operators"><name>Level4: prefix operators</name>
<t>Prefixing objectnames with the following simple operators allow for <strong>extremely powerful</strong> XR interactions:</t> <iref item="Level4: prefix operators"/><t>Prefixing objectnames with the following simple operators allow for <strong>extremely powerful</strong> XR interactions:</t>
<ul spacing="compact"> <ul spacing="compact">
<li>#!</li> <li>#!</li>
@ -637,8 +717,15 @@ Clicking the href-value below will:</t>
</blockquote></section> </blockquote></section>
</section> </section>
<section anchor="level5-uri-templates-rfc6570"><name>Level5: URI Templates (RFC6570)</name>
<t><iref item="Level5: URI Templates (RFC6570"/>)</t>
<t>XR Fragments adopts Level1 URI <strong>Fragment</strong> expansion to provide safe interactivity.<br />
This is non-normative, and the draft spec is available on request.</t>
</section>
<section anchor="top-level-url-processing"><name>Top-level URL processing</name> <section anchor="top-level-url-processing"><name>Top-level URL processing</name>
<blockquote><t>Example URL: <tt>://foo/world.gltf#room1&amp;t=10&amp;cam</tt></t> <iref item="Top-level URL processing"/><blockquote><t>Example URL: <tt>://foo/world.gltf#room1&amp;t=10&amp;cam</tt></t>
</blockquote><t>The URL-processing-flow for hypermedia browsers goes like this:</t> </blockquote><t>The URL-processing-flow for hypermedia browsers goes like this:</t>
<ol spacing="compact"> <ol spacing="compact">
@ -659,7 +746,7 @@ Clicking the href-value below will:</t>
</section> </section>
<section anchor="example-navigating-content-href-portals"><name>Example: Navigating content href portals</name> <section anchor="example-navigating-content-href-portals"><name>Example: Navigating content href portals</name>
<t>navigation, portals &amp; mutations</t> <iref item="Example: Navigating content href portals"/><t>navigation, portals &amp; mutations</t>
<table> <table>
<thead> <thead>
<tr> <tr>
@ -718,8 +805,8 @@ Clicking the href-value below will:</t>
</blockquote></section> </blockquote></section>
</section> </section>
<section anchor="virtual-world-rings"><name>Virtual world rings</name> <section anchor="example-virtual-world-rings"><name>Example: Virtual world rings</name>
<t>Consider 3D scenes linking to eachother using these <tt>href</tt> values, attached to 3D button-objects:</t> <iref item="Example: Virtual world rings"/><t>Consider 3D scenes linking to eachother using these <tt>href</tt> values, attached to 3D button-objects:</t>
<ul spacing="compact"> <ul spacing="compact">
<li><tt>href: schoolA.edu/projects.gltf#math</tt></li> <li><tt>href: schoolA.edu/projects.gltf#math</tt></li>
@ -736,14 +823,8 @@ Now consider adding a 'webring index'-button to each file, with this href-value:
<t>This would allow displaying the (remote 3D file) webring menu with various href-buttons inside, all centrally curated by the workgroup.</t> <t>This would allow displaying the (remote 3D file) webring menu with various href-buttons inside, all centrally curated by the workgroup.</t>
</section> </section>
<section anchor="level5-uri-templates-rfc6570"><name>Level5: URI Templates (RFC6570)</name>
<t>XR Fragments adopts Level1 URI <strong>Fragment</strong> expansion to provide safe interactivity.<br />
This is non-normative, and the draft spec is available on request.</t>
</section>
<section anchor="additional-scene-metadata"><name>Additional scene metadata</name> <section anchor="additional-scene-metadata"><name>Additional scene metadata</name>
<t>XR Fragments does not aim to redefine the metadata-space or accessibility-space by introducing its own cataloging-metadata fields. <iref item="Additional scene metadata"/><t>XR Fragments does not aim to redefine the metadata-space or accessibility-space by introducing its own cataloging-metadata fields.
Instead, it encourages browsers to scan nodes for the following custom properties:</t> Instead, it encourages browsers to scan nodes for the following custom properties:</t>
<ul spacing="compact"> <ul spacing="compact">
@ -823,7 +904,7 @@ Instead, it encourages browsers to scan nodes for the following custom propertie
</blockquote></section> </blockquote></section>
<section anchor="accessibility-interface"><name>Accessibility interface</name> <section anchor="accessibility-interface"><name>Accessibility interface</name>
<t>The addressibility of XR Fragments allows for unique 3D-to-text transcripts, as well as an textual interface to navigate 3D content.<br /> <iref item="Accessibility interface"/><t>The addressibility of XR Fragments allows for unique 3D-to-text transcripts, as well as an textual interface to navigate 3D content.<br />
Spec:<br /> Spec:<br />
&lt;Br&gt;</t> &lt;Br&gt;</t>
@ -877,9 +958,10 @@ If a glTF implementation does not support a particular extension, the (XRF) extr
<blockquote><t><strong>Example 1</strong> In case of the OMI_LINK glTF extension (<tt>href: https://nlnet.nl</tt>) and an XR Fragment (<tt>href: #otherroom</tt> or <tt>href: otherplanet.glb</tt>), it is clear that <tt>https://nlnet.nl</tt> should open in a browsertab, whereas the XR Fragment links should teleport the user. If the OMI_LINK contains an XR Fragment (<tt>#room1</tt> e.g.) a teleport should be performed only (and other [overlapping] metadata should be ignored).</t> <blockquote><t><strong>Example 1</strong> In case of the OMI_LINK glTF extension (<tt>href: https://nlnet.nl</tt>) and an XR Fragment (<tt>href: #otherroom</tt> or <tt>href: otherplanet.glb</tt>), it is clear that <tt>https://nlnet.nl</tt> should open in a browsertab, whereas the XR Fragment links should teleport the user. If the OMI_LINK contains an XR Fragment (<tt>#room1</tt> e.g.) a teleport should be performed only (and other [overlapping] metadata should be ignored).</t>
<t><strong>Example 2</strong> If an Extensions uses XR Fragments in URI's (<tt>href: #otherroom</tt> or <tt>href: xrf://-walls</tt> in OMI_LINK e.g.), then perform them according to XR Fragment spec (teleport user). But only once: ignore further overlapping metadata for that usecase.</t> <t><strong>Example 2</strong> If an Extensions uses XR Fragments in URI's (<tt>href: #otherroom</tt> or <tt>href: xrf://-walls</tt> in OMI_LINK e.g.), then perform them according to XR Fragment spec (teleport user). But only once: ignore further overlapping metadata for that usecase.</t>
</blockquote></section> </blockquote></section>
</section>
<section anchor="vendor-prefixes"><name>Vendor Prefixes</name> <section anchor="vendor-prefixes"><name>Vendor Prefixes</name>
<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.). <iref item="Vendor Prefixes"/><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> This allows popular 3D engines/frameworks, to initialize specific features when loading a scene/object, in a progressive enhanced way.</t>
<t>Vendor Prefixes allows embedding 3D engines/framework-specific features a 3D file via metadata:</t> <t>Vendor Prefixes allows embedding 3D engines/framework-specific features a 3D file via metadata:</t>
<table> <table>
@ -953,10 +1035,9 @@ The lowest common denominator between 3D engines is the 'entity'-part of their e
<t>String-templatevalues are evaluated as per <eref target="https://www.rfc-editor.org/rfc/rfc6570">URI Templates (RFC6570)</eref> Level 1.</t> <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><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> </blockquote></section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name> <section anchor="security-considerations"><name>Security Considerations</name>
<t>The only dynamic parts are <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>.<br /> <iref item="Security Considerations"/><t>The only dynamic parts are <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>.<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 />
@ -964,7 +1045,7 @@ n fact, it is much safer than relying on a scripting language (javascript) which
</section> </section>
<section anchor="faq"><name>FAQ</name> <section anchor="faq"><name>FAQ</name>
<t><strong>Q:</strong> Why is everything HTTP GET-based, what about POST/PUT/DELETE HATEOS<br /> <iref item="FAQ"/><t><strong>Q:</strong> Why is everything HTTP GET-based, what about POST/PUT/DELETE HATEOS<br />
<strong>A:</strong> Because it's out of scope: XR Fragment specifies a read-only way to surf XR documents. These things belong in the application layer (for example, an XR Hypermedia browser can decide to support POST/PUT/DELETE requests for embedded HTML thru <tt>src</tt> values)</t> <strong>A:</strong> Because it's out of scope: XR Fragment specifies a read-only way to surf XR documents. These things belong in the application layer (for example, an XR Hypermedia browser can decide to support POST/PUT/DELETE requests for embedded HTML thru <tt>src</tt> values)</t>
<t><strong>Q:</strong> Why isn't there support for scripting, URI Template Fragments are so limited compared to WASM &amp; javascript <t><strong>Q:</strong> Why isn't there support for scripting, URI Template Fragments are so limited compared to WASM &amp; javascript
@ -981,7 +1062,7 @@ Non-HTML Hypermedia browsers should make browser extensions the right place, to
</section> </section>
<section anchor="authors"><name>authors</name> <section anchor="authors"><name>authors</name>
<iref item="authors"/>
<ul spacing="compact"> <ul spacing="compact">
<li>Leon van Kammen (@lvk@mastodon.online)</li> <li>Leon van Kammen (@lvk@mastodon.online)</li>
<li>Jens Finkhäuser (@jens@social.finkhaeuser.de)</li> <li>Jens Finkhäuser (@jens@social.finkhaeuser.de)</li>
@ -989,11 +1070,11 @@ Non-HTML Hypermedia browsers should make browser extensions the right place, to
</section> </section>
<section anchor="iana-considerations"><name>IANA Considerations</name> <section anchor="iana-considerations"><name>IANA Considerations</name>
<t>This document has no IANA actions.</t> <iref item="IANA Considerations"/><t>This document has no IANA actions.</t>
</section> </section>
<section anchor="acknowledgments"><name>Acknowledgments</name> <section anchor="acknowledgments"><name>Acknowledgments</name>
<iref item="Acknowledgments"/>
<ul spacing="compact"> <ul spacing="compact">
<li><eref target="https://nlnet.nl">NLNET</eref></li> <li><eref target="https://nlnet.nl">NLNET</eref></li>
<li><eref target="https://futureoftext.org">Future of Text</eref></li> <li><eref target="https://futureoftext.org">Future of Text</eref></li>
@ -1011,7 +1092,7 @@ Non-HTML Hypermedia browsers should make browser extensions the right place, to
</section> </section>
<section anchor="appendix-definitions"><name>Appendix: Definitions</name> <section anchor="appendix-definitions"><name>Appendix: Definitions</name>
<table> <iref item="Appendix: Definitions"/><table>
<thead> <thead>
<tr> <tr>
<th>definition</th> <th>definition</th>

View file

@ -20,4 +20,6 @@
]; ];
}; };
# to create [markdown] table of contents use LLM with this input: awk '/id="/ { print $0 }' RFC_XR_Fragments.html | grep -v idx
} }