xrfragment/src/3rd/aframe/index.js

76 lines
2.4 KiB
JavaScript
Raw Normal View History

2023-05-09 17:42:29 +02:00
window.AFRAME.registerComponent('xrf', {
schema: {
rig: {type: 'selector'}
},
init: function () {
if( !AFRAME.XRF ) this.initXRFragments()
if( !this.rig && this.el.querySelector('[camera]') )
AFRAME.XRF.rig = this.el
},
initXRFragments: function(){
let aScene = document.querySelector('a-scene')
// enable XR fragments
let XRF = AFRAME.XRF = xrfragment.init({
THREE,
camera: aScene.camera,
scene: aScene.object3D,
renderer: aScene.renderer,
debug: true,
loaders: [ THREE.GLTFLoader ], // which 3D assets to check for XR fragments?
})
// override the 'pos' XR Fragment so we can translate the camera rig (not the camera itself)
XRF.pos = (xrf,v,opts) => {
let { mesh, model, camera, scene, renderer, THREE} = opts
console.log("!pos")
camera.parent.parent.position.x = v.x
camera.parent.parent.position.y = v.y
camera.parent.parent.position.z = v.z
// xrf(v,opts) // skip threejs handler
}
// override the 'rot' XR Fragment so we can translate the camera rig (not the camera itself)
XRF.rot = (xrf,v,opts) => {
let { mesh, model, camera, scene, renderer, THREE} = opts
camera.parent.parent.rotation.x = v.x * Math.PI / 180;
camera.parent.parent.rotation.y = v.y * Math.PI / 180;
camera.parent.parent.rotation.z = v.z * Math.PI / 180;
// xrf(v,opts) // skip threejs handler
}
}
});
2023-05-10 19:12:15 +02:00
AFRAME.registerComponent('gltf-to-entity', {
schema: {
from: {default: '', type: 'selector'},
name: {default: ''},
duplicate: {type:'boolean'}
},
init: function () {
var el = this.el;
var data = this.data;
data.from.addEventListener('model-loaded', evt => {
var model;
var subset;
model = evt.detail.model;
console.dir(this.data.from)
subset = model.getObjectByName(data.name);
if (!subset){
console.error("Sub-object", data.name, "not found in #"+data.from.id);
return;
}
if( !this.data.duplicate ) subset.parent.remove(subset)
let clone = subset.clone()
////subset.updateMatrixWorld();
el.object3D.position.setFromMatrixPosition(data.from.object3D.matrixWorld);
el.object3D.quaternion.setFromRotationMatrix(data.from.object3D.matrixWorld);
el.setObject3D('mesh', clone );
el.emit('model-loaded', el.getObject3D('mesh'));
});
}
});