Вращение и анимация сетки Aframe
Я пытаюсь повернуть сетку в модели aframe gltf, но, похоже, она не работает. Можно ли повернуть сетку модели gltf, добавленной во время выполнения в сцене? Я получаю сетку с установленной точкой поворота, но не могу применить к ней поворот.
Проблема: у меня есть модель двери с двумя сетками. Левая дверь и правая дверь. Я хочу повернуть дверь на 180 градусов, когда пользователь нажимает на сетку двери. На данный момент я получил событие щелчка на всем трехмерном объекте и проверял, какая сетка нажата; проверяя своего родителя и пытаясь повернуть левую дверь, но не работает. Любая идея, что мне не хватает. так
object.parent
возвращает мне тип родительского объекта, который я пытаюсь повернуть. Это правильный путь?
Вот что у меня получилось.
const newElement = document.createElement('a-entity')
// The raycaster gives a location of the touch in the scene
const touchPoint = event.detail.intersection.point
newElement.setAttribute('position', touchPoint)
//const randomYRotation = Math.random() * 360
//newElement.setAttribute('rotation', '0 ' + randomYRotation + ' 0')
newElement.setAttribute('visible', 'false')
newElement.setAttribute('scale', '4 4 4')
newElement.setAttribute('gltf-model', '#animatedModel')
this.el.sceneEl.appendChild(newElement)
newElement.addEventListener('model-loaded', () => {
// Once the model is loaded, we are ready to show it popping in using an animation
newElement.setAttribute('visible', 'true')
newElement.setAttribute('id','model')
newElement.setAttribute('class','cantap')
newElement.setAttribute('hold-drag','')
newElement.setAttribute('two-finger-spin','')
newElement.setAttribute('pinch-scale','');
/* newElement.setAttribute('animation', {
property: 'scale',
to: '4 4 4',
easing: 'easeOutElastic',
dur: 800,
}) */
newElement.addEventListener('click', event => {
const animationList = ["Action", "Action.001"];
/* newElement.setAttribute('animation-mixer', {
clip: animationList[0],
loop: 'once',
})
newElement.addEventListener('animation-loop',function() {
newElement.setAttribute('animation-mixer', {
timeScale : 0
})
}); */
var object = event.detail.intersection.object;
document.getElementById("btn").innerHTML = object.parent;
/* object.setAttribute('animation', {
property: 'rotation',
to: '0 180 0',
loop: true,
dur: 6000,
dir: 'once'
});*/
object.parent.setAttribute('rotation', {x: 0, y: 180, z: 0});
/* object.traverse((node) =>{
console.log(node.name);
document.getElementById("btn").innerHTML = ;
}); */
console.log(this.el.getObject3D('mesh').name);
// name of object directly clicked
console.log(object.name);
// name of object's parent
console.log(object.parent.name);
// name of object and its children
});
})
1 ответ
Уловка, чтобы сделать что-либо с частями модели gltf, состоит в том, чтобы пройти через gltf и изолировать объект внутри, которым вы хотите манипулировать. Вы можете сделать это, написав компонент, прикрепленный к сущности gltf, который получает базовый объект threejs и просматривает все объекты в группе gltf, а затем вы можете выбрать объект по его имени. Вы делаете это внутри "загруженного моделью" слушателя событий, например
el.addEventListener("model-loaded", e =>{
let tree3D = el.getObject3D('mesh');
if (!tree3D){return;}
console.log('tree3D', tree3D);
tree3D.traverse(function(node){
if (node.isMesh){
console.log(node);
self.tree = node;
}
});
При этом выбирается одна из моделей, она назначается переменной, которая впоследствии может быть использована для поворота модели (или выполнения с ней любых действий).
tick: function(){
if(this.tree){
this.tree.rotateY(0.01);
}
}
вот глюк