2017-06-29 263 views
0

我正在A帧上开发游戏。 在我的游戏中,我需要制作一个拍摄效果,我正在使用枪模并将其放置在光标后面,对点击事件进行编码,以便对象将重新放置在枪的前方并朝光标方向移动。Aframe使用three.js更改对象位置

我使用setAttribute和requestAnimationFrame: -

renderObj: function(obj){ 
     window.requestAnimationFrame(function() { 
     renderObj(obj); 
     }); 
    } 

创建子弹在一个特定的方向移动的动画效果。

当函数调用自身再次,我无法检索使用

var objWorldPos = new THREE.Vector3(); 
objWorldPos.setFromMatrixPosition(obj.object3D.matrixWorld); 

通过的setAttribute设置对象的位置,每当我使用的setAttribute我也通过更新子弹标记的属性改变位置obj.attributes.position="x y z";我知道这不是最好的做法,因为我应该能够恢复位置,所以有没有办法,我可以使用three.js设置元素的位置,并使用THREE.Vector3()'s object3D.matrixWorld方法检索它...

任何非常感谢您的帮助!

回答

0

我个人不会在three.js和a-frame中混合定位对象,当通过object3D.position.set()在three.js中设置位置时,我无法通过getAttribute('position')方法检索它。
您可以通过设置指定的locataion:

el.object3D.position.x = 5; 
//OR 
el.object3D.position.set(5,4,0); 
//OR BY THE WORLD MATRIX AS 
var matrix = new THREE.Matrix4(); 
matrix.set(11,12,13,14, 
      21,22,23,24, 
      31,32,33,34, 
      41,42,43,44); 
el.object3D.applyMatrix(matrix); 
//RETRIEVE THE LOCATION: 
console.log(el.object3D.position.x); 
console.log(el.object3D.position); 
console.log(el.object3D.matrixWorld); 

据我所知14,24,34元素用于翻译,并为41,42,43位。您可以在three.js documentationa-frame documentation中获得详细信息。


ngoKevin做的东西你要实现的目标是:

通过matrixWorld

var matrixWorld = gunEl.object3D.matrixWorld; 
position.setFromMatrixPosition(matrixWorld); 
bulletEl.setAttribute('position', position); 

将子弹旋转获取枪位置:

var rotation = gunEl.getAttribute('rotation'); 
bulletRotation = bulletEl.getComputedAttribute('rotation'); 
    bulletEl.setAttribute('rotation', { 
    x: bulletRotation.x + rotation.x, 
    y: bulletRotation.y + rotation.y, 
    z: bulletRotation.z + rotation.z 
    }); 
}); 

然后通过appendChild()添加子弹并让它继续前进tick()

查看project,因为它肯定会帮助你。

+0

谢谢你的回答,它帮了我很多......如果将来有人看到这个,el.object3D.position对于任何对象都能正常工作,但是如果你正在使用它,它不会给你光标的位置,yYu需要如上所述,使用el.object3D.matrix.elements [12]访问它的位置。12是x,13是y,14是z。 – user287332