Как предотвратить обновление движения камеры с помощью системы координатной сетки - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь представить систему 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>

Вопрос

Вместо этого я хотел бы предотвратить начальную позицию смены камеры, если движение поместило бы камеру в недопустимую ячейку.

Как ввести функцию, которая будет вызываться при обновлении атрибутов конкретного существующего компонента (в данном случае камеры)?

1 Ответ

0 голосов
/ 16 марта 2020

Проверьте наличие недопустимых положений камеры в методе tick и отключите источники движения камеры при соблюдении условий. wasd-controls и look-controls в прилагаемом примере.

...