A-Frame с системой aframe-физики - адрес элементов пушки из javsascript? - PullRequest
0 голосов
/ 14 марта 2019

Я нахожусь в сцене A-Frame, использующей лежащий в ее основе three.js для создания таких объектов, как:

var boxMaterial = new THREE.MeshPhongMaterial( { map: boxTexture, side: THREE.BackSide, bumpMap: boxBumpMap } );
var boxGeometry = new THREE.BoxBufferGeometry( 20, 20, 20 );
var box01 = new THREE.Mesh(boxGeometry, boxMaterial);
scene.add(box01);

Как я могу, используя javascript, обратиться к базовому Cannon.js системы aframe-Physics для добавления атрибута StaticBody?

1 Ответ

2 голосов
/ 14 марта 2019

Я совершенно уверен, что вы не можете добавить атрибуты DOM к объектам js, не относящимся к DOM, таким как THREE объекты.

Статический атрибут body фактически создает новый объект (CANNON.Body с type, установленным в Cannon.Body.STATIC). aframe-physics делает синхронизацию - сетка THREE.js с Cannon.Body .

Исходный код: создание тела здесь и синхронизация здесь .

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

У вас может быть пустая сущность a-frame с атрибутом физики:

<a-entity position="0 2 -3" three-setup dynamic-body></a-entity>

, но с материалом и геометрией, установленными в компоненте a-frame:

AFRAME.registerComponent("three-setup", {
  init: function() {
     var boxMaterial = new THREE.MeshPhongMaterial({
         side: THREE.FrontSide,
     });
     var boxGeometry = new THREE.BoxBufferGeometry(1, 1, 1);
     var box01 = new THREE.Mesh(boxGeometry, boxMaterial);
     this.el.setObject3D('mesh', box01)
  }
})

Проверьте это в моей скрипке

Как отметил Дон МакКарди, наличие пользовательского компонента a-frame имеет больше преимуществ:
- Вы можете прослушать событие body-loaded, которое заметит вас при инициализации CANNON.Body
- он будет доступен с простой ссылкой: this.el.body


В противном случае вам нужно будет создать CANNON.Body, и на каждом цикле рендеринга применить его положение и поворот к вашему блоку.

...