fix url navigation

This commit is contained in:
Leon van Kammen 2024-01-30 09:58:00 +00:00
parent 9df7685253
commit ae7225d4ba
20 changed files with 12934 additions and 538 deletions

View file

@ -4,7 +4,7 @@ name: Deploy static content to Pages
on:
# Runs on pushes targeting the default branch
push:
branches: ["main","feat/multiparty"]
branches: ["main"] # ["main","feat/multiparty"]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
@ -31,11 +31,11 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Checkout feat/multiparty
uses: actions/checkout@v3
with:
ref: feat/multiparty
path: feat/multiparty
#- name: Checkout feat/multiparty
# uses: actions/checkout@v3
# with:
# ref: feat/multiparty
# path: feat/multiparty
- name: Setup Pages
uses: actions/configure-pages@v3
- name: create index.gltf
@ -44,7 +44,7 @@ jobs:
run: cp example/assets/*.{gltf,glb} .
# working-directory: ./
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
uses: actions/upload-pages-artifact@v3
with:
path: '.'
- name: Deploy to GitHub Pages

View file

@ -1,5 +1,5 @@
/*
* v0.5.1 generated at Mon Jan 29 08:11:09 PM UTC 2024
* v0.5.1 generated at Tue Jan 30 09:55:47 AM UTC 2024
* https://xrfragment.org
* SPDX-License-Identifier: MPL-2.0
*/
@ -903,10 +903,12 @@ xrf.patchLoader = function(loader){
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
// parseModel event is essential for src.js to hook into embedded loaded models
xrf.parseModel = function(model,url){
let file = xrf.getFile(url)
model.file = file
model.isXRF = true
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
xrf.emit('parseModel',{model,url,file})
}
@ -932,7 +934,7 @@ xrf.reset = () => {
xrf.add( xrf.interactive )
xrf.layers = 0
// reset certain events
// allow others to reset certain events
xrf.emit('reset',{})
// remove mixers
xrf.mixers.map( (m) => m.stop())
@ -1043,9 +1045,8 @@ xrf.navigator.to = (url,flags,loader,data) => {
}
if( data ){ // file upload
console.dir(loader)
loader.parse(data, "", onLoad )
}else loader.load(url, onLoad )
}else loader.load(url, onLoad )
})
})
})
@ -1339,7 +1340,7 @@ xrf.frag.src.enableSourcePortation = (src) => {
mat.metalness = 1
mat.opacity = 0
const cube = new THREE.Mesh( geo, mat )
console.log("todo: sourceportate")
// *TODO* sourceportate?
return xrf.frag.src
}
@ -1473,7 +1474,7 @@ xrf.addEventListener('parseModel', (opts) => {
model.animations.map( (anim) => {
anim.optimize()
console.log("action: "+anim.name)
if( xrf.debug ) console.log("action: "+anim.name)
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
})
@ -1825,7 +1826,7 @@ xrf.filter.process = function(frag,scene,opts){
let obj
frag.target = firstFilter
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if( xrf.debug ) console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if(obj ){
obj.position.set(0,0,0)
if( opts.copyScene ) {
@ -1883,7 +1884,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
scene.traverse( (n) => {
if( n.userData && n.userData['#'] ){
let frag = xrf.URI.parse( n.userData['#'] )
if( n.parent && n.parent.parent.isScene && document.location.hash.length < 2 ){
if( !n.parent && document.location.hash.length < 2){
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
}else{
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
@ -2251,7 +2252,7 @@ xrf.portalNonEuclidian = function(opts){
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
cam.getWorldPosition(cameraPosition)
cam.getWorldDirection(cameraDirection)
if( cameraPosition.distanceTo(newPos) > 20.0 ) return // dont render far portals
if( cameraPosition.distanceTo(newPos) > 10.0 ) return // dont render far portals
// init
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
@ -2406,6 +2407,17 @@ window.AFRAME.registerComponent('xrf', {
https: { type:'string'},
},
init: function () {
// override this.data when URL has passed (`://....com/?https://foo.com/index.glb` e.g.)
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
if( !AFRAME.XRF ){
let camera = document.querySelector('[camera]')
@ -2532,15 +2544,6 @@ window.AFRAME.registerComponent('xrf', {
aScene.setAttribute('xrf-gaze','')
}
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
},
})
@ -2821,7 +2824,7 @@ window.AFRAME.registerComponent('xrf-get', {
mesh.scale.copy(world.scale)
mesh.setRotationFromQuaternion(world.quat);
}else{
// add() will reparent the mesh so lets create a dummy
// lets create a dummy add function so that the mesh won't get reparented
this.el.object3D.add = (a) => a
}
this.el.setObject3D('mesh',mesh)
@ -2833,6 +2836,10 @@ window.AFRAME.registerComponent('xrf-get', {
this.el.emit("update",{timeout:0})
AFRAME.XRF.addEventListener('reset', () => {
this.el.remove()
})
}
});

View file

@ -1,5 +1,5 @@
/*
* v0.5.1 generated at Mon Jan 29 08:11:09 PM UTC 2024
* v0.5.1 generated at Tue Jan 30 09:55:47 AM UTC 2024
* https://xrfragment.org
* SPDX-License-Identifier: MPL-2.0
*/
@ -901,10 +901,12 @@ xrf.patchLoader = function(loader){
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
// parseModel event is essential for src.js to hook into embedded loaded models
xrf.parseModel = function(model,url){
let file = xrf.getFile(url)
model.file = file
model.isXRF = true
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
xrf.emit('parseModel',{model,url,file})
}
@ -930,7 +932,7 @@ xrf.reset = () => {
xrf.add( xrf.interactive )
xrf.layers = 0
// reset certain events
// allow others to reset certain events
xrf.emit('reset',{})
// remove mixers
xrf.mixers.map( (m) => m.stop())
@ -1041,9 +1043,8 @@ xrf.navigator.to = (url,flags,loader,data) => {
}
if( data ){ // file upload
console.dir(loader)
loader.parse(data, "", onLoad )
}else loader.load(url, onLoad )
}else loader.load(url, onLoad )
})
})
})
@ -1337,7 +1338,7 @@ xrf.frag.src.enableSourcePortation = (src) => {
mat.metalness = 1
mat.opacity = 0
const cube = new THREE.Mesh( geo, mat )
console.log("todo: sourceportate")
// *TODO* sourceportate?
return xrf.frag.src
}
@ -1471,7 +1472,7 @@ xrf.addEventListener('parseModel', (opts) => {
model.animations.map( (anim) => {
anim.optimize()
console.log("action: "+anim.name)
if( xrf.debug ) console.log("action: "+anim.name)
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
})
@ -1823,7 +1824,7 @@ xrf.filter.process = function(frag,scene,opts){
let obj
frag.target = firstFilter
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if( xrf.debug ) console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if(obj ){
obj.position.set(0,0,0)
if( opts.copyScene ) {
@ -1881,7 +1882,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
scene.traverse( (n) => {
if( n.userData && n.userData['#'] ){
let frag = xrf.URI.parse( n.userData['#'] )
if( n.parent && n.parent.parent.isScene && document.location.hash.length < 2 ){
if( !n.parent && document.location.hash.length < 2){
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
}else{
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
@ -2249,7 +2250,7 @@ xrf.portalNonEuclidian = function(opts){
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
cam.getWorldPosition(cameraPosition)
cam.getWorldDirection(cameraDirection)
if( cameraPosition.distanceTo(newPos) > 20.0 ) return // dont render far portals
if( cameraPosition.distanceTo(newPos) > 10.0 ) return // dont render far portals
// init
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
@ -2404,6 +2405,17 @@ window.AFRAME.registerComponent('xrf', {
https: { type:'string'},
},
init: function () {
// override this.data when URL has passed (`://....com/?https://foo.com/index.glb` e.g.)
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
if( !AFRAME.XRF ){
let camera = document.querySelector('[camera]')
@ -2530,15 +2542,6 @@ window.AFRAME.registerComponent('xrf', {
aScene.setAttribute('xrf-gaze','')
}
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
},
})
@ -2819,7 +2822,7 @@ window.AFRAME.registerComponent('xrf-get', {
mesh.scale.copy(world.scale)
mesh.setRotationFromQuaternion(world.quat);
}else{
// add() will reparent the mesh so lets create a dummy
// lets create a dummy add function so that the mesh won't get reparented
this.el.object3D.add = (a) => a
}
this.el.setObject3D('mesh',mesh)
@ -2831,6 +2834,10 @@ window.AFRAME.registerComponent('xrf-get', {
this.el.emit("update",{timeout:0})
AFRAME.XRF.addEventListener('reset', () => {
this.el.remove()
})
}
});

12188
dist/xrfragment.module.js vendored

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/*
* v0.5.1 generated at Mon Jan 29 08:11:09 PM UTC 2024
* v0.5.1 generated at Tue Jan 30 09:55:47 AM UTC 2024
* https://xrfragment.org
* SPDX-License-Identifier: MPL-2.0
*/
@ -901,10 +901,12 @@ xrf.patchLoader = function(loader){
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
// parseModel event is essential for src.js to hook into embedded loaded models
xrf.parseModel = function(model,url){
let file = xrf.getFile(url)
model.file = file
model.isXRF = true
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
xrf.emit('parseModel',{model,url,file})
}
@ -930,7 +932,7 @@ xrf.reset = () => {
xrf.add( xrf.interactive )
xrf.layers = 0
// reset certain events
// allow others to reset certain events
xrf.emit('reset',{})
// remove mixers
xrf.mixers.map( (m) => m.stop())
@ -1041,9 +1043,8 @@ xrf.navigator.to = (url,flags,loader,data) => {
}
if( data ){ // file upload
console.dir(loader)
loader.parse(data, "", onLoad )
}else loader.load(url, onLoad )
}else loader.load(url, onLoad )
})
})
})
@ -1337,7 +1338,7 @@ xrf.frag.src.enableSourcePortation = (src) => {
mat.metalness = 1
mat.opacity = 0
const cube = new THREE.Mesh( geo, mat )
console.log("todo: sourceportate")
// *TODO* sourceportate?
return xrf.frag.src
}
@ -1471,7 +1472,7 @@ xrf.addEventListener('parseModel', (opts) => {
model.animations.map( (anim) => {
anim.optimize()
console.log("action: "+anim.name)
if( xrf.debug ) console.log("action: "+anim.name)
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
})
@ -1823,7 +1824,7 @@ xrf.filter.process = function(frag,scene,opts){
let obj
frag.target = firstFilter
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if( xrf.debug ) console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if(obj ){
obj.position.set(0,0,0)
if( opts.copyScene ) {
@ -1881,7 +1882,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
scene.traverse( (n) => {
if( n.userData && n.userData['#'] ){
let frag = xrf.URI.parse( n.userData['#'] )
if( n.parent && n.parent.parent.isScene && document.location.hash.length < 2 ){
if( !n.parent && document.location.hash.length < 2){
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
}else{
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
@ -2249,7 +2250,7 @@ xrf.portalNonEuclidian = function(opts){
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
cam.getWorldPosition(cameraPosition)
cam.getWorldDirection(cameraDirection)
if( cameraPosition.distanceTo(newPos) > 20.0 ) return // dont render far portals
if( cameraPosition.distanceTo(newPos) > 10.0 ) return // dont render far portals
// init
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true

View file

@ -1,5 +1,5 @@
/*
* v0.5.1 generated at Mon Jan 29 08:11:09 PM UTC 2024
* v0.5.1 generated at Tue Jan 30 09:55:47 AM UTC 2024
* https://xrfragment.org
* SPDX-License-Identifier: MPL-2.0
*/
@ -901,10 +901,12 @@ xrf.patchLoader = function(loader){
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
// parseModel event is essential for src.js to hook into embedded loaded models
xrf.parseModel = function(model,url){
let file = xrf.getFile(url)
model.file = file
model.isXRF = true
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
xrf.emit('parseModel',{model,url,file})
}
@ -930,7 +932,7 @@ xrf.reset = () => {
xrf.add( xrf.interactive )
xrf.layers = 0
// reset certain events
// allow others to reset certain events
xrf.emit('reset',{})
// remove mixers
xrf.mixers.map( (m) => m.stop())
@ -1041,9 +1043,8 @@ xrf.navigator.to = (url,flags,loader,data) => {
}
if( data ){ // file upload
console.dir(loader)
loader.parse(data, "", onLoad )
}else loader.load(url, onLoad )
}else loader.load(url, onLoad )
})
})
})
@ -1337,7 +1338,7 @@ xrf.frag.src.enableSourcePortation = (src) => {
mat.metalness = 1
mat.opacity = 0
const cube = new THREE.Mesh( geo, mat )
console.log("todo: sourceportate")
// *TODO* sourceportate?
return xrf.frag.src
}
@ -1471,7 +1472,7 @@ xrf.addEventListener('parseModel', (opts) => {
model.animations.map( (anim) => {
anim.optimize()
console.log("action: "+anim.name)
if( xrf.debug ) console.log("action: "+anim.name)
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
})
@ -1823,7 +1824,7 @@ xrf.filter.process = function(frag,scene,opts){
let obj
frag.target = firstFilter
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if( xrf.debug ) console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if(obj ){
obj.position.set(0,0,0)
if( opts.copyScene ) {
@ -1881,7 +1882,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
scene.traverse( (n) => {
if( n.userData && n.userData['#'] ){
let frag = xrf.URI.parse( n.userData['#'] )
if( n.parent && n.parent.parent.isScene && document.location.hash.length < 2 ){
if( !n.parent && document.location.hash.length < 2){
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
}else{
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
@ -2249,7 +2250,7 @@ xrf.portalNonEuclidian = function(opts){
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
cam.getWorldPosition(cameraPosition)
cam.getWorldDirection(cameraDirection)
if( cameraPosition.distanceTo(newPos) > 20.0 ) return // dont render far portals
if( cameraPosition.distanceTo(newPos) > 10.0 ) return // dont render far portals
// init
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true

View file

@ -80,7 +80,7 @@ value: draft-XRFRAGMENTS-leonvankammen-00
<h1 class="special" id="abstract">Abstract</h1>
<p>This draft is a specification for 4D URLs &amp; <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> navigation, which links together space, time &amp; text together, for hypermedia browsers with- or without a network-connection.<br>
<p>This draft is a specification for 4D URI&rsquo;s &amp; <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> navigation, which links together space, time &amp; text together, for hypermedia browsers with- or without a network-connection.<br>
The specification promotes spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br>
XR Fragments allows us to better use existing metadata inside 3D scene(files), by connecting it to proven technologies like <a href="https://en.wikipedia.org/wiki/URI_fragment">URI Fragments</a>.</p>
@ -95,13 +95,13 @@ Historically, there&rsquo;s many attempts to create the ultimate markuplanguage
The lowest common denominator is: designers describing/tagging/naming things using <strong>plain text</strong>.<br>
XR Fragments exploits the fact that all 3D models already contain such metadata:</p>
<p><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URLs</strong></p>
<p><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URI&rsquo;s</strong></p>
<p>Or more detailed:</p>
<p>It solves:</p>
<ol>
<li>addressibility and <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> navigation of 3D scenes/objects: <a href="https://en.wikipedia.org/wiki/URI_fragment">URI Fragments</a> + src/href spatial metadata</li>
<li>Interlinking (text)objects by collapsing space into a Word Graph (XRWG) to show <a href="#visible-links">visible links</a></li>
<li>Interlinking text &amp; spatial objects by collapsing space into a Word Graph (XRWG) to show <a href="#visible-links">visible links</a></li>
<li>unlocking spatial potential of the (originally 2D) hashtag (which jumps to a chapter) for navigating XR documents</li>
</ol>
@ -111,10 +111,78 @@ XR Fragments exploits the fact that all 3D models already contain such metadata:
<h1 id="core-principle">Core principle</h1>
<p><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URLs</strong></p>
<p><strong>XR Fragments allows controlling 3D models using URLs, based on (non)existing metadata via URI&rsquo;s</strong></p>
<p>XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br>
Instead of combining them (in a game-editor e.g.), XR Fragments <strong>integrates all</strong>, by collecting metadata into an XRWG and control it via URL:</p>
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></p>
<pre><code> +───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ U R N │
│ U R L | │
│ | |-----------------+--------| │
│ +--------------------------------------------------| │
│ | │
│ + https://foo.com/some/foo/scene.glb#someview &lt;-- http URI (=URL and has URN) │
│ | │
│ + ipfs://cfe0987ec9r9098ecr/cats.fbx#someview &lt;-- an IPFS URI (=URL and has URN) │
│ │
│ ec09f7e9cf8e7f09c8e7f98e79c09ef89e000efece8f7ecfe9fe &lt;-- an interpeer URI │
│ │
│ │
│ |------------------------+-------------------------| │
│ | │
│ U R I │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
</code></pre>
<p>Fact: our typical browser URL&rsquo;s are just <strong>a possible implementation</strong> of URI&rsquo;s (for untapped humancentric potential of URI&rsquo;s <a href="https://interpeer.io">see interpeer.io</a>)</p>
<blockquote>
<p>XR Fragments does not look at XR (or the web) thru the lens of HTML or URLs.<br>But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective.</p>
</blockquote>
<p>Below you can see how this translates back into good-old URLs:</p>
<pre><code> +───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ─&gt; ?other.glb ─&gt; #view ───&gt; hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ (hypermediatic) #material │ │
│ │ ( feedback ) #animation │ │
│ │ ( loop ) #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG &lt;─────────────────────&lt;─────────────+ │
│ │ │ │
│ └─ objects ──────────────&gt;─────────────+ │
│ │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
</code></pre>
<blockquote>
<p>?-linked and #-linked navigation allows a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.</p>
</blockquote>
<p>Traditional webbrowsers can become 4D document-ready by:</p>
<ul>
<li><a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).</li>
<li>allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).</li>
<li>collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus</li>
<li>completely bypasses the security-trap of loading external scripts (by loading 3D model-files, not HTML-javascriptable resources)</li>
</ul>
<p>XR Fragments itself are <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> and HTML-agnostic, though pseudo-XR Fragment browsers <strong>can</strong> be implemented on top of HTML/Javascript.</p>
<table>
<thead>
@ -176,48 +244,13 @@ Instead of combining them (in a game-editor e.g.), XR Fragments <strong>integrat
</tbody>
</table>
<blockquote>
<p>XR Fragments does not look at XR (or the web) thru the lens of HTML.<br>But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective:</p>
</blockquote>
<pre><code> +──────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ──&gt; ?misc ──&gt; #view ───&gt; hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ #material │ │
│ │ #animation │ │
│ │ #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG &lt;─────────────────────&lt;────────────+ │
│ │ │ │
│ └─ objects ──────────────&gt;────────────+ │
│ │
│ │
+──────────────────────────────────────────────────────────────────────────────────────────────+
</code></pre>
<p>Traditional webbrowsers can become 4D document-ready by:</p>
<ul>
<li><a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).</li>
<li>allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).</li>
<li>collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus</li>
</ul>
<p>XR Fragments itself are <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> and HTML-agnostic, though pseudo-XR Fragment browsers <strong>can</strong> be implemented on top of HTML/Javascript.</p>
<h1 id="conventions-and-definitions">Conventions and Definitions</h1>
<p>See appendix below in case certain terms are not clear.</p>
<h2 id="xr-fragment-uri-grammar">XR Fragment URI Grammar</h2>
<h2 id="xr-fragment-url-grammar">XR Fragment URL Grammar</h2>
<p>For typical HTTP-like browsers/applications:</p>
<pre><code>reserved = gen-delims / sub-delims
gen-delims = &quot;#&quot; / &quot;&amp;&quot;
@ -253,6 +286,10 @@ sub-delims = &quot;,&quot; / &quot;=&quot;
<p>this is already implemented in all browsers</p>
</blockquote>
<p>Pseudo (non-native) browser-implementations (supporting XR Fragments using HTML+JS e.g.) can use the <code>?</code> search-operator to address outbound content.<br>
In other words, the URL updates to: <code>https://me.com?https://me.com/other.glb</code> when navigating to <code>https://me.com/other.glb</code> from inside a <code>https://me.com</code> WebXR experience e.g.<br>
That way, if the link gets shared, the XR Fragments implementation at <code>https://me.com</code> can load the latter (and still indicates which XR Fragments entrypoint-experience/client was used).</p>
<h1 id="list-of-uri-fragments">List of URI Fragments</h1>
<table>
@ -1404,6 +1441,16 @@ Non-HTML Hypermedia browsers should make browser extensions the right place, to
<td>an object inside a scene characterized by vertex-, face- and customproperty data.</td>
</tr>
<tr>
<td>URI</td>
<td>some resource at something somewhere via someprotocol (<code>http://me.com/foo.glb#foo</code> or <code>e76f8efec8efce98e6f</code> <a href="https://interpeer.io">see interpeer.io</a>)</td>
</tr>
<tr>
<td>URL</td>
<td>something somewhere via someprotocol (<code>http://me.com/foo.glb</code>)</td>
</tr>
<tr>
<td>metadata</td>
<td>custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers)</td>

View file

@ -93,7 +93,7 @@ value: draft-XRFRAGMENTS-leonvankammen-00
.# Abstract
This draft is a specification for 4D URLs & [hypermediatic](https://github.com/coderofsalvation/hypermediatic) navigation, which links together space, time & text together, for hypermedia browsers with- or without a network-connection.<br>
This draft is a specification for 4D URI's & [hypermediatic](https://github.com/coderofsalvation/hypermediatic) navigation, which links together space, time & text together, for hypermedia browsers with- or without a network-connection.<br>
The specification promotes spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br>
XR Fragments allows us to better use existing metadata inside 3D scene(files), by connecting it to proven technologies like [URI Fragments](https://en.wikipedia.org/wiki/URI_fragment).
@ -108,22 +108,86 @@ Historically, there's many attempts to create the ultimate markuplanguage or 3D
The lowest common denominator is: designers describing/tagging/naming things using **plain text**.<br>
XR Fragments exploits the fact that all 3D models already contain such metadata:
**XR Fragments allows controlling of metadata in 3D scene(files) using URLs**
**XR Fragments allows controlling of metadata in 3D scene(files) using URI's**
Or more detailed:
It solves:
1. addressibility and [hypermediatic](https://github.com/coderofsalvation/hypermediatic) navigation of 3D scenes/objects: [URI Fragments](https://en.wikipedia.org/wiki/URI_fragment) + src/href spatial metadata
1. Interlinking (text)objects by collapsing space into a Word Graph (XRWG) to show [visible links](#visible-links)
1. Interlinking text & spatial objects by collapsing space into a Word Graph (XRWG) to show [visible links](#visible-links)
1. unlocking spatial potential of the (originally 2D) hashtag (which jumps to a chapter) for navigating XR documents
> NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible
# Core principle
**XR Fragments allows controlling of metadata in 3D scene(files) using URLs**
**XR Fragments allows controlling 3D models using URLs, based on (non)existing metadata via URI's**
XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br>
Instead of combining them (in a game-editor e.g.), XR Fragments **integrates all**, by collecting metadata into an XRWG and control it via URL:
Instead of forcing authors to combine 3D/2D objects programmatically (publishing thru a game-editor e.g.), XR Fragments **integrates all** which allows a universal viewing experience.<br>
```
+───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ U R N │
│ U R L | │
│ | |-----------------+--------| │
│ +--------------------------------------------------| │
│ | │
│ + https://foo.com/some/foo/scene.glb#someview <-- http URI (=URL and has URN)
│ | │
│ + ipfs://cfe0987ec9r9098ecr/cats.fbx#someview <-- an IPFS URI (=URL and has URN)
│ │
│ ec09f7e9cf8e7f09c8e7f98e79c09ef89e000efece8f7ecfe9fe <-- an interpeer URI
│ │
│ │
│ |------------------------+-------------------------| │
│ | │
│ U R I │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
```
Fact: our typical browser URL's are just **a possible implementation** of URI's (for untapped humancentric potential of URI's [see interpeer.io](https://interpeer.io))
> XR Fragments does not look at XR (or the web) thru the lens of HTML or URLs.<br>But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective.
Below you can see how this translates back into good-old URLs:
```
+───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano
│ │
│ 2D URL: ://library.com /document ?search #chapter
│ │
│ 4D URL: ://park.com /4Dscene.fbx ─> ?other.glb ─> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ (hypermediatic) #material │ │
│ │ ( feedback ) #animation │ │
│ │ ( loop ) #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<─────────────+ │
│ │ │ │
│ └─ objects ──────────────>─────────────+ │
│ │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
```
> ?-linked and #-linked navigation allows a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.
Traditional webbrowsers can become 4D document-ready by:
* [hypermediatic](https://github.com/coderofsalvation/hypermediatic) loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).
* allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).
* collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus
* completely bypasses the security-trap of loading external scripts (by loading 3D model-files, not HTML-javascriptable resources)
XR Fragments itself are [hypermediatic](https://github.com/coderofsalvation/hypermediatic) and HTML-agnostic, though pseudo-XR Fragment browsers **can** be implemented on top of HTML/Javascript.
| principle | XR 4D URL | HTML 2D URL |
|----------------------|-------------------------------------------------|---------------------------------------|
@ -136,45 +200,13 @@ Instead of combining them (in a game-editor e.g.), XR Fragments **integrates all
| href metadata | draws visible connection(s) for XRWG 'tag' | n/a |
| href metadata | filters certain (in)visible objects | n/a |
> XR Fragments does not look at XR (or the web) thru the lens of HTML.<br>But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective:
```
+──────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano
│ │
│ 2D URL: ://library.com /document ?search #chapter
│ │
│ 4D URL: ://park.com /4Dscene.fbx ──> ?misc ──> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ #material │ │
│ │ #animation │ │
│ │ #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<────────────+ │
│ │ │ │
│ └─ objects ──────────────>────────────+ │
│ │
│ │
+──────────────────────────────────────────────────────────────────────────────────────────────+
```
Traditional webbrowsers can become 4D document-ready by:
* [hypermediatic](https://github.com/coderofsalvation/hypermediatic) loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).
* allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).
* collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus
XR Fragments itself are [hypermediatic](https://github.com/coderofsalvation/hypermediatic) and HTML-agnostic, though pseudo-XR Fragment browsers **can** be implemented on top of HTML/Javascript.
# Conventions and Definitions
See appendix below in case certain terms are not clear.
## XR Fragment URI Grammar
## XR Fragment URL Grammar
For typical HTTP-like browsers/applications:
```
reserved = gen-delims / sub-delims
@ -187,10 +219,14 @@ sub-delims = "," / "="
| Demo | Explanation |
|-------------------------------|---------------------------------|
| `pos=1,2,3` | vector/coordinate argument e.g. |
| `pos=1,2,3&rot=0,90,0&foo` | combinators |
| `pos=1,2,3&rot=0,90,0&foo` | combinators |
> this is already implemented in all browsers
Pseudo (non-native) browser-implementations (supporting XR Fragments using HTML+JS e.g.) can use the `?` search-operator to address outbound content.<br>
In other words, the URL updates to: `https://me.com?https://me.com/other.glb` when navigating to `https://me.com/other.glb` from inside a `https://me.com` WebXR experience e.g.<br>
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).
# List of URI Fragments
| fragment | type | example | info |
@ -957,6 +993,8 @@ This document has no IANA actions.
|human | a sentient being who thinks fuzzy, absorbs, and shares thought (by plain text, not markuplanguage) |
|scene | a (local/remote) 3D scene or 3D file (index.gltf e.g.) |
|3D object | an object inside a scene characterized by vertex-, face- and customproperty data. |
|URI | some resource at something somewhere via someprotocol (`http://me.com/foo.glb#foo` or `e76f8efec8efce98e6f` [see interpeer.io](https://interpeer.io))|
|URL | something somewhere via someprotocol (`http://me.com/foo.glb`) |
|metadata | custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers) |
|XR fragment | URI Fragment with spatial hints like `#pos=0,0,0&t=1,100` e.g. |
|the XRWG | wordgraph (collapses 3D scene to tags) |

View file

@ -3,7 +3,7 @@
Internet Engineering Task Force L.R. van Kammen
Internet-Draft 6 December 2023
Internet-Draft 30 January 2024
Intended status: Informational
@ -13,7 +13,7 @@ Intended status: Informational
Abstract
This draft is a specification for 4D URLs & hypermediatic
This draft is a specification for 4D URI's & hypermediatic
(https://github.com/coderofsalvation/hypermediatic) navigation, which
links together space, time & text together, for hypermedia browsers
with- or without a network-connection.
@ -41,11 +41,11 @@ Status of This Memo
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
This Internet-Draft will expire on 8 June 2024.
This Internet-Draft will expire on 2 August 2024.
Copyright Notice
Copyright (c) 2023 IETF Trust and the persons identified as the
Copyright (c) 2024 IETF Trust and the persons identified as the
document authors. All rights reserved.
@ -53,9 +53,9 @@ Copyright Notice
van Kammen Expires 8 June 2024 [Page 1]
van Kammen Expires 2 August 2024 [Page 1]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
This document is subject to BCP 78 and the IETF Trust's Legal
@ -71,47 +71,47 @@ Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Core principle . . . . . . . . . . . . . . . . . . . . . . . 3
3. Conventions and Definitions . . . . . . . . . . . . . . . . . 5
3.1. XR Fragment URI Grammar . . . . . . . . . . . . . . . . . 5
4. List of URI Fragments . . . . . . . . . . . . . . . . . . . . 6
4.1. List of metadata for 3D nodes . . . . . . . . . . . . . . 6
4.2. vector datatypes . . . . . . . . . . . . . . . . . . . . 7
4.3. Dynamic XR Fragments (+databindings) . . . . . . . . . . 7
5. Spatial Referencing 3D . . . . . . . . . . . . . . . . . . . 8
6. Navigating 3D . . . . . . . . . . . . . . . . . . . . . . . . 9
7. Top-level URL processing . . . . . . . . . . . . . . . . . . 10
8. Embedding XR content using src . . . . . . . . . . . . . . . 11
9. Navigating content href portals . . . . . . . . . . . . . . . 13
9.1. Walking surfaces . . . . . . . . . . . . . . . . . . . . 15
9.2. UX spec . . . . . . . . . . . . . . . . . . . . . . . . . 15
9.3. Scaling instanced content . . . . . . . . . . . . . . . . 15
10. XR Fragment: pos . . . . . . . . . . . . . . . . . . . . . . 16
11. XR Fragment: rot . . . . . . . . . . . . . . . . . . . . . . 16
12. XR Fragment: t . . . . . . . . . . . . . . . . . . . . . . . 16
13. XR audio/video integration . . . . . . . . . . . . . . . . . 17
14. XR Fragment filters . . . . . . . . . . . . . . . . . . . . . 17
14.1. including/excluding . . . . . . . . . . . . . . . . . . 18
14.2. Filter Parser . . . . . . . . . . . . . . . . . . . . . 18
15. Visible links . . . . . . . . . . . . . . . . . . . . . . . . 19
16. Text in XR (tagging,linking to spatial objects) . . . . . . . 19
16.1. Default Data URI mimetype . . . . . . . . . . . . . . . 23
16.2. URL and Data URI . . . . . . . . . . . . . . . . . . . . 24
16.3. XR Text example parser . . . . . . . . . . . . . . . . . 25
17. Transclusion (broken link) resolution . . . . . . . . . . . . 27
18. Topic-based index-less Webrings . . . . . . . . . . . . . . . 28
19. Security Considerations . . . . . . . . . . . . . . . . . . . 29
20. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
21. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 30
22. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 30
23. Appendix: Definitions . . . . . . . . . . . . . . . . . . . . 30
3. Conventions and Definitions . . . . . . . . . . . . . . . . . 6
3.1. XR Fragment URL Grammar . . . . . . . . . . . . . . . . . 6
4. List of URI Fragments . . . . . . . . . . . . . . . . . . . . 7
4.1. List of metadata for 3D nodes . . . . . . . . . . . . . . 8
4.2. vector datatypes . . . . . . . . . . . . . . . . . . . . 8
4.3. Dynamic XR Fragments (+databindings) . . . . . . . . . . 9
5. Spatial Referencing 3D . . . . . . . . . . . . . . . . . . . 10
6. Navigating 3D . . . . . . . . . . . . . . . . . . . . . . . . 10
7. Top-level URL processing . . . . . . . . . . . . . . . . . . 12
8. Embedding XR content using src . . . . . . . . . . . . . . . 12
9. Navigating content href portals . . . . . . . . . . . . . . . 14
9.1. Walking surfaces . . . . . . . . . . . . . . . . . . . . 16
9.2. UX spec . . . . . . . . . . . . . . . . . . . . . . . . . 16
9.3. Scaling instanced content . . . . . . . . . . . . . . . . 16
10. XR Fragment: pos . . . . . . . . . . . . . . . . . . . . . . 17
11. XR Fragment: rot . . . . . . . . . . . . . . . . . . . . . . 17
12. XR Fragment: t . . . . . . . . . . . . . . . . . . . . . . . 17
13. XR audio/video integration . . . . . . . . . . . . . . . . . 18
14. XR Fragment filters . . . . . . . . . . . . . . . . . . . . . 18
14.1. including/excluding . . . . . . . . . . . . . . . . . . 19
14.2. Filter Parser . . . . . . . . . . . . . . . . . . . . . 19
15. Visible links . . . . . . . . . . . . . . . . . . . . . . . . 20
16. Text in XR (tagging,linking to spatial objects) . . . . . . . 20
16.1. Default Data URI mimetype . . . . . . . . . . . . . . . 24
16.2. URL and Data URI . . . . . . . . . . . . . . . . . . . . 25
16.3. XR Text example parser . . . . . . . . . . . . . . . . . 26
17. Transclusion (broken link) resolution . . . . . . . . . . . . 28
18. Topic-based index-less Webrings . . . . . . . . . . . . . . . 29
19. Security Considerations . . . . . . . . . . . . . . . . . . . 30
20. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
21. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 31
22. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 31
23. Appendix: Definitions . . . . . . . . . . . . . . . . . . . . 31
van Kammen Expires 8 June 2024 [Page 2]
van Kammen Expires 2 August 2024 [Page 2]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
1. Introduction
@ -126,16 +126,16 @@ Internet-Draft XR Fragments December 2023
such metadata:
*XR Fragments allows controlling of metadata in 3D scene(files) using
URLs*
URI's*
Or more detailed:
It solves:
1. addressibility and hypermediatic
(https://github.com/coderofsalvation/hypermediatic) navigation of
3D scenes/objects: URI Fragments (https://en.wikipedia.org/wiki/
URI_fragment) + src/href spatial metadata
2. Interlinking (text)objects by collapsing space into a Word Graph
(XRWG) to show visible links (#visible-links)
2. Interlinking text & spatial objects by collapsing space into a
Word Graph (XRWG) to show visible links (#visible-links)
3. unlocking spatial potential of the (originally 2D) hashtag (which
jumps to a chapter) for navigating XR documents
@ -144,14 +144,14 @@ Internet-Draft XR Fragments December 2023
2. Core principle
*XR Fragments allows controlling of metadata in 3D scene(files) using
URLs*
*XR Fragments allows controlling 3D models using URLs, based on
(non)existing metadata via URI's*
XR Fragments tries to seek to connect the world of text (semantical
web / RDF), and the world of pixels.
Instead of combining them (in a game-editor e.g.), XR Fragments
*integrates all*, by collecting metadata into an XRWG and control it
via URL:
Instead of forcing authors to combine 3D/2D objects programmatically
(publishing thru a game-editor e.g.), XR Fragments *integrates all*
which allows a universal viewing experience.
@ -165,9 +165,121 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 3]
van Kammen Expires 2 August 2024 [Page 3]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
+───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ U R N │
│ U R L | │
│ | |-----------------+--------| │
│ +--------------------------------------------------| │
│ | │
│ + https://foo.com/some/foo/scene.glb#someview <-- http URI (=URL and has URN) │
│ | │
│ + ipfs://cfe0987ec9r9098ecr/cats.fbx#someview <-- an IPFS URI (=URL and has URN) │
│ │
│ ec09f7e9cf8e7f09c8e7f98e79c09ef89e000efece8f7ecfe9fe <-- an interpeer URI │
│ │
│ │
│ |------------------------+-------------------------| │
│ | │
│ U R I │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
Fact: our typical browser URL's are just *a possible implementation*
of URI's (for untapped humancentric potential of URI's see
interpeer.io (https://interpeer.io))
| XR Fragments does not look at XR (or the web) thru the lens of
| HTML or URLs.
| But approaches things from a higherlevel feedbackloop/hypermedia
| browser-perspective.
Below you can see how this translates back into good-old URLs:
van Kammen Expires 2 August 2024 [Page 4]
Internet-Draft XR Fragments January 2024
+───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ─> ?other.glb ─> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ (hypermediatic) #material │ │
│ │ ( feedback ) #animation │ │
│ │ ( loop ) #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<─────────────+ │
│ │ │ │
│ └─ objects ──────────────>─────────────+ │
│ │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
| ?-linked and #-linked navigation allows a Hypermediatic
| FeedbackLoop (HFL) between external and internal 4D navigation.
Traditional webbrowsers can become 4D document-ready by:
* hypermediatic (https://github.com/coderofsalvation/hypermediatic)
loading 3D assets (gltf/fbx e.g.) natively (with or without using
HTML).
* allowing assets to publish hashtags to themselves (the scene)
using the hashbus (like hashtags controlling the scrollbar).
* collapsing the 3D scene to an wordgraph (for essential navigation
purposes) controllable thru a hash(tag)bus
* completely bypasses the security-trap of loading external scripts
(by loading 3D model-files, not HTML-javascriptable resources)
XR Fragments itself are hypermediatic
(https://github.com/coderofsalvation/hypermediatic) and HTML-
agnostic, though pseudo-XR Fragment browsers *can* be implemented on
top of HTML/Javascript.
van Kammen Expires 2 August 2024 [Page 5]
Internet-Draft XR Fragments January 2024
+===========+===============================+====================+
@ -200,73 +312,13 @@ Internet-Draft XR Fragments December 2023
Table 1
| XR Fragments does not look at XR (or the web) thru the lens of
| HTML.
| But approaches things from a higherlevel feedbackloop/hypermedia
| browser-perspective:
van Kammen Expires 8 June 2024 [Page 4]
Internet-Draft XR Fragments December 2023
+──────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ──> ?misc ──> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ #material │ │
│ │ #animation │ │
│ │ #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<────────────+ │
│ │ │ │
│ └─ objects ──────────────>────────────+ │
│ │
│ │
+──────────────────────────────────────────────────────────────────────────────────────────────+
Traditional webbrowsers can become 4D document-ready by:
* hypermediatic (https://github.com/coderofsalvation/hypermediatic)
loading 3D assets (gltf/fbx e.g.) natively (with or without using
HTML).
* allowing assets to publish hashtags to themselves (the scene)
using the hashbus (like hashtags controlling the scrollbar).
* collapsing the 3D scene to an wordgraph (for essential navigation
purposes) controllable thru a hash(tag)bus
XR Fragments itself are hypermediatic
(https://github.com/coderofsalvation/hypermediatic) and HTML-
agnostic, though pseudo-XR Fragment browsers *can* be implemented on
top of HTML/Javascript.
3. Conventions and Definitions
See appendix below in case certain terms are not clear.
3.1. XR Fragment URI Grammar
3.1. XR Fragment URL Grammar
For typical HTTP-like browsers/applications:
reserved = gen-delims / sub-delims
gen-delims = "#" / "&"
@ -277,9 +329,13 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 5]
van Kammen Expires 2 August 2024 [Page 6]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
+==========================+=================================+
@ -294,6 +350,16 @@ Internet-Draft XR Fragments December 2023
| this is already implemented in all browsers
Pseudo (non-native) browser-implementations (supporting XR Fragments
using HTML+JS e.g.) can use the ? search-operator to address outbound
content.
In other words, the URL updates to: https://me.com?https://me.com/
other.glb when navigating to https://me.com/other.glb from inside a
https://me.com WebXR experience e.g.
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).
4. List of URI Fragments
+==========+============+==============+===========================+
@ -313,6 +379,21 @@ Internet-Draft XR Fragments December 2023
Table 3
van Kammen Expires 2 August 2024 [Page 7]
Internet-Draft XR Fragments January 2024
4.1. List of metadata for 3D nodes
+======+========+==========+===================+===================+
@ -330,14 +411,6 @@ Internet-Draft XR Fragments December 2023
| | | geo" | highlighting) | |
+------+--------+----------+-------------------+-------------------+
van Kammen Expires 8 June 2024 [Page 6]
Internet-Draft XR Fragments December 2023
Table 4
| Supported popular compatible 3D fileformats: .gltf, .obj, .fbx,
@ -370,30 +443,19 @@ Internet-Draft XR Fragments December 2023
| agnostic, which means that programmatic 3D scene(nodes) can also
| use the mechanism/metadata.
van Kammen Expires 2 August 2024 [Page 8]
Internet-Draft XR Fragments January 2024
4.3. Dynamic XR Fragments (+databindings)
These are automatic fragment-to-metadata mappings, which only trigger
if the 3D scene metadata matches a specific identifier (aliasname
e.g.)
van Kammen Expires 8 June 2024 [Page 7]
Internet-Draft XR Fragments December 2023
+==========================+=======================+=================+=======================+
|fragment |type |example |info |
+==========================+=======================+=================+=======================+
@ -437,19 +499,17 @@ Internet-Draft XR Fragments December 2023
Table 6
van Kammen Expires 2 August 2024 [Page 9]
Internet-Draft XR Fragments January 2024
5. Spatial Referencing 3D
XR Fragments assume the following objectname-to-URIFragment mapping:
van Kammen Expires 8 June 2024 [Page 8]
Internet-Draft XR Fragments December 2023
my.io/scene.fbx
+─────────────────────────────+
│ sky │ src: http://my.io/scene.fbx#sky (includes building,mainobject,floor)
@ -494,18 +554,18 @@ Internet-Draft XR Fragments December 2023
+--------------------+---------+-----------------------------+
| <b>#t</b>=0,100 | vector3 | set playback speed, and |
| | | (re)position looprange of |
van Kammen Expires 2 August 2024 [Page 10]
Internet-Draft XR Fragments January 2024
| | | scene-animation or src- |
| | | mediacontent |
+--------------------+---------+-----------------------------+
| <b>#rot</b>=0,90,0 | vector3 | rotate camera |
van Kammen Expires 8 June 2024 [Page 9]
Internet-Draft XR Fragments December 2023
+--------------------+---------+-----------------------------+
Table 7
@ -550,18 +610,18 @@ Internet-Draft XR Fragments December 2023
*replace the current scene* with a new one, like other.fbx, and
assume pos=0,0,0.
van Kammen Expires 2 August 2024 [Page 11]
Internet-Draft XR Fragments January 2024
7. Top-level URL processing
| Example URL: ://foo/world.gltf#cube&pos=0,0,0
van Kammen Expires 8 June 2024 [Page 10]
Internet-Draft XR Fragments December 2023
The URL-processing-flow for hypermedia browsers goes like this:
1. IF a #cube matches a custom property-key (of an object) in the 3D
@ -609,13 +669,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 11]
van Kammen Expires 2 August 2024 [Page 12]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
+────────────────────────────────────────────────────────+ +─────────────────────────+
@ -669,9 +725,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 12]
van Kammen Expires 2 August 2024 [Page 13]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
6. <b>external</b> src values should be served with appropriate
@ -725,9 +781,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 13]
van Kammen Expires 2 August 2024 [Page 14]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
+==========+==================+============================+
@ -781,9 +837,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 14]
van Kammen Expires 2 August 2024 [Page 15]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
» example implementation
@ -837,9 +893,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 15]
van Kammen Expires 2 August 2024 [Page 16]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
* calculate the <b>bounding box</b> of the instanced scene, and
@ -893,9 +949,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 16]
van Kammen Expires 2 August 2024 [Page 17]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
13. XR audio/video integration
@ -949,9 +1005,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 17]
van Kammen Expires 2 August 2024 [Page 18]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
14.1. including/excluding
@ -1005,9 +1061,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 18]
van Kammen Expires 2 August 2024 [Page 19]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
2. detect object id's & properties foo=1 and foo (reference regex=
@ -1061,9 +1117,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 19]
van Kammen Expires 2 August 2024 [Page 20]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
| The XR Fragments does this by collapsing space into a *Word Graph*
@ -1117,9 +1173,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 20]
van Kammen Expires 2 August 2024 [Page 21]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
Example:
@ -1173,9 +1229,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 21]
van Kammen Expires 2 August 2024 [Page 22]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
As seen above, the XRWG can expand bibs
@ -1229,9 +1285,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 22]
van Kammen Expires 2 August 2024 [Page 23]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
12. Default font (unless specified otherwise) is a modern monospace
@ -1285,9 +1341,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 23]
van Kammen Expires 2 August 2024 [Page 24]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
* lines beginning with @ will not be rendered verbatim by default
@ -1341,9 +1397,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 24]
van Kammen Expires 2 August 2024 [Page 25]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
+--------------------------------------------------------------+ +------------------------+
@ -1397,9 +1453,9 @@ xrtext = {
van Kammen Expires 8 June 2024 [Page 25]
van Kammen Expires 2 August 2024 [Page 26]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
// bibtex: ↓@ ↓<tag|tag{phrase,|{ruler}> ↓property ↓end
@ -1453,9 +1509,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 26]
van Kammen Expires 2 August 2024 [Page 27]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
str = `
@ -1509,9 +1565,9 @@ console.log( xrtext.encode(text,tags) ) // multiplex text & bibtex back to
van Kammen Expires 8 June 2024 [Page 27]
van Kammen Expires 2 August 2024 [Page 28]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
2. mirroring files on another protocol using (HTTP) errorcode tags
@ -1565,9 +1621,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 28]
van Kammen Expires 2 August 2024 [Page 29]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
* href: university.edu/projects.gltf#math&-theme math
@ -1621,9 +1677,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 29]
van Kammen Expires 2 August 2024 [Page 30]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
Non-HTML Hypermedia browsers should make browser extensions the right
@ -1651,104 +1707,114 @@ Internet-Draft XR Fragments December 2023
23. Appendix: Definitions
+=================+===============================================+
| definition | explanation |
+=================+===============================================+
| human | a sentient being who thinks fuzzy, absorbs, |
| | and shares thought (by plain text, not |
| | markuplanguage) |
+-----------------+-----------------------------------------------+
| scene | a (local/remote) 3D scene or 3D file |
| | (index.gltf e.g.) |
+-----------------+-----------------------------------------------+
| 3D object | an object inside a scene characterized by |
| | vertex-, face- and customproperty data. |
+-----------------+-----------------------------------------------+
| metadata | custom properties of text, 3D Scene or |
| | Object(nodes), relevant to machines and a |
| | human minority (academics/developers) |
+-----------------+-----------------------------------------------+
| XR fragment | URI Fragment with spatial hints like |
| | #pos=0,0,0&t=1,100 e.g. |
+-----------------+-----------------------------------------------+
| the XRWG | wordgraph (collapses 3D scene to tags) |
+-----------------+-----------------------------------------------+
| the hashbus | hashtags map to camera/scene-projections |
+=================+=============================================+
| definition | explanation |
+=================+=============================================+
| human | a sentient being who thinks fuzzy, absorbs, |
| | and shares thought (by plain text, not |
| | markuplanguage) |
+-----------------+---------------------------------------------+
| scene | a (local/remote) 3D scene or 3D file |
| | (index.gltf e.g.) |
+-----------------+---------------------------------------------+
| 3D object | an object inside a scene characterized by |
| | vertex-, face- and customproperty data. |
+-----------------+---------------------------------------------+
| URI | some resource at something somewhere via |
| | someprotocol (http://me.com/foo.glb#foo or |
| | e76f8efec8efce98e6f see interpeer.io |
| | (https://interpeer.io)) |
+-----------------+---------------------------------------------+
| URL | something somewhere via someprotocol |
| | (http://me.com/foo.glb) |
+-----------------+---------------------------------------------+
| metadata | custom properties of text, 3D Scene or |
| | Object(nodes), relevant to machines and a |
van Kammen Expires 8 June 2024 [Page 30]
van Kammen Expires 2 August 2024 [Page 31]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
+-----------------+-----------------------------------------------+
| spacetime | positions camera, triggers scene-preset/time |
| hashtags | |
+-----------------+-----------------------------------------------+
| teleportation | repositioning the enduser to a different |
| | position (or 3D scene/file) |
+-----------------+-----------------------------------------------+
| sourceportation | teleporting the enduser to the original XR |
| | Document of an src embedded object. |
+-----------------+-----------------------------------------------+
| placeholder | a 3D object which with src-metadata (which |
| object | will be replaced by the src-data.) |
+-----------------+-----------------------------------------------+
| src | (HTML-piggybacked) metadata of a 3D object |
| | which instances content |
+-----------------+-----------------------------------------------+
| href | (HTML-piggybacked) metadata of a 3D object |
| | which links to content |
+-----------------+-----------------------------------------------+
| filter | URI Fragment(s) which show/hide object(s) in |
| | a scene based on name/tag/property (#cube&- |
| | price=>3) |
+-----------------+-----------------------------------------------+
| visual-meta | visual-meta (https://visual.meta.info) data |
| | appended to text/books/papers which is |
| | indirectly visible/editable in XR. |
+-----------------+-----------------------------------------------+
| requestless | metadata which never spawns new requests |
| metadata | (unlike RDF/HTML, which can cause framerate- |
| | dropping, hence not used a lot in games) |
+-----------------+-----------------------------------------------+
| FPS | frames per second in spatial experiences |
| | (games,VR,AR e.g.), should be as high as |
| | possible |
+-----------------+-----------------------------------------------+
| introspective | inward sensemaking ("I feel this belongs to |
| | that") |
+-----------------+-----------------------------------------------+
| extrospective | outward sensemaking ("I'm fairly sure John is |
| | a person who lives in oklahoma") |
+-----------------+-----------------------------------------------+
| ◻ | ascii representation of an 3D object/mesh |
+-----------------+-----------------------------------------------+
| (un)obtrusive | obtrusive: wrapping human text/thought in |
| | XML/HTML/JSON obfuscates human text into a |
| | salad of machine-symbols and words |
+-----------------+-----------------------------------------------+
| flat 3D object | a 3D object of which all verticies share a |
| | human minority (academics/developers) |
+-----------------+---------------------------------------------+
| XR fragment | URI Fragment with spatial hints like |
| | #pos=0,0,0&t=1,100 e.g. |
+-----------------+---------------------------------------------+
| the XRWG | wordgraph (collapses 3D scene to tags) |
+-----------------+---------------------------------------------+
| the hashbus | hashtags map to camera/scene-projections |
+-----------------+---------------------------------------------+
| spacetime | positions camera, triggers scene-preset/ |
| hashtags | time |
+-----------------+---------------------------------------------+
| teleportation | repositioning the enduser to a different |
| | position (or 3D scene/file) |
+-----------------+---------------------------------------------+
| sourceportation | teleporting the enduser to the original XR |
| | Document of an src embedded object. |
+-----------------+---------------------------------------------+
| placeholder | a 3D object which with src-metadata (which |
| object | will be replaced by the src-data.) |
+-----------------+---------------------------------------------+
| src | (HTML-piggybacked) metadata of a 3D object |
| | which instances content |
+-----------------+---------------------------------------------+
| href | (HTML-piggybacked) metadata of a 3D object |
| | which links to content |
+-----------------+---------------------------------------------+
| filter | URI Fragment(s) which show/hide object(s) |
| | in a scene based on name/tag/property |
| | (#cube&-price=>3) |
+-----------------+---------------------------------------------+
| visual-meta | visual-meta (https://visual.meta.info) data |
| | appended to text/books/papers which is |
| | indirectly visible/editable in XR. |
+-----------------+---------------------------------------------+
| requestless | metadata which never spawns new requests |
| metadata | (unlike RDF/HTML, which can cause |
| | framerate-dropping, hence not used a lot in |
| | games) |
+-----------------+---------------------------------------------+
| FPS | frames per second in spatial experiences |
| | (games,VR,AR e.g.), should be as high as |
| | possible |
+-----------------+---------------------------------------------+
| introspective | inward sensemaking ("I feel this belongs to |
| | that") |
+-----------------+---------------------------------------------+
| extrospective | outward sensemaking ("I'm fairly sure John |
van Kammen Expires 8 June 2024 [Page 31]
van Kammen Expires 2 August 2024 [Page 32]
Internet-Draft XR Fragments December 2023
Internet-Draft XR Fragments January 2024
| | plane |
+-----------------+-----------------------------------------------+
| BibTeX | simple tagging/citing/referencing standard |
| | for plaintext |
+-----------------+-----------------------------------------------+
| BibTag | a BibTeX tag |
+-----------------+-----------------------------------------------+
| (hashtag)bibs | an easy to speak/type/scan tagging SDL (see |
| | here (https://github.com/coderofsalvation/ |
| | hashtagbibs) which expands to BibTex/JSON/XML |
+-----------------+-----------------------------------------------+
| | is a person who lives in oklahoma") |
+-----------------+---------------------------------------------+
| ◻ | ascii representation of an 3D object/mesh |
+-----------------+---------------------------------------------+
| (un)obtrusive | obtrusive: wrapping human text/thought in |
| | XML/HTML/JSON obfuscates human text into a |
| | salad of machine-symbols and words |
+-----------------+---------------------------------------------+
| flat 3D object | a 3D object of which all verticies share a |
| | plane |
+-----------------+---------------------------------------------+
| BibTeX | simple tagging/citing/referencing standard |
| | for plaintext |
+-----------------+---------------------------------------------+
| BibTag | a BibTeX tag |
+-----------------+---------------------------------------------+
| (hashtag)bibs | an easy to speak/type/scan tagging SDL (see |
| | here (https://github.com/coderofsalvation/ |
| | hashtagbibs) which expands to BibTex/JSON/ |
| | XML |
+-----------------+---------------------------------------------+
Table 13
@ -1779,14 +1845,4 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 32]
van Kammen Expires 2 August 2024 [Page 33]

View file

@ -10,7 +10,7 @@
<workgroup>Internet Engineering Task Force</workgroup>
<abstract>
<t>This draft is a specification for 4D URLs &amp; <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> navigation, which links together space, time &amp; text together, for hypermedia browsers with- or without a network-connection.<br />
<t>This draft is a specification for 4D URI's &amp; <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> navigation, which links together space, time &amp; text together, for hypermedia browsers with- or without a network-connection.<br />
The specification promotes spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br />
@ -30,22 +30,84 @@ Historically, there's many attempts to create the ultimate markuplanguage or 3D
The lowest common denominator is: designers describing/tagging/naming things using <strong>plain text</strong>.<br />
XR Fragments exploits the fact that all 3D models already contain such metadata:</t>
<t><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URLs</strong></t>
<t>Or more detailed:</t>
<t><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URI's</strong></t>
<t>It solves:</t>
<ol spacing="compact">
<li>addressibility and <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> navigation of 3D scenes/objects: <eref target="https://en.wikipedia.org/wiki/URI_fragment">URI Fragments</eref> + src/href spatial metadata</li>
<li>Interlinking (text)objects by collapsing space into a Word Graph (XRWG) to show <eref target="#visible-links">visible links</eref></li>
<li>Interlinking text &amp; spatial objects by collapsing space into a Word Graph (XRWG) to show <eref target="#visible-links">visible links</eref></li>
<li>unlocking spatial potential of the (originally 2D) hashtag (which jumps to a chapter) for navigating XR documents</li>
</ol>
<blockquote><t>NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible</t>
</blockquote></section>
<section anchor="core-principle"><name>Core principle</name>
<t><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URLs</strong></t>
<t><strong>XR Fragments allows controlling 3D models using URLs, based on (non)existing metadata via URI's</strong></t>
<t>XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br />
Instead of combining them (in a game-editor e.g.), XR Fragments <strong>integrates all</strong>, by collecting metadata into an XRWG and control it via URL:</t>
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 />
</t>
<artwork><![CDATA[ +───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ U R N │
│ U R L | │
│ | |-----------------+--------| │
│ +--------------------------------------------------| │
│ | │
│ + https://foo.com/some/foo/scene.glb#someview <-- http URI (=URL and has URN)
│ | │
│ + ipfs://cfe0987ec9r9098ecr/cats.fbx#someview <-- an IPFS URI (=URL and has URN)
│ │
│ ec09f7e9cf8e7f09c8e7f98e79c09ef89e000efece8f7ecfe9fe <-- an interpeer URI
│ │
│ │
│ |------------------------+-------------------------| │
│ | │
│ U R I │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
]]>
</artwork>
<t>Fact: our typical browser URL's are just <strong>a possible implementation</strong> of URI's (for untapped humancentric potential of URI's <eref target="https://interpeer.io">see interpeer.io</eref>)</t>
<blockquote><t>XR Fragments does not look at XR (or the web) thru the lens of HTML or URLs.<br />
But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective.</t>
</blockquote><t>Below you can see how this translates back into good-old URLs:</t>
<artwork><![CDATA[ +───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ─> ?other.glb ─> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ (hypermediatic) #material │ │
│ │ ( feedback ) #animation │ │
│ │ ( loop ) #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<─────────────+ │
│ │ │ │
│ └─ objects ──────────────>─────────────+ │
│ │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
]]>
</artwork>
<blockquote><t>?-linked and #-linked navigation allows a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.</t>
</blockquote><t>Traditional webbrowsers can become 4D document-ready by:</t>
<ul spacing="compact">
<li><eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).</li>
<li>allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).</li>
<li>collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus</li>
<li>completely bypasses the security-trap of loading external scripts (by loading 3D model-files, not HTML-javascriptable resources)</li>
</ul>
<t>XR Fragments itself are <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> and HTML-agnostic, though pseudo-XR Fragment browsers <strong>can</strong> be implemented on top of HTML/Javascript.</t>
<table>
<thead>
<tr>
@ -104,46 +166,13 @@ Instead of combining them (in a game-editor e.g.), XR Fragments <strong>integrat
<td>n/a</td>
</tr>
</tbody>
</table><blockquote><t>XR Fragments does not look at XR (or the web) thru the lens of HTML.<br />
But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective:</t>
</blockquote>
<artwork><![CDATA[ +──────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ──> ?misc ──> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ #material │ │
│ │ #animation │ │
│ │ #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<────────────+ │
│ │ │ │
│ └─ objects ──────────────>────────────+ │
│ │
│ │
+──────────────────────────────────────────────────────────────────────────────────────────────+
]]>
</artwork>
<t>Traditional webbrowsers can become 4D document-ready by:</t>
<ul spacing="compact">
<li><eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).</li>
<li>allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).</li>
<li>collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus</li>
</ul>
<t>XR Fragments itself are <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> and HTML-agnostic, though pseudo-XR Fragment browsers <strong>can</strong> be implemented on top of HTML/Javascript.</t>
</section>
</table></section>
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>
<t>See appendix below in case certain terms are not clear.</t>
<section anchor="xr-fragment-uri-grammar"><name>XR Fragment URI Grammar</name>
<section anchor="xr-fragment-url-grammar"><name>XR Fragment URL Grammar</name>
<t>For typical HTTP-like browsers/applications:</t>
<artwork><![CDATA[reserved = gen-delims / sub-delims
gen-delims = "#" / "&"
@ -171,7 +200,12 @@ sub-delims = "," / "="
</tr>
</tbody>
</table><blockquote><t>this is already implemented in all browsers</t>
</blockquote></section>
</blockquote><t>Pseudo (non-native) browser-implementations (supporting XR Fragments using HTML+JS e.g.) can use the <tt>?</tt> search-operator to address outbound content.<br />
In other words, the URL updates to: <tt>https://me.com?https://me.com/other.glb</tt> when navigating to <tt>https://me.com/other.glb</tt> from inside a <tt>https://me.com</tt> WebXR experience e.g.<br />
That way, if the link gets shared, the XR Fragments implementation at <tt>https://me.com</tt> can load the latter (and still indicates which XR Fragments entrypoint-experience/client was used).</t>
</section>
</section>
<section anchor="list-of-uri-fragments"><name>List of URI Fragments</name>
@ -1249,6 +1283,16 @@ Non-HTML Hypermedia browsers should make browser extensions the right place, to
<td>an object inside a scene characterized by vertex-, face- and customproperty data.</td>
</tr>
<tr>
<td>URI</td>
<td>some resource at something somewhere via someprotocol (<tt>http://me.com/foo.glb#foo</tt> or <tt>e76f8efec8efce98e6f</tt> <eref target="https://interpeer.io">see interpeer.io</eref>)</td>
</tr>
<tr>
<td>URL</td>
<td>something somewhere via someprotocol (<tt>http://me.com/foo.glb</tt>)</td>
</tr>
<tr>
<td>metadata</td>
<td>custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers)</td>

View file

@ -3,7 +3,7 @@
Internet Engineering Task Force L.R. van Kammen
Internet-Draft 6 December 2023
Internet-Draft 30 January 2024
Intended status: Informational
@ -38,11 +38,11 @@ Status of This Memo
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
This Internet-Draft will expire on 8 June 2024.
This Internet-Draft will expire on 2 August 2024.
Copyright Notice
Copyright (c) 2023 IETF Trust and the persons identified as the
Copyright (c) 2024 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
@ -53,9 +53,9 @@ Copyright Notice
van Kammen Expires 8 June 2024 [Page 1]
van Kammen Expires 2 August 2024 [Page 1]
Internet-Draft XR Macros December 2023
Internet-Draft XR Macros January 2024
extracted from this document must include Revised BSD License text as
@ -109,9 +109,9 @@ Table of Contents
van Kammen Expires 8 June 2024 [Page 2]
van Kammen Expires 2 August 2024 [Page 2]
Internet-Draft XR Macros December 2023
Internet-Draft XR Macros January 2024
3. Metadata-values can contain the | symbol to 🎲 roundrobin variable
@ -165,9 +165,9 @@ Internet-Draft XR Macros December 2023
van Kammen Expires 8 June 2024 [Page 3]
van Kammen Expires 2 August 2024 [Page 3]
Internet-Draft XR Macros December 2023
Internet-Draft XR Macros January 2024
+=========+======+===================+=================+=============+
@ -221,9 +221,9 @@ Internet-Draft XR Macros December 2023
van Kammen Expires 8 June 2024 [Page 4]
van Kammen Expires 2 August 2024 [Page 4]
Internet-Draft XR Macros December 2023
Internet-Draft XR Macros January 2024
Table 3
@ -277,9 +277,9 @@ Internet-Draft XR Macros December 2023
van Kammen Expires 8 June 2024 [Page 5]
van Kammen Expires 2 August 2024 [Page 5]
Internet-Draft XR Macros December 2023
Internet-Draft XR Macros January 2024
4.5. Usecase: present context menu with options
@ -333,9 +333,9 @@ click object with (`!clickme`:`!foo|!bar|!flop` e.g.)
van Kammen Expires 8 June 2024 [Page 6]
van Kammen Expires 2 August 2024 [Page 6]
Internet-Draft XR Macros December 2023
Internet-Draft XR Macros January 2024
| Note that only macro's can trigger roundrobin values or
@ -389,4 +389,4 @@ Internet-Draft XR Macros December 2023
van Kammen Expires 8 June 2024 [Page 7]
van Kammen Expires 2 August 2024 [Page 7]

View file

@ -4,6 +4,17 @@ window.AFRAME.registerComponent('xrf', {
https: { type:'string'},
},
init: function () {
// override this.data when URL has passed (`://....com/?https://foo.com/index.glb` e.g.)
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
if( !AFRAME.XRF ){
let camera = document.querySelector('[camera]')
@ -130,15 +141,6 @@ window.AFRAME.registerComponent('xrf', {
aScene.setAttribute('xrf-gaze','')
}
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
},
})

View file

@ -37,7 +37,7 @@ window.AFRAME.registerComponent('xrf-get', {
mesh.scale.copy(world.scale)
mesh.setRotationFromQuaternion(world.quat);
}else{
// add() will reparent the mesh so lets create a dummy
// lets create a dummy add function so that the mesh won't get reparented
this.el.object3D.add = (a) => a
}
this.el.setObject3D('mesh',mesh)
@ -49,6 +49,10 @@ window.AFRAME.registerComponent('xrf-get', {
this.el.emit("update",{timeout:0})
AFRAME.XRF.addEventListener('reset', () => {
this.el.remove()
})
}
});

View file

@ -50,10 +50,12 @@ xrf.patchLoader = function(loader){
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
// parseModel event is essential for src.js to hook into embedded loaded models
xrf.parseModel = function(model,url){
let file = xrf.getFile(url)
model.file = file
model.isXRF = true
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
xrf.emit('parseModel',{model,url,file})
}
@ -79,7 +81,7 @@ xrf.reset = () => {
xrf.add( xrf.interactive )
xrf.layers = 0
// reset certain events
// allow others to reset certain events
xrf.emit('reset',{})
// remove mixers
xrf.mixers.map( (m) => m.stop())

View file

@ -72,9 +72,8 @@ xrf.navigator.to = (url,flags,loader,data) => {
}
if( data ){ // file upload
console.dir(loader)
loader.parse(data, "", onLoad )
}else loader.load(url, onLoad )
}else loader.load(url, onLoad )
})
})
})

View file

@ -72,7 +72,7 @@ xrf.filter.process = function(frag,scene,opts){
let obj
frag.target = firstFilter
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if( xrf.debug ) console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if(obj ){
obj.position.set(0,0,0)
if( opts.copyScene ) {

View file

@ -3,7 +3,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
scene.traverse( (n) => {
if( n.userData && n.userData['#'] ){
let frag = xrf.URI.parse( n.userData['#'] )
if( n.parent && n.parent.parent.isScene && document.location.hash.length < 2 ){
if( !n.parent && document.location.hash.length < 2){
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
}else{
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments

View file

@ -56,7 +56,7 @@ xrf.frag.src.enableSourcePortation = (src) => {
mat.metalness = 1
mat.opacity = 0
const cube = new THREE.Mesh( geo, mat )
console.log("todo: sourceportate")
// *TODO* sourceportate?
return xrf.frag.src
}

View file

@ -93,7 +93,7 @@ xrf.portalNonEuclidian = function(opts){
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
cam.getWorldPosition(cameraPosition)
cam.getWorldDirection(cameraDirection)
if( cameraPosition.distanceTo(newPos) > 20.0 ) return // dont render far portals
if( cameraPosition.distanceTo(newPos) > 10.0 ) return // dont render far portals
// init
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true

View file

@ -37,7 +37,7 @@ xrf.addEventListener('parseModel', (opts) => {
model.animations.map( (anim) => {
anim.optimize()
console.log("action: "+anim.name)
if( xrf.debug ) console.log("action: "+anim.name)
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
})