fix url navigation
This commit is contained in:
parent
9df7685253
commit
ae7225d4ba
20 changed files with 12934 additions and 538 deletions
14
.github/workflows/website.yml
vendored
14
.github/workflows/website.yml
vendored
|
|
@ -4,7 +4,7 @@ name: Deploy static content to Pages
|
||||||
on:
|
on:
|
||||||
# Runs on pushes targeting the default branch
|
# Runs on pushes targeting the default branch
|
||||||
push:
|
push:
|
||||||
branches: ["main","feat/multiparty"]
|
branches: ["main"] # ["main","feat/multiparty"]
|
||||||
|
|
||||||
# Allows you to run this workflow manually from the Actions tab
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
@ -31,11 +31,11 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- name: Checkout feat/multiparty
|
#- name: Checkout feat/multiparty
|
||||||
uses: actions/checkout@v3
|
# uses: actions/checkout@v3
|
||||||
with:
|
# with:
|
||||||
ref: feat/multiparty
|
# ref: feat/multiparty
|
||||||
path: feat/multiparty
|
# path: feat/multiparty
|
||||||
- name: Setup Pages
|
- name: Setup Pages
|
||||||
uses: actions/configure-pages@v3
|
uses: actions/configure-pages@v3
|
||||||
- name: create index.gltf
|
- name: create index.gltf
|
||||||
|
|
@ -44,7 +44,7 @@ jobs:
|
||||||
run: cp example/assets/*.{gltf,glb} .
|
run: cp example/assets/*.{gltf,glb} .
|
||||||
# working-directory: ./
|
# working-directory: ./
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-pages-artifact@v1
|
uses: actions/upload-pages-artifact@v3
|
||||||
with:
|
with:
|
||||||
path: '.'
|
path: '.'
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
|
|
|
||||||
45
dist/xrfragment.aframe.all.js
vendored
45
dist/xrfragment.aframe.all.js
vendored
|
|
@ -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
|
* https://xrfragment.org
|
||||||
* SPDX-License-Identifier: MPL-2.0
|
* SPDX-License-Identifier: MPL-2.0
|
||||||
*/
|
*/
|
||||||
|
|
@ -903,10 +903,12 @@ xrf.patchLoader = function(loader){
|
||||||
|
|
||||||
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
|
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){
|
xrf.parseModel = function(model,url){
|
||||||
let file = xrf.getFile(url)
|
let file = xrf.getFile(url)
|
||||||
model.file = file
|
model.file = file
|
||||||
|
model.isXRF = true
|
||||||
|
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
|
||||||
xrf.emit('parseModel',{model,url,file})
|
xrf.emit('parseModel',{model,url,file})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -932,7 +934,7 @@ xrf.reset = () => {
|
||||||
xrf.add( xrf.interactive )
|
xrf.add( xrf.interactive )
|
||||||
xrf.layers = 0
|
xrf.layers = 0
|
||||||
|
|
||||||
// reset certain events
|
// allow others to reset certain events
|
||||||
xrf.emit('reset',{})
|
xrf.emit('reset',{})
|
||||||
// remove mixers
|
// remove mixers
|
||||||
xrf.mixers.map( (m) => m.stop())
|
xrf.mixers.map( (m) => m.stop())
|
||||||
|
|
@ -1043,7 +1045,6 @@ xrf.navigator.to = (url,flags,loader,data) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
if( data ){ // file upload
|
if( data ){ // file upload
|
||||||
console.dir(loader)
|
|
||||||
loader.parse(data, "", onLoad )
|
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.metalness = 1
|
||||||
mat.opacity = 0
|
mat.opacity = 0
|
||||||
const cube = new THREE.Mesh( geo, mat )
|
const cube = new THREE.Mesh( geo, mat )
|
||||||
console.log("todo: sourceportate")
|
// *TODO* sourceportate?
|
||||||
return xrf.frag.src
|
return xrf.frag.src
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1473,7 +1474,7 @@ xrf.addEventListener('parseModel', (opts) => {
|
||||||
|
|
||||||
model.animations.map( (anim) => {
|
model.animations.map( (anim) => {
|
||||||
anim.optimize()
|
anim.optimize()
|
||||||
console.log("action: "+anim.name)
|
if( xrf.debug ) console.log("action: "+anim.name)
|
||||||
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
|
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -1825,7 +1826,7 @@ xrf.filter.process = function(frag,scene,opts){
|
||||||
let obj
|
let obj
|
||||||
frag.target = firstFilter
|
frag.target = firstFilter
|
||||||
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
|
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 ){
|
if(obj ){
|
||||||
obj.position.set(0,0,0)
|
obj.position.set(0,0,0)
|
||||||
if( opts.copyScene ) {
|
if( opts.copyScene ) {
|
||||||
|
|
@ -1883,7 +1884,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
|
||||||
scene.traverse( (n) => {
|
scene.traverse( (n) => {
|
||||||
if( n.userData && n.userData['#'] ){
|
if( n.userData && n.userData['#'] ){
|
||||||
let frag = xrf.URI.parse( 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
|
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
|
||||||
}else{
|
}else{
|
||||||
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
|
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
|
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
|
||||||
cam.getWorldPosition(cameraPosition)
|
cam.getWorldPosition(cameraPosition)
|
||||||
cam.getWorldDirection(cameraDirection)
|
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
|
// init
|
||||||
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
|
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
|
||||||
|
|
@ -2406,6 +2407,17 @@ window.AFRAME.registerComponent('xrf', {
|
||||||
https: { type:'string'},
|
https: { type:'string'},
|
||||||
},
|
},
|
||||||
init: function () {
|
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 ){
|
if( !AFRAME.XRF ){
|
||||||
|
|
||||||
let camera = document.querySelector('[camera]')
|
let camera = document.querySelector('[camera]')
|
||||||
|
|
@ -2532,15 +2544,6 @@ window.AFRAME.registerComponent('xrf', {
|
||||||
aScene.setAttribute('xrf-gaze','')
|
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.scale.copy(world.scale)
|
||||||
mesh.setRotationFromQuaternion(world.quat);
|
mesh.setRotationFromQuaternion(world.quat);
|
||||||
}else{
|
}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.object3D.add = (a) => a
|
||||||
}
|
}
|
||||||
this.el.setObject3D('mesh',mesh)
|
this.el.setObject3D('mesh',mesh)
|
||||||
|
|
@ -2833,6 +2836,10 @@ window.AFRAME.registerComponent('xrf-get', {
|
||||||
|
|
||||||
this.el.emit("update",{timeout:0})
|
this.el.emit("update",{timeout:0})
|
||||||
|
|
||||||
|
AFRAME.XRF.addEventListener('reset', () => {
|
||||||
|
this.el.remove()
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
45
dist/xrfragment.aframe.js
vendored
45
dist/xrfragment.aframe.js
vendored
|
|
@ -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
|
* https://xrfragment.org
|
||||||
* SPDX-License-Identifier: MPL-2.0
|
* SPDX-License-Identifier: MPL-2.0
|
||||||
*/
|
*/
|
||||||
|
|
@ -901,10 +901,12 @@ xrf.patchLoader = function(loader){
|
||||||
|
|
||||||
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
|
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){
|
xrf.parseModel = function(model,url){
|
||||||
let file = xrf.getFile(url)
|
let file = xrf.getFile(url)
|
||||||
model.file = file
|
model.file = file
|
||||||
|
model.isXRF = true
|
||||||
|
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
|
||||||
xrf.emit('parseModel',{model,url,file})
|
xrf.emit('parseModel',{model,url,file})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -930,7 +932,7 @@ xrf.reset = () => {
|
||||||
xrf.add( xrf.interactive )
|
xrf.add( xrf.interactive )
|
||||||
xrf.layers = 0
|
xrf.layers = 0
|
||||||
|
|
||||||
// reset certain events
|
// allow others to reset certain events
|
||||||
xrf.emit('reset',{})
|
xrf.emit('reset',{})
|
||||||
// remove mixers
|
// remove mixers
|
||||||
xrf.mixers.map( (m) => m.stop())
|
xrf.mixers.map( (m) => m.stop())
|
||||||
|
|
@ -1041,7 +1043,6 @@ xrf.navigator.to = (url,flags,loader,data) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
if( data ){ // file upload
|
if( data ){ // file upload
|
||||||
console.dir(loader)
|
|
||||||
loader.parse(data, "", onLoad )
|
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.metalness = 1
|
||||||
mat.opacity = 0
|
mat.opacity = 0
|
||||||
const cube = new THREE.Mesh( geo, mat )
|
const cube = new THREE.Mesh( geo, mat )
|
||||||
console.log("todo: sourceportate")
|
// *TODO* sourceportate?
|
||||||
return xrf.frag.src
|
return xrf.frag.src
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1471,7 +1472,7 @@ xrf.addEventListener('parseModel', (opts) => {
|
||||||
|
|
||||||
model.animations.map( (anim) => {
|
model.animations.map( (anim) => {
|
||||||
anim.optimize()
|
anim.optimize()
|
||||||
console.log("action: "+anim.name)
|
if( xrf.debug ) console.log("action: "+anim.name)
|
||||||
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
|
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -1823,7 +1824,7 @@ xrf.filter.process = function(frag,scene,opts){
|
||||||
let obj
|
let obj
|
||||||
frag.target = firstFilter
|
frag.target = firstFilter
|
||||||
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
|
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 ){
|
if(obj ){
|
||||||
obj.position.set(0,0,0)
|
obj.position.set(0,0,0)
|
||||||
if( opts.copyScene ) {
|
if( opts.copyScene ) {
|
||||||
|
|
@ -1881,7 +1882,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
|
||||||
scene.traverse( (n) => {
|
scene.traverse( (n) => {
|
||||||
if( n.userData && n.userData['#'] ){
|
if( n.userData && n.userData['#'] ){
|
||||||
let frag = xrf.URI.parse( 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
|
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
|
||||||
}else{
|
}else{
|
||||||
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
|
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
|
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
|
||||||
cam.getWorldPosition(cameraPosition)
|
cam.getWorldPosition(cameraPosition)
|
||||||
cam.getWorldDirection(cameraDirection)
|
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
|
// init
|
||||||
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
|
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
|
||||||
|
|
@ -2404,6 +2405,17 @@ window.AFRAME.registerComponent('xrf', {
|
||||||
https: { type:'string'},
|
https: { type:'string'},
|
||||||
},
|
},
|
||||||
init: function () {
|
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 ){
|
if( !AFRAME.XRF ){
|
||||||
|
|
||||||
let camera = document.querySelector('[camera]')
|
let camera = document.querySelector('[camera]')
|
||||||
|
|
@ -2530,15 +2542,6 @@ window.AFRAME.registerComponent('xrf', {
|
||||||
aScene.setAttribute('xrf-gaze','')
|
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.scale.copy(world.scale)
|
||||||
mesh.setRotationFromQuaternion(world.quat);
|
mesh.setRotationFromQuaternion(world.quat);
|
||||||
}else{
|
}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.object3D.add = (a) => a
|
||||||
}
|
}
|
||||||
this.el.setObject3D('mesh',mesh)
|
this.el.setObject3D('mesh',mesh)
|
||||||
|
|
@ -2831,6 +2834,10 @@ window.AFRAME.registerComponent('xrf-get', {
|
||||||
|
|
||||||
this.el.emit("update",{timeout:0})
|
this.el.emit("update",{timeout:0})
|
||||||
|
|
||||||
|
AFRAME.XRF.addEventListener('reset', () => {
|
||||||
|
this.el.remove()
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
12188
dist/xrfragment.module.js
vendored
12188
dist/xrfragment.module.js
vendored
File diff suppressed because it is too large
Load diff
19
dist/xrfragment.three.js
vendored
19
dist/xrfragment.three.js
vendored
|
|
@ -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
|
* https://xrfragment.org
|
||||||
* SPDX-License-Identifier: MPL-2.0
|
* SPDX-License-Identifier: MPL-2.0
|
||||||
*/
|
*/
|
||||||
|
|
@ -901,10 +901,12 @@ xrf.patchLoader = function(loader){
|
||||||
|
|
||||||
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
|
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){
|
xrf.parseModel = function(model,url){
|
||||||
let file = xrf.getFile(url)
|
let file = xrf.getFile(url)
|
||||||
model.file = file
|
model.file = file
|
||||||
|
model.isXRF = true
|
||||||
|
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
|
||||||
xrf.emit('parseModel',{model,url,file})
|
xrf.emit('parseModel',{model,url,file})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -930,7 +932,7 @@ xrf.reset = () => {
|
||||||
xrf.add( xrf.interactive )
|
xrf.add( xrf.interactive )
|
||||||
xrf.layers = 0
|
xrf.layers = 0
|
||||||
|
|
||||||
// reset certain events
|
// allow others to reset certain events
|
||||||
xrf.emit('reset',{})
|
xrf.emit('reset',{})
|
||||||
// remove mixers
|
// remove mixers
|
||||||
xrf.mixers.map( (m) => m.stop())
|
xrf.mixers.map( (m) => m.stop())
|
||||||
|
|
@ -1041,7 +1043,6 @@ xrf.navigator.to = (url,flags,loader,data) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
if( data ){ // file upload
|
if( data ){ // file upload
|
||||||
console.dir(loader)
|
|
||||||
loader.parse(data, "", onLoad )
|
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.metalness = 1
|
||||||
mat.opacity = 0
|
mat.opacity = 0
|
||||||
const cube = new THREE.Mesh( geo, mat )
|
const cube = new THREE.Mesh( geo, mat )
|
||||||
console.log("todo: sourceportate")
|
// *TODO* sourceportate?
|
||||||
return xrf.frag.src
|
return xrf.frag.src
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1471,7 +1472,7 @@ xrf.addEventListener('parseModel', (opts) => {
|
||||||
|
|
||||||
model.animations.map( (anim) => {
|
model.animations.map( (anim) => {
|
||||||
anim.optimize()
|
anim.optimize()
|
||||||
console.log("action: "+anim.name)
|
if( xrf.debug ) console.log("action: "+anim.name)
|
||||||
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
|
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -1823,7 +1824,7 @@ xrf.filter.process = function(frag,scene,opts){
|
||||||
let obj
|
let obj
|
||||||
frag.target = firstFilter
|
frag.target = firstFilter
|
||||||
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
|
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 ){
|
if(obj ){
|
||||||
obj.position.set(0,0,0)
|
obj.position.set(0,0,0)
|
||||||
if( opts.copyScene ) {
|
if( opts.copyScene ) {
|
||||||
|
|
@ -1881,7 +1882,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
|
||||||
scene.traverse( (n) => {
|
scene.traverse( (n) => {
|
||||||
if( n.userData && n.userData['#'] ){
|
if( n.userData && n.userData['#'] ){
|
||||||
let frag = xrf.URI.parse( 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
|
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
|
||||||
}else{
|
}else{
|
||||||
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
|
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
|
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
|
||||||
cam.getWorldPosition(cameraPosition)
|
cam.getWorldPosition(cameraPosition)
|
||||||
cam.getWorldDirection(cameraDirection)
|
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
|
// init
|
||||||
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
|
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
|
||||||
|
|
|
||||||
19
dist/xrfragment.three.module.js
vendored
19
dist/xrfragment.three.module.js
vendored
|
|
@ -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
|
* https://xrfragment.org
|
||||||
* SPDX-License-Identifier: MPL-2.0
|
* SPDX-License-Identifier: MPL-2.0
|
||||||
*/
|
*/
|
||||||
|
|
@ -901,10 +901,12 @@ xrf.patchLoader = function(loader){
|
||||||
|
|
||||||
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
|
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){
|
xrf.parseModel = function(model,url){
|
||||||
let file = xrf.getFile(url)
|
let file = xrf.getFile(url)
|
||||||
model.file = file
|
model.file = file
|
||||||
|
model.isXRF = true
|
||||||
|
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
|
||||||
xrf.emit('parseModel',{model,url,file})
|
xrf.emit('parseModel',{model,url,file})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -930,7 +932,7 @@ xrf.reset = () => {
|
||||||
xrf.add( xrf.interactive )
|
xrf.add( xrf.interactive )
|
||||||
xrf.layers = 0
|
xrf.layers = 0
|
||||||
|
|
||||||
// reset certain events
|
// allow others to reset certain events
|
||||||
xrf.emit('reset',{})
|
xrf.emit('reset',{})
|
||||||
// remove mixers
|
// remove mixers
|
||||||
xrf.mixers.map( (m) => m.stop())
|
xrf.mixers.map( (m) => m.stop())
|
||||||
|
|
@ -1041,7 +1043,6 @@ xrf.navigator.to = (url,flags,loader,data) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
if( data ){ // file upload
|
if( data ){ // file upload
|
||||||
console.dir(loader)
|
|
||||||
loader.parse(data, "", onLoad )
|
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.metalness = 1
|
||||||
mat.opacity = 0
|
mat.opacity = 0
|
||||||
const cube = new THREE.Mesh( geo, mat )
|
const cube = new THREE.Mesh( geo, mat )
|
||||||
console.log("todo: sourceportate")
|
// *TODO* sourceportate?
|
||||||
return xrf.frag.src
|
return xrf.frag.src
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1471,7 +1472,7 @@ xrf.addEventListener('parseModel', (opts) => {
|
||||||
|
|
||||||
model.animations.map( (anim) => {
|
model.animations.map( (anim) => {
|
||||||
anim.optimize()
|
anim.optimize()
|
||||||
console.log("action: "+anim.name)
|
if( xrf.debug ) console.log("action: "+anim.name)
|
||||||
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
|
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -1823,7 +1824,7 @@ xrf.filter.process = function(frag,scene,opts){
|
||||||
let obj
|
let obj
|
||||||
frag.target = firstFilter
|
frag.target = firstFilter
|
||||||
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
|
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 ){
|
if(obj ){
|
||||||
obj.position.set(0,0,0)
|
obj.position.set(0,0,0)
|
||||||
if( opts.copyScene ) {
|
if( opts.copyScene ) {
|
||||||
|
|
@ -1881,7 +1882,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
|
||||||
scene.traverse( (n) => {
|
scene.traverse( (n) => {
|
||||||
if( n.userData && n.userData['#'] ){
|
if( n.userData && n.userData['#'] ){
|
||||||
let frag = xrf.URI.parse( 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
|
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
|
||||||
}else{
|
}else{
|
||||||
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
|
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
|
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
|
||||||
cam.getWorldPosition(cameraPosition)
|
cam.getWorldPosition(cameraPosition)
|
||||||
cam.getWorldDirection(cameraDirection)
|
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
|
// init
|
||||||
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
|
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ value: draft-XRFRAGMENTS-leonvankammen-00
|
||||||
|
|
||||||
<h1 class="special" id="abstract">Abstract</h1>
|
<h1 class="special" id="abstract">Abstract</h1>
|
||||||
|
|
||||||
<p>This draft is a specification for 4D URLs & <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> navigation, which links together space, time & text together, for hypermedia browsers with- or without a network-connection.<br>
|
<p>This draft is a specification for 4D URI’s & <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> 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>
|
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>
|
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’s many attempts to create the ultimate markuplanguage
|
||||||
The lowest common denominator is: designers describing/tagging/naming things using <strong>plain text</strong>.<br>
|
The lowest common denominator is: designers describing/tagging/naming things using <strong>plain text</strong>.<br>
|
||||||
XR Fragments exploits the fact that all 3D models already contain such metadata:</p>
|
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’s</strong></p>
|
||||||
|
|
||||||
<p>Or more detailed:</p>
|
<p>It solves:</p>
|
||||||
|
|
||||||
<ol>
|
<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>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 & 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>
|
<li>unlocking spatial potential of the (originally 2D) hashtag (which jumps to a chapter) for navigating XR documents</li>
|
||||||
</ol>
|
</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>
|
<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’s</strong></p>
|
||||||
|
|
||||||
<p>XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br>
|
<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 <-- 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 │
|
||||||
|
│ │
|
||||||
|
+───────────────────────────────────────────────────────────────────────────────────────────────+
|
||||||
|
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>Fact: our typical browser URL’s are just <strong>a possible implementation</strong> of URI’s (for untapped humancentric potential of URI’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 ─> ?other.glb ─> #view ───> hashbus │
|
||||||
|
│ │ #filter │ │
|
||||||
|
│ │ #tag │ │
|
||||||
|
│ │ (hypermediatic) #material │ │
|
||||||
|
│ │ ( feedback ) #animation │ │
|
||||||
|
│ │ ( loop ) #texture │ │
|
||||||
|
│ │ #variable │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ XRWG <─────────────────────<─────────────+ │
|
||||||
|
│ │ │ │
|
||||||
|
│ └─ objects ──────────────>─────────────+ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
+───────────────────────────────────────────────────────────────────────────────────────────────+
|
||||||
|
|
||||||
|
</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>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
|
|
@ -176,48 +244,13 @@ Instead of combining them (in a game-editor e.g.), XR Fragments <strong>integrat
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</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 ──> ?misc ──> #view ───> hashbus │
|
|
||||||
│ │ #filter │ │
|
|
||||||
│ │ #tag │ │
|
|
||||||
│ │ #material │ │
|
|
||||||
│ │ #animation │ │
|
|
||||||
│ │ #texture │ │
|
|
||||||
│ │ #variable │ │
|
|
||||||
│ │ │ │
|
|
||||||
│ XRWG <─────────────────────<────────────+ │
|
|
||||||
│ │ │ │
|
|
||||||
│ └─ objects ──────────────>────────────+ │
|
|
||||||
│ │
|
|
||||||
│ │
|
|
||||||
+──────────────────────────────────────────────────────────────────────────────────────────────+
|
|
||||||
|
|
||||||
</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>
|
<h1 id="conventions-and-definitions">Conventions and Definitions</h1>
|
||||||
|
|
||||||
<p>See appendix below in case certain terms are not clear.</p>
|
<p>See appendix below in case certain terms are not clear.</p>
|
||||||
|
|
||||||
<h2 id="xr-fragment-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
|
<pre><code>reserved = gen-delims / sub-delims
|
||||||
gen-delims = "#" / "&"
|
gen-delims = "#" / "&"
|
||||||
|
|
@ -253,6 +286,10 @@ sub-delims = "," / "="
|
||||||
<p>this is already implemented in all browsers</p>
|
<p>this is already implemented in all browsers</p>
|
||||||
</blockquote>
|
</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>
|
<h1 id="list-of-uri-fragments">List of URI Fragments</h1>
|
||||||
|
|
||||||
<table>
|
<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>
|
<td>an object inside a scene characterized by vertex-, face- and customproperty data.</td>
|
||||||
</tr>
|
</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>
|
<tr>
|
||||||
<td>metadata</td>
|
<td>metadata</td>
|
||||||
<td>custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers)</td>
|
<td>custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers)</td>
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ value: draft-XRFRAGMENTS-leonvankammen-00
|
||||||
|
|
||||||
.# Abstract
|
.# 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>
|
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).
|
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>
|
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 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. 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
|
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
|
> NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible
|
||||||
|
|
||||||
# Core principle
|
# 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>
|
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 |
|
| 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 | draws visible connection(s) for XRWG 'tag' | n/a |
|
||||||
| href metadata | filters certain (in)visible objects | 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
|
# Conventions and Definitions
|
||||||
|
|
||||||
See appendix below in case certain terms are not clear.
|
See appendix below in case certain terms are not clear.
|
||||||
|
|
||||||
## XR Fragment URI Grammar
|
## XR Fragment URL Grammar
|
||||||
|
|
||||||
|
For typical HTTP-like browsers/applications:
|
||||||
|
|
||||||
```
|
```
|
||||||
reserved = gen-delims / sub-delims
|
reserved = gen-delims / sub-delims
|
||||||
|
|
@ -191,6 +223,10 @@ sub-delims = "," / "="
|
||||||
|
|
||||||
> this is already implemented in all browsers
|
> 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
|
# List of URI Fragments
|
||||||
|
|
||||||
| fragment | type | example | info |
|
| 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) |
|
|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.) |
|
|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. |
|
|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) |
|
|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. |
|
|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 XRWG | wordgraph (collapses 3D scene to tags) |
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
|
|
||||||
Internet Engineering Task Force L.R. van Kammen
|
Internet Engineering Task Force L.R. van Kammen
|
||||||
Internet-Draft 6 December 2023
|
Internet-Draft 30 January 2024
|
||||||
Intended status: Informational
|
Intended status: Informational
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -13,7 +13,7 @@ Intended status: Informational
|
||||||
|
|
||||||
Abstract
|
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
|
(https://github.com/coderofsalvation/hypermediatic) navigation, which
|
||||||
links together space, time & text together, for hypermedia browsers
|
links together space, time & text together, for hypermedia browsers
|
||||||
with- or without a network-connection.
|
with- or without a network-connection.
|
||||||
|
|
@ -41,11 +41,11 @@ Status of This Memo
|
||||||
time. It is inappropriate to use Internet-Drafts as reference
|
time. It is inappropriate to use Internet-Drafts as reference
|
||||||
material or to cite them other than as "work in progress."
|
material or to cite them other than as "work in progress."
|
||||||
|
|
||||||
This Internet-Draft will expire on 8 June 2024.
|
This Internet-Draft will expire on 2 August 2024.
|
||||||
|
|
||||||
Copyright Notice
|
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.
|
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
|
This document is subject to BCP 78 and the IETF Trust's Legal
|
||||||
|
|
@ -71,47 +71,47 @@ Table of Contents
|
||||||
|
|
||||||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
|
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
|
||||||
2. Core principle . . . . . . . . . . . . . . . . . . . . . . . 3
|
2. Core principle . . . . . . . . . . . . . . . . . . . . . . . 3
|
||||||
3. Conventions and Definitions . . . . . . . . . . . . . . . . . 5
|
3. Conventions and Definitions . . . . . . . . . . . . . . . . . 6
|
||||||
3.1. XR Fragment URI Grammar . . . . . . . . . . . . . . . . . 5
|
3.1. XR Fragment URL Grammar . . . . . . . . . . . . . . . . . 6
|
||||||
4. List of URI Fragments . . . . . . . . . . . . . . . . . . . . 6
|
4. List of URI Fragments . . . . . . . . . . . . . . . . . . . . 7
|
||||||
4.1. List of metadata for 3D nodes . . . . . . . . . . . . . . 6
|
4.1. List of metadata for 3D nodes . . . . . . . . . . . . . . 8
|
||||||
4.2. vector datatypes . . . . . . . . . . . . . . . . . . . . 7
|
4.2. vector datatypes . . . . . . . . . . . . . . . . . . . . 8
|
||||||
4.3. Dynamic XR Fragments (+databindings) . . . . . . . . . . 7
|
4.3. Dynamic XR Fragments (+databindings) . . . . . . . . . . 9
|
||||||
5. Spatial Referencing 3D . . . . . . . . . . . . . . . . . . . 8
|
5. Spatial Referencing 3D . . . . . . . . . . . . . . . . . . . 10
|
||||||
6. Navigating 3D . . . . . . . . . . . . . . . . . . . . . . . . 9
|
6. Navigating 3D . . . . . . . . . . . . . . . . . . . . . . . . 10
|
||||||
7. Top-level URL processing . . . . . . . . . . . . . . . . . . 10
|
7. Top-level URL processing . . . . . . . . . . . . . . . . . . 12
|
||||||
8. Embedding XR content using src . . . . . . . . . . . . . . . 11
|
8. Embedding XR content using src . . . . . . . . . . . . . . . 12
|
||||||
9. Navigating content href portals . . . . . . . . . . . . . . . 13
|
9. Navigating content href portals . . . . . . . . . . . . . . . 14
|
||||||
9.1. Walking surfaces . . . . . . . . . . . . . . . . . . . . 15
|
9.1. Walking surfaces . . . . . . . . . . . . . . . . . . . . 16
|
||||||
9.2. UX spec . . . . . . . . . . . . . . . . . . . . . . . . . 15
|
9.2. UX spec . . . . . . . . . . . . . . . . . . . . . . . . . 16
|
||||||
9.3. Scaling instanced content . . . . . . . . . . . . . . . . 15
|
9.3. Scaling instanced content . . . . . . . . . . . . . . . . 16
|
||||||
10. XR Fragment: pos . . . . . . . . . . . . . . . . . . . . . . 16
|
10. XR Fragment: pos . . . . . . . . . . . . . . . . . . . . . . 17
|
||||||
11. XR Fragment: rot . . . . . . . . . . . . . . . . . . . . . . 16
|
11. XR Fragment: rot . . . . . . . . . . . . . . . . . . . . . . 17
|
||||||
12. XR Fragment: t . . . . . . . . . . . . . . . . . . . . . . . 16
|
12. XR Fragment: t . . . . . . . . . . . . . . . . . . . . . . . 17
|
||||||
13. XR audio/video integration . . . . . . . . . . . . . . . . . 17
|
13. XR audio/video integration . . . . . . . . . . . . . . . . . 18
|
||||||
14. XR Fragment filters . . . . . . . . . . . . . . . . . . . . . 17
|
14. XR Fragment filters . . . . . . . . . . . . . . . . . . . . . 18
|
||||||
14.1. including/excluding . . . . . . . . . . . . . . . . . . 18
|
14.1. including/excluding . . . . . . . . . . . . . . . . . . 19
|
||||||
14.2. Filter Parser . . . . . . . . . . . . . . . . . . . . . 18
|
14.2. Filter Parser . . . . . . . . . . . . . . . . . . . . . 19
|
||||||
15. Visible links . . . . . . . . . . . . . . . . . . . . . . . . 19
|
15. Visible links . . . . . . . . . . . . . . . . . . . . . . . . 20
|
||||||
16. Text in XR (tagging,linking to spatial objects) . . . . . . . 19
|
16. Text in XR (tagging,linking to spatial objects) . . . . . . . 20
|
||||||
16.1. Default Data URI mimetype . . . . . . . . . . . . . . . 23
|
16.1. Default Data URI mimetype . . . . . . . . . . . . . . . 24
|
||||||
16.2. URL and Data URI . . . . . . . . . . . . . . . . . . . . 24
|
16.2. URL and Data URI . . . . . . . . . . . . . . . . . . . . 25
|
||||||
16.3. XR Text example parser . . . . . . . . . . . . . . . . . 25
|
16.3. XR Text example parser . . . . . . . . . . . . . . . . . 26
|
||||||
17. Transclusion (broken link) resolution . . . . . . . . . . . . 27
|
17. Transclusion (broken link) resolution . . . . . . . . . . . . 28
|
||||||
18. Topic-based index-less Webrings . . . . . . . . . . . . . . . 28
|
18. Topic-based index-less Webrings . . . . . . . . . . . . . . . 29
|
||||||
19. Security Considerations . . . . . . . . . . . . . . . . . . . 29
|
19. Security Considerations . . . . . . . . . . . . . . . . . . . 30
|
||||||
20. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
|
20. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
|
||||||
21. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 30
|
21. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 31
|
||||||
22. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 30
|
22. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 31
|
||||||
23. Appendix: Definitions . . . . . . . . . . . . . . . . . . . . 30
|
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
|
1. Introduction
|
||||||
|
|
@ -126,16 +126,16 @@ Internet-Draft XR Fragments December 2023
|
||||||
such metadata:
|
such metadata:
|
||||||
|
|
||||||
*XR Fragments allows controlling of metadata in 3D scene(files) using
|
*XR Fragments allows controlling of metadata in 3D scene(files) using
|
||||||
URLs*
|
URI's*
|
||||||
|
|
||||||
Or more detailed:
|
It solves:
|
||||||
|
|
||||||
1. addressibility and hypermediatic
|
1. addressibility and hypermediatic
|
||||||
(https://github.com/coderofsalvation/hypermediatic) navigation of
|
(https://github.com/coderofsalvation/hypermediatic) navigation of
|
||||||
3D scenes/objects: URI Fragments (https://en.wikipedia.org/wiki/
|
3D scenes/objects: URI Fragments (https://en.wikipedia.org/wiki/
|
||||||
URI_fragment) + src/href spatial metadata
|
URI_fragment) + src/href spatial metadata
|
||||||
2. Interlinking (text)objects by collapsing space into a Word Graph
|
2. Interlinking text & spatial objects by collapsing space into a
|
||||||
(XRWG) to show visible links (#visible-links)
|
Word Graph (XRWG) to show visible links (#visible-links)
|
||||||
3. unlocking spatial potential of the (originally 2D) hashtag (which
|
3. unlocking spatial potential of the (originally 2D) hashtag (which
|
||||||
jumps to a chapter) for navigating XR documents
|
jumps to a chapter) for navigating XR documents
|
||||||
|
|
||||||
|
|
@ -144,14 +144,14 @@ Internet-Draft XR Fragments December 2023
|
||||||
|
|
||||||
2. Core principle
|
2. Core principle
|
||||||
|
|
||||||
*XR Fragments allows controlling of metadata in 3D scene(files) using
|
*XR Fragments allows controlling 3D models using URLs, based on
|
||||||
URLs*
|
(non)existing metadata via URI's*
|
||||||
|
|
||||||
XR Fragments tries to seek to connect the world of text (semantical
|
XR Fragments tries to seek to connect the world of text (semantical
|
||||||
web / RDF), and the world of pixels.
|
web / RDF), and the world of pixels.
|
||||||
Instead of combining them (in a game-editor e.g.), XR Fragments
|
Instead of forcing authors to combine 3D/2D objects programmatically
|
||||||
*integrates all*, by collecting metadata into an XRWG and control it
|
(publishing thru a game-editor e.g.), XR Fragments *integrates all*
|
||||||
via URL:
|
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
|
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
|
3. Conventions and Definitions
|
||||||
|
|
||||||
See appendix below in case certain terms are not clear.
|
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
|
reserved = gen-delims / sub-delims
|
||||||
gen-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
|
| 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
|
4. List of URI Fragments
|
||||||
|
|
||||||
+==========+============+==============+===========================+
|
+==========+============+==============+===========================+
|
||||||
|
|
@ -313,6 +379,21 @@ Internet-Draft XR Fragments December 2023
|
||||||
|
|
||||||
Table 3
|
Table 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
van Kammen Expires 2 August 2024 [Page 7]
|
||||||
|
|
||||||
|
Internet-Draft XR Fragments January 2024
|
||||||
|
|
||||||
|
|
||||||
4.1. List of metadata for 3D nodes
|
4.1. List of metadata for 3D nodes
|
||||||
|
|
||||||
+======+========+==========+===================+===================+
|
+======+========+==========+===================+===================+
|
||||||
|
|
@ -330,14 +411,6 @@ Internet-Draft XR Fragments December 2023
|
||||||
| | | geo" | highlighting) | |
|
| | | geo" | highlighting) | |
|
||||||
+------+--------+----------+-------------------+-------------------+
|
+------+--------+----------+-------------------+-------------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
van Kammen Expires 8 June 2024 [Page 6]
|
|
||||||
|
|
||||||
Internet-Draft XR Fragments December 2023
|
|
||||||
|
|
||||||
|
|
||||||
Table 4
|
Table 4
|
||||||
|
|
||||||
| Supported popular compatible 3D fileformats: .gltf, .obj, .fbx,
|
| 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
|
| agnostic, which means that programmatic 3D scene(nodes) can also
|
||||||
| use the mechanism/metadata.
|
| use the mechanism/metadata.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
van Kammen Expires 2 August 2024 [Page 8]
|
||||||
|
|
||||||
|
Internet-Draft XR Fragments January 2024
|
||||||
|
|
||||||
|
|
||||||
4.3. Dynamic XR Fragments (+databindings)
|
4.3. Dynamic XR Fragments (+databindings)
|
||||||
|
|
||||||
These are automatic fragment-to-metadata mappings, which only trigger
|
These are automatic fragment-to-metadata mappings, which only trigger
|
||||||
if the 3D scene metadata matches a specific identifier (aliasname
|
if the 3D scene metadata matches a specific identifier (aliasname
|
||||||
e.g.)
|
e.g.)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
van Kammen Expires 8 June 2024 [Page 7]
|
|
||||||
|
|
||||||
Internet-Draft XR Fragments December 2023
|
|
||||||
|
|
||||||
|
|
||||||
+==========================+=======================+=================+=======================+
|
+==========================+=======================+=================+=======================+
|
||||||
|fragment |type |example |info |
|
|fragment |type |example |info |
|
||||||
+==========================+=======================+=================+=======================+
|
+==========================+=======================+=================+=======================+
|
||||||
|
|
@ -437,19 +499,17 @@ Internet-Draft XR Fragments December 2023
|
||||||
|
|
||||||
Table 6
|
Table 6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
van Kammen Expires 2 August 2024 [Page 9]
|
||||||
|
|
||||||
|
Internet-Draft XR Fragments January 2024
|
||||||
|
|
||||||
|
|
||||||
5. Spatial Referencing 3D
|
5. Spatial Referencing 3D
|
||||||
|
|
||||||
XR Fragments assume the following objectname-to-URIFragment mapping:
|
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
|
my.io/scene.fbx
|
||||||
+─────────────────────────────+
|
+─────────────────────────────+
|
||||||
│ sky │ src: http://my.io/scene.fbx#sky (includes building,mainobject,floor)
|
│ 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 |
|
| <b>#t</b>=0,100 | vector3 | set playback speed, and |
|
||||||
| | | (re)position looprange of |
|
| | | (re)position looprange of |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
van Kammen Expires 2 August 2024 [Page 10]
|
||||||
|
|
||||||
|
Internet-Draft XR Fragments January 2024
|
||||||
|
|
||||||
|
|
||||||
| | | scene-animation or src- |
|
| | | scene-animation or src- |
|
||||||
| | | mediacontent |
|
| | | mediacontent |
|
||||||
+--------------------+---------+-----------------------------+
|
+--------------------+---------+-----------------------------+
|
||||||
| <b>#rot</b>=0,90,0 | vector3 | rotate camera |
|
| <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
|
Table 7
|
||||||
|
|
@ -550,18 +610,18 @@ Internet-Draft XR Fragments December 2023
|
||||||
*replace the current scene* with a new one, like other.fbx, and
|
*replace the current scene* with a new one, like other.fbx, and
|
||||||
assume pos=0,0,0.
|
assume pos=0,0,0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
van Kammen Expires 2 August 2024 [Page 11]
|
||||||
|
|
||||||
|
Internet-Draft XR Fragments January 2024
|
||||||
|
|
||||||
|
|
||||||
7. Top-level URL processing
|
7. Top-level URL processing
|
||||||
|
|
||||||
| Example URL: ://foo/world.gltf#cube&pos=0,0,0
|
| 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:
|
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
|
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 2 August 2024 [Page 12]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
van Kammen Expires 8 June 2024 [Page 11]
|
|
||||||
|
|
||||||
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
|
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
|
» 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
|
* 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
|
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
|
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=
|
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*
|
| 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:
|
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
|
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
|
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
|
* 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
|
// 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 = `
|
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
|
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
|
* 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
|
Non-HTML Hypermedia browsers should make browser extensions the right
|
||||||
|
|
@ -1651,104 +1707,114 @@ Internet-Draft XR Fragments December 2023
|
||||||
|
|
||||||
23. Appendix: Definitions
|
23. Appendix: Definitions
|
||||||
|
|
||||||
+=================+===============================================+
|
+=================+=============================================+
|
||||||
| definition | explanation |
|
| definition | explanation |
|
||||||
+=================+===============================================+
|
+=================+=============================================+
|
||||||
| human | a sentient being who thinks fuzzy, absorbs, |
|
| human | a sentient being who thinks fuzzy, absorbs, |
|
||||||
| | and shares thought (by plain text, not |
|
| | and shares thought (by plain text, not |
|
||||||
| | markuplanguage) |
|
| | markuplanguage) |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| scene | a (local/remote) 3D scene or 3D file |
|
| scene | a (local/remote) 3D scene or 3D file |
|
||||||
| | (index.gltf e.g.) |
|
| | (index.gltf e.g.) |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| 3D object | an object inside a scene characterized by |
|
| 3D object | an object inside a scene characterized by |
|
||||||
| | vertex-, face- and customproperty data. |
|
| | vertex-, face- and customproperty data. |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
|
| 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 |
|
| metadata | custom properties of text, 3D Scene or |
|
||||||
| | Object(nodes), relevant to machines and a |
|
| | Object(nodes), relevant to machines and a |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
van Kammen Expires 2 August 2024 [Page 31]
|
||||||
|
|
||||||
|
Internet-Draft XR Fragments January 2024
|
||||||
|
|
||||||
|
|
||||||
| | human minority (academics/developers) |
|
| | human minority (academics/developers) |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| XR fragment | URI Fragment with spatial hints like |
|
| XR fragment | URI Fragment with spatial hints like |
|
||||||
| | #pos=0,0,0&t=1,100 e.g. |
|
| | #pos=0,0,0&t=1,100 e.g. |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| the XRWG | wordgraph (collapses 3D scene to tags) |
|
| the XRWG | wordgraph (collapses 3D scene to tags) |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| the hashbus | hashtags map to camera/scene-projections |
|
| the hashbus | hashtags map to camera/scene-projections |
|
||||||
|
+-----------------+---------------------------------------------+
|
||||||
|
| spacetime | positions camera, triggers scene-preset/ |
|
||||||
|
| hashtags | time |
|
||||||
van Kammen Expires 8 June 2024 [Page 30]
|
+-----------------+---------------------------------------------+
|
||||||
|
|
||||||
Internet-Draft XR Fragments December 2023
|
|
||||||
|
|
||||||
|
|
||||||
+-----------------+-----------------------------------------------+
|
|
||||||
| spacetime | positions camera, triggers scene-preset/time |
|
|
||||||
| hashtags | |
|
|
||||||
+-----------------+-----------------------------------------------+
|
|
||||||
| teleportation | repositioning the enduser to a different |
|
| teleportation | repositioning the enduser to a different |
|
||||||
| | position (or 3D scene/file) |
|
| | position (or 3D scene/file) |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| sourceportation | teleporting the enduser to the original XR |
|
| sourceportation | teleporting the enduser to the original XR |
|
||||||
| | Document of an src embedded object. |
|
| | Document of an src embedded object. |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| placeholder | a 3D object which with src-metadata (which |
|
| placeholder | a 3D object which with src-metadata (which |
|
||||||
| object | will be replaced by the src-data.) |
|
| object | will be replaced by the src-data.) |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| src | (HTML-piggybacked) metadata of a 3D object |
|
| src | (HTML-piggybacked) metadata of a 3D object |
|
||||||
| | which instances content |
|
| | which instances content |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| href | (HTML-piggybacked) metadata of a 3D object |
|
| href | (HTML-piggybacked) metadata of a 3D object |
|
||||||
| | which links to content |
|
| | which links to content |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| filter | URI Fragment(s) which show/hide object(s) in |
|
| filter | URI Fragment(s) which show/hide object(s) |
|
||||||
| | a scene based on name/tag/property (#cube&- |
|
| | in a scene based on name/tag/property |
|
||||||
| | price=>3) |
|
| | (#cube&-price=>3) |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| visual-meta | visual-meta (https://visual.meta.info) data |
|
| visual-meta | visual-meta (https://visual.meta.info) data |
|
||||||
| | appended to text/books/papers which is |
|
| | appended to text/books/papers which is |
|
||||||
| | indirectly visible/editable in XR. |
|
| | indirectly visible/editable in XR. |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| requestless | metadata which never spawns new requests |
|
| requestless | metadata which never spawns new requests |
|
||||||
| metadata | (unlike RDF/HTML, which can cause framerate- |
|
| metadata | (unlike RDF/HTML, which can cause |
|
||||||
| | dropping, hence not used a lot in games) |
|
| | framerate-dropping, hence not used a lot in |
|
||||||
+-----------------+-----------------------------------------------+
|
| | games) |
|
||||||
|
+-----------------+---------------------------------------------+
|
||||||
| FPS | frames per second in spatial experiences |
|
| FPS | frames per second in spatial experiences |
|
||||||
| | (games,VR,AR e.g.), should be as high as |
|
| | (games,VR,AR e.g.), should be as high as |
|
||||||
| | possible |
|
| | possible |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| introspective | inward sensemaking ("I feel this belongs to |
|
| introspective | inward sensemaking ("I feel this belongs to |
|
||||||
| | that") |
|
| | that") |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| extrospective | outward sensemaking ("I'm fairly sure John is |
|
| extrospective | outward sensemaking ("I'm fairly sure John |
|
||||||
| | a person who lives in oklahoma") |
|
|
||||||
+-----------------+-----------------------------------------------+
|
|
||||||
|
|
||||||
|
van Kammen Expires 2 August 2024 [Page 32]
|
||||||
|
|
||||||
|
Internet-Draft XR Fragments January 2024
|
||||||
|
|
||||||
|
|
||||||
|
| | is a person who lives in oklahoma") |
|
||||||
|
+-----------------+---------------------------------------------+
|
||||||
| ◻ | ascii representation of an 3D object/mesh |
|
| ◻ | ascii representation of an 3D object/mesh |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| (un)obtrusive | obtrusive: wrapping human text/thought in |
|
| (un)obtrusive | obtrusive: wrapping human text/thought in |
|
||||||
| | XML/HTML/JSON obfuscates human text into a |
|
| | XML/HTML/JSON obfuscates human text into a |
|
||||||
| | salad of machine-symbols and words |
|
| | salad of machine-symbols and words |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| flat 3D object | a 3D object of which all verticies share a |
|
| flat 3D object | a 3D object of which all verticies share a |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
van Kammen Expires 8 June 2024 [Page 31]
|
|
||||||
|
|
||||||
Internet-Draft XR Fragments December 2023
|
|
||||||
|
|
||||||
|
|
||||||
| | plane |
|
| | plane |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| BibTeX | simple tagging/citing/referencing standard |
|
| BibTeX | simple tagging/citing/referencing standard |
|
||||||
| | for plaintext |
|
| | for plaintext |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| BibTag | a BibTeX tag |
|
| BibTag | a BibTeX tag |
|
||||||
+-----------------+-----------------------------------------------+
|
+-----------------+---------------------------------------------+
|
||||||
| (hashtag)bibs | an easy to speak/type/scan tagging SDL (see |
|
| (hashtag)bibs | an easy to speak/type/scan tagging SDL (see |
|
||||||
| | here (https://github.com/coderofsalvation/ |
|
| | here (https://github.com/coderofsalvation/ |
|
||||||
| | hashtagbibs) which expands to BibTex/JSON/XML |
|
| | hashtagbibs) which expands to BibTex/JSON/ |
|
||||||
+-----------------+-----------------------------------------------+
|
| | XML |
|
||||||
|
+-----------------+---------------------------------------------+
|
||||||
|
|
||||||
Table 13
|
Table 13
|
||||||
|
|
||||||
|
|
@ -1779,14 +1845,4 @@ Internet-Draft XR Fragments December 2023
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
van Kammen Expires 2 August 2024 [Page 33]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
van Kammen Expires 8 June 2024 [Page 32]
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
<workgroup>Internet Engineering Task Force</workgroup>
|
<workgroup>Internet Engineering Task Force</workgroup>
|
||||||
|
|
||||||
<abstract>
|
<abstract>
|
||||||
<t>This draft is a specification for 4D URLs & <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> navigation, which links together space, time & text together, for hypermedia browsers with- or without a network-connection.<br />
|
<t>This draft is a specification for 4D URI's & <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> 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 />
|
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 />
|
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>
|
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><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URI's</strong></t>
|
||||||
<t>Or more detailed:</t>
|
<t>It solves:</t>
|
||||||
|
|
||||||
<ol spacing="compact">
|
<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>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 & 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>
|
<li>unlocking spatial potential of the (originally 2D) hashtag (which jumps to a chapter) for navigating XR documents</li>
|
||||||
</ol>
|
</ol>
|
||||||
<blockquote><t>NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible</t>
|
<blockquote><t>NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible</t>
|
||||||
</blockquote></section>
|
</blockquote></section>
|
||||||
|
|
||||||
<section anchor="core-principle"><name>Core principle</name>
|
<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 />
|
<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>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
@ -104,46 +166,13 @@ Instead of combining them (in a game-editor e.g.), XR Fragments <strong>integrat
|
||||||
<td>n/a</td>
|
<td>n/a</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table><blockquote><t>XR Fragments does not look at XR (or the web) thru the lens of HTML.<br />
|
</table></section>
|
||||||
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>
|
|
||||||
|
|
||||||
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>
|
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>
|
||||||
<t>See appendix below in case certain terms are not clear.</t>
|
<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
|
<artwork><![CDATA[reserved = gen-delims / sub-delims
|
||||||
gen-delims = "#" / "&"
|
gen-delims = "#" / "&"
|
||||||
|
|
@ -171,7 +200,12 @@ sub-delims = "," / "="
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table><blockquote><t>this is already implemented in all browsers</t>
|
</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>
|
||||||
|
|
||||||
<section anchor="list-of-uri-fragments"><name>List of URI Fragments</name>
|
<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>
|
<td>an object inside a scene characterized by vertex-, face- and customproperty data.</td>
|
||||||
</tr>
|
</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>
|
<tr>
|
||||||
<td>metadata</td>
|
<td>metadata</td>
|
||||||
<td>custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers)</td>
|
<td>custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers)</td>
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
|
|
||||||
Internet Engineering Task Force L.R. van Kammen
|
Internet Engineering Task Force L.R. van Kammen
|
||||||
Internet-Draft 6 December 2023
|
Internet-Draft 30 January 2024
|
||||||
Intended status: Informational
|
Intended status: Informational
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -38,11 +38,11 @@ Status of This Memo
|
||||||
time. It is inappropriate to use Internet-Drafts as reference
|
time. It is inappropriate to use Internet-Drafts as reference
|
||||||
material or to cite them other than as "work in progress."
|
material or to cite them other than as "work in progress."
|
||||||
|
|
||||||
This Internet-Draft will expire on 8 June 2024.
|
This Internet-Draft will expire on 2 August 2024.
|
||||||
|
|
||||||
Copyright Notice
|
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.
|
document authors. All rights reserved.
|
||||||
|
|
||||||
This document is subject to BCP 78 and the IETF Trust's Legal
|
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
|
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
|
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
|
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
|
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
|
| 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]
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,17 @@ window.AFRAME.registerComponent('xrf', {
|
||||||
https: { type:'string'},
|
https: { type:'string'},
|
||||||
},
|
},
|
||||||
init: function () {
|
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 ){
|
if( !AFRAME.XRF ){
|
||||||
|
|
||||||
let camera = document.querySelector('[camera]')
|
let camera = document.querySelector('[camera]')
|
||||||
|
|
@ -130,15 +141,6 @@ window.AFRAME.registerComponent('xrf', {
|
||||||
aScene.setAttribute('xrf-gaze','')
|
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}`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ window.AFRAME.registerComponent('xrf-get', {
|
||||||
mesh.scale.copy(world.scale)
|
mesh.scale.copy(world.scale)
|
||||||
mesh.setRotationFromQuaternion(world.quat);
|
mesh.setRotationFromQuaternion(world.quat);
|
||||||
}else{
|
}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.object3D.add = (a) => a
|
||||||
}
|
}
|
||||||
this.el.setObject3D('mesh',mesh)
|
this.el.setObject3D('mesh',mesh)
|
||||||
|
|
@ -49,6 +49,10 @@ window.AFRAME.registerComponent('xrf-get', {
|
||||||
|
|
||||||
this.el.emit("update",{timeout:0})
|
this.el.emit("update",{timeout:0})
|
||||||
|
|
||||||
|
AFRAME.XRF.addEventListener('reset', () => {
|
||||||
|
this.el.remove()
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -50,10 +50,12 @@ xrf.patchLoader = function(loader){
|
||||||
|
|
||||||
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
|
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){
|
xrf.parseModel = function(model,url){
|
||||||
let file = xrf.getFile(url)
|
let file = xrf.getFile(url)
|
||||||
model.file = file
|
model.file = file
|
||||||
|
model.isXRF = true
|
||||||
|
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
|
||||||
xrf.emit('parseModel',{model,url,file})
|
xrf.emit('parseModel',{model,url,file})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -79,7 +81,7 @@ xrf.reset = () => {
|
||||||
xrf.add( xrf.interactive )
|
xrf.add( xrf.interactive )
|
||||||
xrf.layers = 0
|
xrf.layers = 0
|
||||||
|
|
||||||
// reset certain events
|
// allow others to reset certain events
|
||||||
xrf.emit('reset',{})
|
xrf.emit('reset',{})
|
||||||
// remove mixers
|
// remove mixers
|
||||||
xrf.mixers.map( (m) => m.stop())
|
xrf.mixers.map( (m) => m.stop())
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,6 @@ xrf.navigator.to = (url,flags,loader,data) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
if( data ){ // file upload
|
if( data ){ // file upload
|
||||||
console.dir(loader)
|
|
||||||
loader.parse(data, "", onLoad )
|
loader.parse(data, "", onLoad )
|
||||||
}else loader.load(url, onLoad )
|
}else loader.load(url, onLoad )
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ xrf.filter.process = function(frag,scene,opts){
|
||||||
let obj
|
let obj
|
||||||
frag.target = firstFilter
|
frag.target = firstFilter
|
||||||
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
|
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 ){
|
if(obj ){
|
||||||
obj.position.set(0,0,0)
|
obj.position.set(0,0,0)
|
||||||
if( opts.copyScene ) {
|
if( opts.copyScene ) {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
|
||||||
scene.traverse( (n) => {
|
scene.traverse( (n) => {
|
||||||
if( n.userData && n.userData['#'] ){
|
if( n.userData && n.userData['#'] ){
|
||||||
let frag = xrf.URI.parse( 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
|
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
|
||||||
}else{
|
}else{
|
||||||
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
|
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ xrf.frag.src.enableSourcePortation = (src) => {
|
||||||
mat.metalness = 1
|
mat.metalness = 1
|
||||||
mat.opacity = 0
|
mat.opacity = 0
|
||||||
const cube = new THREE.Mesh( geo, mat )
|
const cube = new THREE.Mesh( geo, mat )
|
||||||
console.log("todo: sourceportate")
|
// *TODO* sourceportate?
|
||||||
return xrf.frag.src
|
return xrf.frag.src
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ xrf.portalNonEuclidian = function(opts){
|
||||||
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
|
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
|
||||||
cam.getWorldPosition(cameraPosition)
|
cam.getWorldPosition(cameraPosition)
|
||||||
cam.getWorldDirection(cameraDirection)
|
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
|
// init
|
||||||
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
|
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ xrf.addEventListener('parseModel', (opts) => {
|
||||||
|
|
||||||
model.animations.map( (anim) => {
|
model.animations.map( (anim) => {
|
||||||
anim.optimize()
|
anim.optimize()
|
||||||
console.log("action: "+anim.name)
|
if( xrf.debug ) console.log("action: "+anim.name)
|
||||||
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
|
mixer.actions.push( mixer.clipAction( anim, model.scene ) )
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue