Я совершенно уверен, что вы не можете добавить атрибуты 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
, и на каждом цикле рендеринга применить его положение и поворот к вашему блоку.