«Маска».
Взглянув на пример box-hole , чтобы создать иллюзию, Ли создает две коробки.
1) Коробка, которая находится "в яме"
2) Немного большая невидимая коробка без верха - чтобы скрыть первую. Верхняя часть убрана, чтобы работать как «дыра», через которую вы можете видеть первую коробку
Как это можно сделать в THREE.js
Маскировка выполняется путем предотвращения рендеринга второго блока любого цвета. Из примера Ли:
let material = new THREE.MeshBasicMaterial({
colorWrite: false;
})
docs заявляет, что флаг может использоваться для создания невидимых объектов, скрывающих других.
Как это можно сделать в рамке
Боюсь, вы не можете просто сделать материал "плащ" в кадре. Свойство colorWrite
не отображается в компоненте material
.
То, что я думаю, самый простой способ - это создать cloak
компонент, который создаст второе поле в THREE.js:
AFRAME.registerComponent('cloak', {
init: function() {
let geometry = new THREE.BoxGeometry(1, 1, 1)
geometry.faces.splice(4, 2) // cut out the top faces
let material = new THREE.MeshBasicMaterial({
colorWrite: false
})
let mesh = new THREE.Mesh(geometry, material)
mesh.scale.set(1.1, 1.1, 1.1)
this.el.object3D.add(mesh)
}
})
и используйте его так:
<a-box material="src: myPic.png; side: back;" cloak>
Проверьте это в этом коде . С маркером HIRO вы должны получить такую дыру:
Использование моделей или других объектов в качестве "плащей"
Здесь нам нужно применить магию colorWrite=false
к каждому узлу / дочернему элементу модели.
init: function() {
// make sure the model is loaded first
this.el.addEventListener('model-loaded', e=>{
let mesh = this.el.getObject3D('mesh') // grab the mesh
if (mesh === undefined) return; // return if no mesh :(
mesh.traverse(function(node) { // traverse through and apply settings
if (node.isMesh && node.material) { // make sure the element can be a cloak
node.material.colorWrite = false
node.material.needsUpdate = true;
}
});
})
}
Также убедитесь, что плащ отображается перед элементами, которые требуют маскировки:
<a-marker>
<a-entity gltf-model="#wall-with-a-hole" cloak-component></a-entity>
<!-- the other stuff that needs to be cloaked-->
</a-marker