Доступ к участникам Raycaster

В своей сцене я использую сценарий для создания объекта с компонентом Raycaster. Это отлично работает, и слушатели событий работают нормально, сталкиваясь с моим наземным объектом. Но моя земля неровная, и мне нужно знать высоту земли, на которую попадает Raycaster. Насколько я знаю, это невозможно только с тем, что предоставляет A-Frame. Я хотел бы вызвать THREE raycaster.intersectObject, но я не могу получить рабочую ссылку на THREE raycaster. В документации A-Frame упоминается участник с именем raycaster, но для меня он не определен. Я пробовал несколько разных вещей, но безуспешно. Следующим моим планом было создание нового компонента, но я решил, что сначала спрошу здесь.

var ray = document.createElement('a-entity');
ray.setAttribute('id', 'raycaster');
ray.setAttribute('raycaster', 'objects: #ground');
ray.setAttribute('position', pos);
ray.setAttribute('rotation', '-90 0 0');
scene.appendChild(ray);

var ground = document.querySelector('#ground');

ray.addEventListener('raycaster-intersection', function() {
    console.log(ray.raycaster);         //undefined
    console.log(ray.intersectedEls);    //undefined
    console.log(ray.objects);           //undefined
    console.log(ray.object3D.id);       //gives me the THREE id
    console.log(ray.object3D.intersectObject(ground.object3D, false));  //intersectObject not a function
});

Какие-нибудь подсказки? Я уверен, что делаю глупость.


person Tom Jackson    schedule 13.10.2016    source источник


Ответы (2)


Это член компонента, который вам придется искать.

ray.components.raycaster.raycaster

  • ray - сущность
  • .components - компоненты сущности
  • .raycaster - компонент Raycaster
  • .raycaster - объект raycaster как член компонента raycaster
person ngokevin    schedule 13.10.2016
comment
Спасибо, это очень помогло! - person Tom Jackson; 13.10.2016

Вот полный компонент, если кому-то интересно. Просто добавьте к своей сущности «приземление». Если вы хотите, чтобы объекты стояли на земле, вы можете добавить их в качестве дочерних к сущности и установить их относительное положение по оси Y равным половине высоты объекта.

Должен по-прежнему быть улучшен с помощью селектора "target", хотя в настоящее время земля должна быть с идентификатором 'ground'.

        AFRAME.registerComponent('set-to-ground', {
            schema: {
                type: 'string'
            },
            init: function () {
                var data = this.data;
                var el = this.el;
                var scene = document.getElementById('ascene');
                var ray = document.createElement('a-entity');
                ray.setAttribute('id', 'raycaster');
                ray.setAttribute('raycaster', 'objects: #ground');
                ray.setAttribute('rotation', '-90 0 0');
                el.appendChild(ray);

                var ground = document.querySelector('#ground');

                ray.addEventListener('raycaster-intersection', function getY() {
                    console.log(ray.components.raycaster.raycaster.intersectObject(ground.object3D, true)[0].point.y); //groundPos to log
                    var groundPos = ray.components.raycaster.raycaster.intersectObject(ground.object3D, true)[0].point.y;
                    ray.removeEventListener('raycaster-intersection', getY);
                    el.setAttribute('position', {y: groundPos});
                });

            }
        });
person gerd hübner    schedule 24.04.2017