NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible
Being able to use the same URI Fragment DSL for navigation (href: #foo) as well as interactions (href: xrf://#foo) greatly simplifies implementation, increases HFL, and reduces need for scripting languages.
| principle | 3D URL | HTML 2D URL |
|---|---|---|
| the XRWG | wordgraph (collapses 3D scene to tags) | Ctrl-F (find) |
| the hashbus | hashtags alter camera/scene/object-projections | hashtags alter document positions |
| src metadata | renders content and offers sourceportation | renders content |
| href metadata | teleports to other XR document | jumps to other HTML document |
| href metadata | triggers predefined view | Media fragments |
| href metadata | triggers camera/scene/object/projections | n/a |
| href metadata | draws visible connection(s) for XRWG 'tag' | n/a |
| href metadata | filters certain (in)visible objects | n/a |
| href metadata | href="xrf://#-foo&bar" | href="javascript:hideFooAndShowBar()` |
| (this does not update topLevel URI) | (this is non-standard, non-hypermediatic) |
An important aspect of HFL is that URI Fragments can be triggered without updating the top-level URI (default href-behaviour) thru their own 'bus' (xrf://#.....). This decoupling between navigation and interaction prevents non-standard things like (href:javascript:dosomething()).
Example: ://foo.com/my3d.gltf#room1&prio=-5&t=0,100
| Demo | Explanation |
|---|---|
| room1 | vector/coordinate argument e.g. |
| room1&cam1 | combinators |
this is already implemented in all browsers
Every 3D fileformat supports named 3D object, and this name allows URLs (fragments) to reference them (and their children objects).
It also allows sourceportation, which basically means the enduser can teleport to the original XR Document of an src embedded object, and see a visible connection to the particular embedded object. Basically an embedded link becoming an outbound link by activating it.
A fallback-mechanism to turn 3D files into XR Movies without editing them.
NOTE: in the examples below we use the href-heuristic, but also the .xrf. chained-extension applies here.
NOTE: Linux's setfattr/getfattr is xattr on mac, and Set-Content/Get-content on Windows. See pxattr for lowlevel access.
This will make object button clickable, and teleport the user to object roomB.
In THREE.js-code this would boil down to:
XR Fragments allows deeplinking of 3D objects by mapping objectnames to URI fragments
XR Fragments does not look at XR (or the web) thru the lens of HTML or URLs.
But approaches things from a higherlevel local-first 3D hypermedia browser-perspective.
?-linked and #-linked navigation are JUST one possible way to implement XR Fragments: the essential goal is to allow a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.
| fragment | type | example | info |
|---|---|---|---|
| #...... | vector3 | #room1 #room2 #cam2 | positions/parents camera(rig) (or XR floor) to xyz-coord/object/camera and upvector |
| #t=0,2&loop | play (and loop) 3D animation from 0 seconds till 2 seconds |
| key | type | example (JSON) | function | existing compatibility |
|---|---|---|---|---|
| href | string | "href": "b.gltf" | XR teleport | custom property in 3D fileformats |
NOTE: hashbus links (xrf://#foo&bar) don't change the toplevel URL, which makes it ideal for interactions (in contrast to typical #roomC navigation, which benefit back/forward browser-buttons), see <a href="#hashbus">hashbus</a> for more info.
these allow for XR Movies with a controllable timeline using href URI's with Media Fragments
Use [[#s 🌱]] to control playback speed
Examples: #+menu to show a object, #-menu to hide a menu, #!menu to teleport a menu, #*block to clone a grabbable block, #|object to share an object
This will teleport the user to whiteroom and moves object explainer and exitmenu in front of the user.
NOTE: level2 teleportation links, as well as instancing mitigates the 'broken embedded image'-issue of HTML: always attaching the href-values to a 3D (preview) object (that way broken links will not break the design).
NOTE: combining instance-operators allows dynamic construction of 3D scenes (#london&!welcomeMenu&!fadeBox e.g.)
NOTE: this is basically the #! operator which infinitely clones the referenced object (instead of repositioning the object).
NOTE: the latter shows that (de)selectors can also be with regular href -values
This URL can be fed straight into Web Share API orxdg-open
NOTE: sharing is limited to (internal objects) via xrf: scheme-only
Usecase: for non-shareable URLs like href: xrf:#t=4,5, to display a stateful msg e.g.).
compliance with RFC 3986: unimplemented/unknown URI schemes (xrf:... e.g.) will not update the top-level URL
Example URL: ://foo/world.gltf#room1&t=10&cam
| fragment | type | example value |
|---|---|---|
| href | string (uri or predefined view) | #room1 #room1 ://somefile.gltf#room1 |
By default position 0,0,0 of the 3D scene represents the walkable plane, however this is overridden when the following applies:
optionally the viewer can offer thumbstick, mouse or joystick teleport-tools for non-roomscale VR/AR setups.
NOTE: please always start aria-description with a verb to aid transcripts.
Example: object 'tryceratops' with aria-description: is a huge dinosaurus standing on a #mountain generates transcript #tryceratops is a huge dinosaurus standing on a #mountain, where the hashtags are clickable XR Fragments (activating the visible-links in the XR browser).
| metadata key | example value |
|---|---|
| aria-description, og:description, dc:description | An immersive experience about Triceratops (*) |
| SPDX | CC0-1.0 |
| dc:creator | John Doe |
| dc:title, og:title | 'Triceratops` (*) |
| og:site_name | https://xrfragment.org |
| dc.publisher | NLNET |
| dc.date | 2024-01-01 |
| dc.identifier | XRFRAGMENT-001 |
| journal (bibTeX) | {Future Of Text Vol 3}, |
* = these are interchangable (only one needs to be defined)
These attributes can be scanned and presented during an href or src eye/mouse-over.
Priority Order and Precedence, otherwise fallback applies
Example 1 In case of the OMI_LINK glTF extension (href: https://nlnet.nl) and an XR Fragment (href: #otherroom or href: otherplanet.glb), it is clear that https://nlnet.nl should open in a browsertab, whereas the XR Fragment links should teleport the user. If the OMI_LINK contains an XR Fragment (#room1 e.g.) a teleport should be performed only (and other [overlapping] metadata should be ignored). Example 2 If an Extensions uses XR Fragments in URI's (href: #otherroom or href: xrf://-walls in OMI_LINK e.g.), then perform them according to XR Fragment spec (teleport user). But only once: ignore further overlapping metadata for that usecase.
| what | XR metadata | Lowest common denominator |
|---|---|---|
| CSS | vendor-agnostic | 2D canvas + object referencing/styling |
| XR Fragments | vendor-agnostic | 3D camera + object(file) load/embed/click/referencing |
| Vendor prefixs | vendor-specific | Specialized Entity-Component implementation |
Why? Because not all XR interactions can/should be solved/standardized by embedding XR Fragments into any 3D file. The lowest common denominator between 3D engines is the 'entity'-part of their entity-component-system (ECS). The 'component'-part can be progressively enhanced via vendor prefixes.
This 'separating of mechanism from policy' (unix rule) does somewhat break portability of an XR experience, but still prevents (E-waste of) handcoded virtual worlds. It allows for (XR experience) metadata to survive in future 3D engines and scene-fileformats.
| definition | explanation |
|---|---|
| human | a sentient being who thinks fuzzy, absorbs, and shares thought (by plain text, not markuplanguage) |
| scene | a (local/remote) 3D scene or 3D file (index.gltf e.g.) |
| 3D object | an object inside a scene characterized by vertex-, face- and customproperty data. |
| URI | some resource at something somewhere via someprotocol (http://me.com/foo.glb#foo or e76f8efec8efce98e6f |
| URL | something somewhere via someprotocol (http://me.com/foo.glb) |
| URN | something at some domain (me.com/foo.glb) |
| metadata | custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers) |
| XR fragment | URI Fragment with spatial hints (which match the name of a 3D object-, camera-, animation-object) |
| the XRWG | wordgraph (collapses 3D scene to tags) |
| the hashbus | hashtags map to camera/scene-projections |
| spacetime hashtags | positions camera, triggers scene-preset/time |
| teleportation | repositioning the enduser to a different position (or 3D scene/file) |
| sourceportation | teleporting the enduser to the original XR Document of an src embedded object. |
| placeholder object | a 3D object which with src-metadata (which will be replaced by the src-data.) |
| src | (HTML-piggybacked) metadata of a 3D object which instances content |
| href | (HTML-piggybacked) metadata of a 3D object which links to content |
| filter | URI Fragment(s) which show/hide object(s) in a scene based on name/tag/property (#cube&-price=>3) |
| visual-meta | |
| requestless metadata | metadata which never spawns new requests (unlike RDF/HTML, which can cause framerate-dropping, hence not used a lot in games) |
| FPS | frames per second in spatial experiences (games,VR,AR e.g.), should be as high as possible |
| introspective | inward sensemaking ("I feel this belongs to that") |
| extrospective | outward sensemaking ("I'm fairly sure John is a person who lives in oklahoma") |
| ◻ | ascii representation of an 3D object/mesh |
| (un)obtrusive | obtrusive: wrapping human text/thought in XML/HTML/JSON obfuscates human text into a salad of machine-symbols and words |
| flat 3D object | a 3D object of which all verticies share a plane |
| BibTeX | simple tagging/citing/referencing standard for plaintext |
| BibTag | a BibTeX tag |
| (hashtag)bibs | an easy to speak/type/scan tagging SDL ( |