Я пытаюсь представить систему Aframe, которая предотвращает перемещение камеры в определенные части сцены путем наложения сетки на сцену и предотвращения движения в ячейки сетки, которые отмечены как заполненные.
Сейчас я проверяю только одно измерение (ось z), находится ли камера вблизи сферы. Текущий код перемещает камеру обратно в последнюю разрешенную позицию, когда камера обнаруживается в ячейке сетки, которой она не должна быть.
компонент, системная регистрация
AFRAME.registerSystem('gridsystem', {
init: function () {
// start with 1d
this.grid = Array(20).fill(0)
// set the sphere at 5
this.grid[5] = 1
this.camera = {}
// stop motion a quarter of a grid from a boundary
this.boundarydist = 2
},
registerCam: function (el) {
let v = new THREE.Vector3()
console.log(el)
this.camera.e = el
console.log(el.object3D.position)
el.object3D.getWorldPosition(v)
this.camera.v = v
this.lastpermitted = this.camera.v.z
},
// abstract this into multiple dimensions later
checkPosition: function () {
//
// find position that the camera is in
// convert z position
// need to make it possible to handle positive and negative
let z = this.camera.e.object3D.position.z
for (let sign of [-1, 1]) {
let index = Math.floor(z + sign * this.boundarydist)
if (this.grid[index] == 1) {
// we proceeded into a grid we shouldn't be
console.log("bumped into")
this.camera.e.object3D.position.z = this.lastpermitted
return
}
}
this.lastpermitted = this.camera.e.object3D.position.z
}
})
AFRAME.registerComponent("gridsystem", {
init: function () {
this.system.registerCam(this.el)
setInterval(() => {
this.system.checkPosition()
}, 100)
}
})
уценка сцены
<a-scene>
<a-entity
id="sphere"
geometry="primitive: sphere"
material="color: tomato; shader: flat"
position="0 0.15 5"
light="type: point; intensity: 5"
/>
<a-entity id="camera" camera wasd-controls gridsystem look-controls />
</a-scene>
Вопрос
Вместо этого я хотел бы предотвратить начальную позицию смены камеры, если движение поместило бы камеру в недопустимую ячейку.
Как ввести функцию, которая будет вызываться при обновлении атрибутов конкретного существующего компонента (в данном случае камеры)?