🔧 main: work in progress [might break]
This commit is contained in:
parent
a9c37b348f
commit
65820a2c02
3 changed files with 487 additions and 42 deletions
|
|
@ -110,6 +110,7 @@ XR Fragments allows us to better use implicit metadata inside 3D scene(files), b
|
|||
<li><a href="#level0-files">Level0: Files</a>
|
||||
|
||||
<ol>
|
||||
<li><a href="#timelines">timelines</a></li>
|
||||
<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>
|
||||
|
|
@ -162,6 +163,7 @@ XR Fragments allows us to better use implicit metadata inside 3D scene(files), b
|
|||
<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="#XRF-microformat">XRF microformat</a></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>
|
||||
|
|
@ -427,6 +429,16 @@ For example, to render a portal with a preview-version of the scene, create an 3
|
|||
<p>There 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>
|
||||
|
||||
<h2 id="timelines">Timelines</h2>
|
||||
|
||||
<p>when a loaded file contains a timeline (animations/subtitles e.g.), then:</p>
|
||||
|
||||
<blockquote>
|
||||
<p>All timelines must play (looped) by default (to enable [[XR Movies]])</p>
|
||||
</blockquote>
|
||||
|
||||
<p>Unless an object has multiple animations (actions e.g.), then just play the first or with name <code>default</code>.</p>
|
||||
|
||||
<h2 id="via-href-metadata">via href metadata</h2>
|
||||
|
||||
<pre><code>scene.glb <--- 'href' extra [heuristic] detected inside!
|
||||
|
|
@ -655,8 +667,23 @@ Instead of forcing authors to combine 3D/2D objects programmatically (publishing
|
|||
|
||||
<p>Explicit href metadata (‘extras’) in a 3D object (of a 3D file), hint the viewer that the user “can interact” with that object :</p>
|
||||
|
||||
<p>| fragment | type | example value |
|
||||
|<code>href</code>| string (uri or predefined view) | <code>#pyramid</code><br><code>#lastvisit</code><br><code>xrf://#-someobject</code><br><code>://somefile.gltf#foo</code><br> |</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>fragment</th>
|
||||
<th>type</th>
|
||||
<th>example value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>href</code></td>
|
||||
<td>string (uri or predefined view)</td>
|
||||
<td><code>#pyramid</code>, <code>#lastvisit</code>, <code>xrf://#-someobject</code>, <code>://somefile.gltf#foo</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2 id="interaction-behaviour">Interaction behaviour</h2>
|
||||
|
||||
|
|
@ -666,20 +693,82 @@ Instead of forcing authors to combine 3D/2D objects programmatically (publishing
|
|||
|
||||
<h2 id="xr-viewer-implementation">XR Viewer implementation</h2>
|
||||
|
||||
<p>| <strong>spec</strong> | <strong>action</strong> | <strong>feature</strong> |
|
||||
|-|-|-|
|
||||
| level0+1 | hover 3D file <a href="#via-href-metadata">href</a> | show the preview PNG thumbnail (if any). |
|
||||
| level0+1 | launch 3D file <a href="#via-href-metadata">href</a> | replace the current scene with a new 3D file (<code>href: other.glb</code> e.g.) |
|
||||
| level2 | click internal 3D file <a href="#via-href-metadata">href</a> (<code>#roomB</code> e.g.) | teleport the camera to the origin of object(name <code>roomB</code>). See [[teleport camera]].|
|
||||
| level2 | click external 3D file <a href="#via-href-metadata">href</a> (<code>foo.glb</code> e.g.) | replace the current scene with a new 3D file (<code>href: other.glb</code> e.g.) |
|
||||
| level2 | hover external 3D file <a href="#via-href-metadata">href</a> | show the preview PNG thumbnail (if any sidecar, see level0) |
|
||||
| level2 | click <a href="#via-href-metadata">href</a> | hashbus: execute without changing the toplevel URL location (<code>href: xrf://#someObjectName</code> e.g.) |
|
||||
| level3 | click <a href="#via-href-metadata">href</a> | set the global 3D animation timeline to its Media Fragment value (<code>#t=2,3</code> e.g.) |</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><strong>spec</strong></th>
|
||||
<th><strong>action</strong></th>
|
||||
<th><strong>feature</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>level0+1</td>
|
||||
<td>hover 3D file <a href="#via-href-metadata">href</a></td>
|
||||
<td>show the preview PNG thumbnail (if any).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level0+1</td>
|
||||
<td>launch 3D file <a href="#via-href-metadata">href</a></td>
|
||||
<td>replace the current scene with a new 3D file (<code>href: other.glb</code> e.g.)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level2</td>
|
||||
<td>click internal 3D file <a href="#via-href-metadata">href</a> (<code>#roomB</code> e.g.)</td>
|
||||
<td>teleport the camera to the origin of object(name <code>roomB</code>). See [[teleport camera]].</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level2</td>
|
||||
<td>click external 3D file <a href="#via-href-metadata">href</a> (<code>foo.glb</code> e.g.)</td>
|
||||
<td>replace the current scene with a new 3D file (<code>href: other.glb</code> e.g.)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level2</td>
|
||||
<td>hover external 3D file <a href="#via-href-metadata">href</a></td>
|
||||
<td>show the preview PNG thumbnail (if any sidecar, see level0)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level2</td>
|
||||
<td>activate animation</td>
|
||||
<td>clicking href-value <code>#foo</code> will select animation <code>foo</code> (if exist)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level2</td>
|
||||
<td>click <a href="#via-href-metadata">href</a></td>
|
||||
<td>hashbus: execute without changing the toplevel URL location (<code>href: xrf://#someObjectName</code> e.g.)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level3</td>
|
||||
<td>click <a href="#via-href-metadata">href</a></td>
|
||||
<td>set the global 3D animation timeline to its Media Fragment value (<code>#t=2,3</code> e.g.)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<blockquote>
|
||||
<p>NOTE: hashbus links (<code>xrf://#foo&bar</code>) don’t change the toplevel URL, which makes it ideal for interactions (in contrast to typical <code>#roomC</code> navigation, which benefit back/forward browser-buttons), see <a href="#hashbus">hashbus</a> for more info.</p>
|
||||
|
||||
<p><strong>default camera (spawn) location</strong>: When a 3D file is loaded, it will position the user/camera at xyz: 0,0,0 OR to the location of (an object called) “spawn”.</p>
|
||||
</blockquote>
|
||||
|
||||
<p>Basically:</p>
|
||||
|
||||
<pre><code>https://my.org/foo.glb
|
||||
</code></pre>
|
||||
|
||||
<p>will load as default:</p>
|
||||
|
||||
<pre><code>https://my.org/foo.glb#spawn
|
||||
</code></pre>
|
||||
|
||||
<h1 id="level3-media-fragments">Level3: Media Fragments</h1>
|
||||
|
||||
<p><span class="index" id="idxref:10"></span></p>
|
||||
|
|
@ -705,12 +794,44 @@ XR Fragments Level3 makes the 3D timeline, as well as URL-referenced files <stro
|
|||
|
||||
<p>controls the animation(s) of the scene (or <code>src</code> resource which contains a timeline)</p>
|
||||
|
||||
<p>| fragment | type | functionality |
|
||||
| <b>#t</b>=start,stop | <a href="default:`#t=0`">[vector2]</a> | start,stop (in seconds |</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>fragment</th>
|
||||
<th>type</th>
|
||||
<th>functionality</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<p>| Example Value | Explanation |
|
||||
| <code>#t=1</code> | play (3D) animations from 1 seconds till end (and stop) |
|
||||
| <code>#t=1,100</code> | play (3D) animations from 1 till 100 seconds (and stop) |</p>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><b>#t</b>=start,stop</td>
|
||||
<td><a href="default:`#t=0`">[vector2]</a></td>
|
||||
<td>start,stop (in seconds</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Example Value</th>
|
||||
<th>Explanation</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>#t=1</code></td>
|
||||
<td>play (3D) animations from 1 seconds till end (and stop)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>#t=1,100</code></td>
|
||||
<td>play (3D) animations from 1 till 100 seconds (and stop)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2 id="specify-playback-loopmode">Specify playback loopmode</h2>
|
||||
|
||||
|
|
@ -1165,6 +1286,115 @@ Therefore a 2-button navigation-interface is the bare minimum interface:</p>
|
|||
<li>the TTS reads the href-value (and/or aria-description if available)</li>
|
||||
</ol>
|
||||
|
||||
<h2 id="xrf-microformat">XRF microformat</h2>
|
||||
|
||||
<p>How can applications discover 3D experiences on a network?</p>
|
||||
|
||||
<blockquote>
|
||||
<p>Answer: <strong>spatial microformats</strong></p>
|
||||
</blockquote>
|
||||
|
||||
<p>The XRF microformat is an <a href="#Progressive%20enhancement">optional</a> text heuristics which applications can detect across various usecases.</p>
|
||||
|
||||
<h4 id="via-html-webpage">via HTML webpage</h4>
|
||||
|
||||
<p>If the browser/application requests an webpage (<code>https://nlnet.nl</code> e.g.) it should check for the <a href="https://gmpg.org/xfn/">rel-me microformat</a> :</p>
|
||||
|
||||
<pre><code><link rel="alternate" as="spatial-entrypoint" href="scene.xrf.glb">
|
||||
</code></pre>
|
||||
|
||||
<p>This way the application loads <code>https://nlnet.nl/scene.xrf.glb</code> when the user types <code>nlnet.nl</code> into the URLbar.<br>
|
||||
Optionally, <code>type</code> can be specified for dynamically generated 3D files:</p>
|
||||
|
||||
<pre><code><link rel="alternate" as="spatial-entrypoint" href="https://worlds.org/scene.php#platformB" type="model/gltf+binary" />
|
||||
</code></pre>
|
||||
|
||||
<p>The <code>type</code>-attribute is for fallback-purposes.<br>
|
||||
Viewer-supported 3D file-extensions (<code>.glb</code> e.g.) will <strong>ALWAYS</strong> take precedence over the (non)presence of the <code>type</code> attribute.<br>
|
||||
The reason is that platforms (Mastodon ‘labels’ e.g.) don’t allow specifying type-attributes.<br>
|
||||
Another reason is that XR Fragments is filetype-agnostic, so flexibility is expected on the viewer-side.</p>
|
||||
|
||||
<blockquote>
|
||||
<p>NOTE: in case of multiple 3D files mentioned in <code><link rel="me"</code>, only the first (supported 3D filetype) will be chosen.</p>
|
||||
</blockquote>
|
||||
|
||||
<p>Example of multiple spatial microformats:</p>
|
||||
|
||||
<pre><code><link rel="alternate" as="spatial-entrypoint" href="scene.xrf.glb"/>
|
||||
<link rel="me" href="myavatar.vrm"/>
|
||||
<!-- JanusXR microformat https://github.com/jbaicoianu/janusweb
|
||||
<FireBoxRoom>
|
||||
<Assets>
|
||||
<assetobject id="experience" src="scene.xrf.glb"/>
|
||||
</Assets>
|
||||
<Room>
|
||||
<object pos="0 0 0" collision_id="experience" id="experience" />
|
||||
</Room>
|
||||
</FireBoxRoom>
|
||||
-->
|
||||
</code></pre>
|
||||
|
||||
<h4 id="via-webfinger">via WebFinger</h4>
|
||||
|
||||
<p>When John has an account on foo.com, how can other applications request his 3D homepage by simply entering <code>john@foo.com</code>?</p>
|
||||
|
||||
<blockquote>
|
||||
<p>Answer: it can be requested at <code>https://foo.com/.well-known/webfinger?resource=acct:john@foo.com</code>, resulting in:</p>
|
||||
</blockquote>
|
||||
|
||||
<pre><code>{
|
||||
"subject": "acct:john@foo.com",
|
||||
"aliases": [
|
||||
"https://mastodon.example/social/john",
|
||||
"https://john.foo.com",
|
||||
"https://3d.john.foo.com/model/scene.glb"
|
||||
],
|
||||
"properties": {
|
||||
"http://schema.org/name": "John Doe",
|
||||
"http://schema.org/description": "Developer, 3D Enthusiast, and Social Explorer"
|
||||
},
|
||||
"links": [
|
||||
{
|
||||
"rel": "http://ostatus.org/schema/1.0/subscribe",
|
||||
"template": "https://mastodon.example/social/john/{uri}"
|
||||
},
|
||||
{
|
||||
"rel": "self",
|
||||
"type": "text/html",
|
||||
"href": "https://john.foo.com"
|
||||
},
|
||||
{
|
||||
"rel": "me",
|
||||
"type": "text/html",
|
||||
"href": "https://john.foo.com"
|
||||
},
|
||||
{
|
||||
"rel": "me",
|
||||
"type": "model/gltf+binary",
|
||||
"href": "https://3d.john.foo.com/model/avatar.vrm"
|
||||
},
|
||||
{
|
||||
"rel": "scene",
|
||||
"type": "model/gltf+binary",
|
||||
"href": "https://3d.john.foo.com/model/scene.xrf.glb"
|
||||
}
|
||||
]
|
||||
}
|
||||
</code></pre>
|
||||
|
||||
<p>This way the application will load <code>https://3d.john.foo.com/model/scene.glb</code> when the user types <code>john@foo.com</code> into the user field.</p>
|
||||
|
||||
<h4 id="via-text-uri">via Text (URI)</h4>
|
||||
|
||||
<p>Another way for an application to trigger loading a 3D scene is by detecting URI’s of 3D scene-files any text:</p>
|
||||
|
||||
<ul>
|
||||
<li><code>foo.glb</code> (or any other popular 3D extension)</li>
|
||||
<li><code>https://foo.com/scene.glb</code> (or any other popular protocol)</li>
|
||||
</ul>
|
||||
|
||||
<p>This way, the application can highlight the link whenever it detects the URI (in a text-file or text-section of a 3D model)</p>
|
||||
|
||||
<h2 id="overlap-with-fileformat-specific-extensions">Overlap with fileformat-specific extensions</h2>
|
||||
|
||||
<p>Some 3D scene-fileformats have support for extensions.
|
||||
|
|
|
|||
|
|
@ -492,7 +492,8 @@ These are the possible 'extras' for 3D nodes and sidecar-files
|
|||
Explicit href metadata ('extras') in a 3D object (of a 3D file), hint the viewer that the user ''can interact'' with that object :
|
||||
|
||||
| fragment | type | example value |
|
||||
|`href`| string (uri or predefined view) | `#pyramid`<br>`#lastvisit`<br>`xrf://#-someobject`<br>`://somefile.gltf#foo`<br> |
|
||||
|----------|------|----------------|
|
||||
| `href` | string (uri or predefined view) | `#pyramid`, `#lastvisit`, `xrf://#-someobject`, `://somefile.gltf#foo` |
|
||||
|
||||
## Interaction behaviour
|
||||
|
||||
|
|
@ -503,12 +504,13 @@ The imported/teleported destination can be another object in the same scene-file
|
|||
## XR Viewer implementation
|
||||
|
||||
| **spec** | **action** | **feature** |
|
||||
|-|-|-|
|
||||
|----------|------------|-------------|
|
||||
| level0+1 | hover 3D file [href](#via-href-metadata) | show the preview PNG thumbnail (if any). |
|
||||
| level0+1 | launch 3D file [href](#via-href-metadata) | replace the current scene with a new 3D file (`href: other.glb` e.g.) |
|
||||
| level2 | click internal 3D file [href](#via-href-metadata) (`#roomB` e.g.) | teleport the camera to the origin of object(name `roomB`). See [[teleport camera]].|
|
||||
| level2 | click internal 3D file [href](#via-href-metadata) (`#roomB` e.g.) | teleport the camera to the origin of object(name `roomB`). See [[teleport camera]].|
|
||||
| level2 | click external 3D file [href](#via-href-metadata) (`foo.glb` e.g.) | replace the current scene with a new 3D file (`href: other.glb` e.g.) |
|
||||
| level2 | hover external 3D file [href](#via-href-metadata) | show the preview PNG thumbnail (if any sidecar, see level0) |
|
||||
| level2 | activate animation | clicking href-value `#foo` will select animation `foo` (if exist) |
|
||||
| level2 | click [href](#via-href-metadata) | hashbus: execute without changing the toplevel URL location (`href: xrf://#someObjectName` e.g.) |
|
||||
| level3 | click [href](#via-href-metadata) | set the global 3D animation timeline to its Media Fragment value (`#t=2,3` e.g.) |
|
||||
|
||||
|
|
@ -546,10 +548,12 @@ XR Fragments Level3 makes the 3D timeline, as well as URL-referenced files **con
|
|||
controls the animation(s) of the scene (or `src` resource which contains a timeline)
|
||||
|
||||
| fragment | type | functionality |
|
||||
|----------|------|---------------|
|
||||
| <b>#t</b>=start,stop | [[vector2]] (default:`#t=0`) | start,stop (in seconds |
|
||||
|
||||
|
||||
| Example Value | Explanation |
|
||||
|-------------------|-------------|
|
||||
| `#t=1` | play (3D) animations from 1 seconds till end (and stop) |
|
||||
| `#t=1,100` | play (3D) animations from 1 till 100 seconds (and stop) |
|
||||
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ XR Fragments allows us to better use implicit metadata inside 3D scene(files), b
|
|||
<li><t><eref target="#level0-files">Level0: Files</eref></t>
|
||||
|
||||
<ol spacing="compact">
|
||||
<li><eref target="#timelines">timelines</eref></li>
|
||||
<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>
|
||||
|
|
@ -93,6 +94,7 @@ XR Fragments allows us to better use implicit metadata inside 3D scene(files), b
|
|||
<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="#XRF-microformat">XRF microformat</eref></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>
|
||||
|
|
@ -318,6 +320,12 @@ For example, to render a portal with a preview-version of the scene, create an 3
|
|||
|
||||
they can accomodate developers or applications who (for whatever reason) must not modify the 3D scene-file (a <tt>.glb</tt> e.g.).</t>
|
||||
|
||||
<section anchor="timelines"><name>Timelines</name>
|
||||
<t>when a loaded file contains a timeline (animations/subtitles e.g.), then:</t>
|
||||
<blockquote><t>All timelines must play (looped) by default (to enable [[XR Movies]])</t>
|
||||
</blockquote><t>Unless an object has multiple animations (actions e.g.), then just play the first or with name <tt>default</tt>.</t>
|
||||
</section>
|
||||
|
||||
<section anchor="via-href-metadata"><name>via href metadata</name>
|
||||
|
||||
<artwork><![CDATA[scene.glb <--- 'href' extra [heuristic] detected inside!
|
||||
|
|
@ -523,30 +531,100 @@ But approaches things from a higherlevel local-first 3D hypermedia browser-persp
|
|||
|
||||
<section anchor="level2-href-links"><name>Level2: href links</name>
|
||||
<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 |
|
||||
|<tt>href</tt>| string (uri or predefined view) | <tt>#pyramid</tt><br />
|
||||
<tt>#lastvisit</tt><br />
|
||||
<tt>xrf://#-someobject</tt><br />
|
||||
<tt>://somefile.gltf#foo</tt><br />
|
||||
|</t>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>fragment</th>
|
||||
<th>type</th>
|
||||
<th>example value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><tt>href</tt></td>
|
||||
<td>string (uri or predefined view)</td>
|
||||
<td><tt>#pyramid</tt>, <tt>#lastvisit</tt>, <tt>xrf://#-someobject</tt>, <tt>://somefile.gltf#foo</tt></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<section anchor="interaction-behaviour"><name>Interaction behaviour</name>
|
||||
<t>When clicking an ''href''-value, the user(camera) is teleport to the referenced object.</t>
|
||||
<t>The imported/teleported destination can be another object in the same scene-file, or a different file.</t>
|
||||
</section>
|
||||
|
||||
<section anchor="xr-viewer-implementation"><name>XR Viewer implementation</name>
|
||||
<t>| <strong>spec</strong> | <strong>action</strong> | <strong>feature</strong> |
|
||||
|-|-|-|
|
||||
| level0+1 | hover 3D file <eref target="#via-href-metadata">href</eref> | show the preview PNG thumbnail (if any). |
|
||||
| level0+1 | launch 3D file <eref target="#via-href-metadata">href</eref> | replace the current scene with a new 3D file (<tt>href: other.glb</tt> e.g.) |
|
||||
| level2 | click internal 3D file <eref target="#via-href-metadata">href</eref> (<tt>#roomB</tt> e.g.) | teleport the camera to the origin of object(name <tt>roomB</tt>). See [[teleport camera]].|
|
||||
| level2 | click external 3D file <eref target="#via-href-metadata">href</eref> (<tt>foo.glb</tt> e.g.) | replace the current scene with a new 3D file (<tt>href: other.glb</tt> e.g.) |
|
||||
| level2 | hover external 3D file <eref target="#via-href-metadata">href</eref> | show the preview PNG thumbnail (if any sidecar, see level0) |
|
||||
| level2 | click <eref target="#via-href-metadata">href</eref> | hashbus: execute without changing the toplevel URL location (<tt>href: xrf://#someObjectName</tt> e.g.) |
|
||||
| level3 | click <eref target="#via-href-metadata">href</eref> | set the global 3D animation timeline to its Media Fragment value (<tt>#t=2,3</tt> e.g.) |</t>
|
||||
<blockquote><t>NOTE: hashbus links (<tt>xrf://#foo&bar</tt>) don't change the toplevel URL, which makes it ideal for interactions (in contrast to typical <tt>#roomC</tt> navigation, which benefit back/forward browser-buttons), see <a href="#hashbus">hashbus</a> for more info.</t>
|
||||
</blockquote></section>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><strong>spec</strong></th>
|
||||
<th><strong>action</strong></th>
|
||||
<th><strong>feature</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>level0+1</td>
|
||||
<td>hover 3D file <eref target="#via-href-metadata">href</eref></td>
|
||||
<td>show the preview PNG thumbnail (if any).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level0+1</td>
|
||||
<td>launch 3D file <eref target="#via-href-metadata">href</eref></td>
|
||||
<td>replace the current scene with a new 3D file (<tt>href: other.glb</tt> e.g.)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level2</td>
|
||||
<td>click internal 3D file <eref target="#via-href-metadata">href</eref> (<tt>#roomB</tt> e.g.)</td>
|
||||
<td>teleport the camera to the origin of object(name <tt>roomB</tt>). See [[teleport camera]].</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level2</td>
|
||||
<td>click external 3D file <eref target="#via-href-metadata">href</eref> (<tt>foo.glb</tt> e.g.)</td>
|
||||
<td>replace the current scene with a new 3D file (<tt>href: other.glb</tt> e.g.)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level2</td>
|
||||
<td>hover external 3D file <eref target="#via-href-metadata">href</eref></td>
|
||||
<td>show the preview PNG thumbnail (if any sidecar, see level0)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level2</td>
|
||||
<td>activate animation</td>
|
||||
<td>clicking href-value <tt>#foo</tt> will select animation <tt>foo</tt> (if exist)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level2</td>
|
||||
<td>click <eref target="#via-href-metadata">href</eref></td>
|
||||
<td>hashbus: execute without changing the toplevel URL location (<tt>href: xrf://#someObjectName</tt> e.g.)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>level3</td>
|
||||
<td>click <eref target="#via-href-metadata">href</eref></td>
|
||||
<td>set the global 3D animation timeline to its Media Fragment value (<tt>#t=2,3</tt> e.g.)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table><blockquote><t>NOTE: hashbus links (<tt>xrf://#foo&bar</tt>) don't change the toplevel URL, which makes it ideal for interactions (in contrast to typical <tt>#roomC</tt> navigation, which benefit back/forward browser-buttons), see <a href="#hashbus">hashbus</a> for more info.</t>
|
||||
<t><strong>default camera (spawn) location</strong>: When a 3D file is loaded, it will position the user/camera at xyz: 0,0,0 OR to the location of (an object called) ''spawn''.</t>
|
||||
</blockquote><t>Basically:</t>
|
||||
|
||||
<artwork><![CDATA[https://my.org/foo.glb
|
||||
]]>
|
||||
</artwork>
|
||||
<t>will load as default:</t>
|
||||
|
||||
<artwork><![CDATA[https://my.org/foo.glb#spawn
|
||||
]]>
|
||||
</artwork>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section anchor="level3-media-fragments"><name>Level3: Media Fragments</name>
|
||||
|
|
@ -566,12 +644,42 @@ XR Fragments Level3 makes the 3D timeline, as well as URL-referenced files <stro
|
|||
|
||||
<section anchor="animation-s-timeline"><name>Animation(s) timeline</name>
|
||||
<t>controls the animation(s) of the scene (or <tt>src</tt> resource which contains a timeline)</t>
|
||||
<t>| fragment | type | functionality |
|
||||
| <b>#t</b>=start,stop | <eref target="default:`#t=0`">[vector2]</eref> | start,stop (in seconds |</t>
|
||||
<t>| Example Value | Explanation |
|
||||
| <tt>#t=1</tt> | play (3D) animations from 1 seconds till end (and stop) |
|
||||
| <tt>#t=1,100</tt> | play (3D) animations from 1 till 100 seconds (and stop) |</t>
|
||||
</section>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>fragment</th>
|
||||
<th>type</th>
|
||||
<th>functionality</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><b>#t</b>=start,stop</td>
|
||||
<td><eref target="default:`#t=0`">[vector2]</eref></td>
|
||||
<td>start,stop (in seconds</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table><table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Example Value</th>
|
||||
<th>Explanation</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><tt>#t=1</tt></td>
|
||||
<td>play (3D) animations from 1 seconds till end (and stop)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>#t=1,100</tt></td>
|
||||
<td>play (3D) animations from 1 till 100 seconds (and stop)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table></section>
|
||||
|
||||
<section anchor="specify-playback-loopmode"><name>Specify playback loopmode</name>
|
||||
<t>This compensates a missing element from Media Fragments to enable/disable temporal looping. .</t>
|
||||
|
|
@ -952,6 +1060,109 @@ Therefore a 2-button navigation-interface is the bare minimum interface:</t>
|
|||
</ol>
|
||||
</section>
|
||||
|
||||
<section anchor="xrf-microformat"><name>XRF microformat</name>
|
||||
<t>How can applications discover 3D experiences on a network?</t>
|
||||
<blockquote><t>Answer: <strong>spatial microformats</strong></t>
|
||||
</blockquote><t>The XRF microformat is an <eref target="#Progressive%20enhancement">optional</eref> text heuristics which applications can detect across various usecases.</t>
|
||||
|
||||
<section anchor="via-html-webpage"><name>via HTML webpage</name>
|
||||
<t>If the browser/application requests an webpage (<tt>https://nlnet.nl</tt> e.g.) it should check for the <eref target="https://gmpg.org/xfn/">rel-me microformat</eref> :</t>
|
||||
|
||||
<artwork><![CDATA[<link rel="alternate" as="spatial-entrypoint" href="scene.xrf.glb">
|
||||
]]>
|
||||
</artwork>
|
||||
<t>This way the application loads <tt>https://nlnet.nl/scene.xrf.glb</tt> when the user types <tt>nlnet.nl</tt> into the URLbar.<br />
|
||||
|
||||
Optionally, <tt>type</tt> can be specified for dynamically generated 3D files:</t>
|
||||
|
||||
<artwork><![CDATA[<link rel="alternate" as="spatial-entrypoint" href="https://worlds.org/scene.php#platformB" type="model/gltf+binary" />
|
||||
]]>
|
||||
</artwork>
|
||||
<t>The <tt>type</tt>-attribute is for fallback-purposes.<br />
|
||||
|
||||
Viewer-supported 3D file-extensions (<tt>.glb</tt> e.g.) will <strong>ALWAYS</strong> take precedence over the (non)presence of the <tt>type</tt> attribute.<br />
|
||||
|
||||
The reason is that platforms (Mastodon 'labels' e.g.) don't allow specifying type-attributes.<br />
|
||||
|
||||
Another reason is that XR Fragments is filetype-agnostic, so flexibility is expected on the viewer-side.</t>
|
||||
<blockquote><t>NOTE: in case of multiple 3D files mentioned in <tt><link rel="me"</tt>, only the first (supported 3D filetype) will be chosen.</t>
|
||||
</blockquote><t>Example of multiple spatial microformats:</t>
|
||||
|
||||
<artwork><![CDATA[<link rel="alternate" as="spatial-entrypoint" href="scene.xrf.glb"/>
|
||||
<link rel="me" href="myavatar.vrm"/>
|
||||
<!-- JanusXR microformat https://github.com/jbaicoianu/janusweb
|
||||
<FireBoxRoom>
|
||||
<Assets>
|
||||
<assetobject id="experience" src="scene.xrf.glb"/>
|
||||
</Assets>
|
||||
<Room>
|
||||
<object pos="0 0 0" collision_id="experience" id="experience" />
|
||||
</Room>
|
||||
</FireBoxRoom>
|
||||
-->
|
||||
]]>
|
||||
</artwork>
|
||||
</section>
|
||||
|
||||
<section anchor="via-webfinger"><name>via WebFinger</name>
|
||||
<t>When John has an account on foo.com, how can other applications request his 3D homepage by simply entering <tt>john@foo.com</tt>?</t>
|
||||
<blockquote><t>Answer: it can be requested at <tt>https://foo.com/.well-known/webfinger?resource=acct:john@foo.com</tt>, resulting in:</t>
|
||||
</blockquote>
|
||||
<artwork><![CDATA[{
|
||||
"subject": "acct:john@foo.com",
|
||||
"aliases": [
|
||||
"https://mastodon.example/social/john",
|
||||
"https://john.foo.com",
|
||||
"https://3d.john.foo.com/model/scene.glb"
|
||||
],
|
||||
"properties": {
|
||||
"http://schema.org/name": "John Doe",
|
||||
"http://schema.org/description": "Developer, 3D Enthusiast, and Social Explorer"
|
||||
},
|
||||
"links": [
|
||||
{
|
||||
"rel": "http://ostatus.org/schema/1.0/subscribe",
|
||||
"template": "https://mastodon.example/social/john/{uri}"
|
||||
},
|
||||
{
|
||||
"rel": "self",
|
||||
"type": "text/html",
|
||||
"href": "https://john.foo.com"
|
||||
},
|
||||
{
|
||||
"rel": "me",
|
||||
"type": "text/html",
|
||||
"href": "https://john.foo.com"
|
||||
},
|
||||
{
|
||||
"rel": "me",
|
||||
"type": "model/gltf+binary",
|
||||
"href": "https://3d.john.foo.com/model/avatar.vrm"
|
||||
},
|
||||
{
|
||||
"rel": "scene",
|
||||
"type": "model/gltf+binary",
|
||||
"href": "https://3d.john.foo.com/model/scene.xrf.glb"
|
||||
}
|
||||
]
|
||||
}
|
||||
]]>
|
||||
</artwork>
|
||||
<t>This way the application will load <tt>https://3d.john.foo.com/model/scene.glb</tt> when the user types <tt>john@foo.com</tt> into the user field.</t>
|
||||
</section>
|
||||
|
||||
<section anchor="via-text-uri"><name>via Text (URI)</name>
|
||||
<t>Another way for an application to trigger loading a 3D scene is by detecting URI's of 3D scene-files any text:</t>
|
||||
|
||||
<ul spacing="compact">
|
||||
<li><tt>foo.glb</tt> (or any other popular 3D extension)</li>
|
||||
<li><tt>https://foo.com/scene.glb</tt> (or any other popular protocol)</li>
|
||||
</ul>
|
||||
<t>This way, the application can highlight the link whenever it detects the URI (in a text-file or text-section of a 3D model)</t>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section anchor="overlap-with-fileformat-specific-extensions"><name>Overlap with fileformat-specific extensions</name>
|
||||
<t>Some 3D scene-fileformats have support for extensions.
|
||||
What if the functionality of those overlap?
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue