A-frame 根据宽度定位对象
2017-03-05
1208
我该如何将对象的长度转换为 X 坐标?我有一个动态增长的盒子,里面有许多球体,从左到右排列。我想将盒子定位在屏幕中间,所以它的中心就在屏幕的中心。当我在页面上创建框元素时,它的枢轴位于左上角,但我搞不懂如何说“将其放在中心减去框宽度的一半”。
这是创建框的代码:
for (var i=1; i<=hudItems.length; i++) {
var newSphere = document.createElement('a-sphere');
newSphere.setAttribute('radius', .3);
newSphere.setAttribute('color', '#ECECEC');
newSphere.setAttribute('position', hudEl.object3D.position.x+offSet*i + ' 0 0');
newSphere.setAttribute('src', hudItems[i-1].thumb);
newSphere.setAttribute('translate', "0 0.6 0");
var sphereShadow = document.createElement('a-image');
sphereShadow.setAttribute('src', 'radial-shadow-3.png');
sphereShadow.setAttribute('rotation', '-90 0 0');
sphereShadow.setAttribute('scale', '1 1 1');
newSphere.appendChild(sphereShadow);
hudEl.appendChild(newSphere);
}
sceneEl.appendChild(hudEl);
如果能提供任何指示,我将不胜感激 - 可能有一种简单的众所周知的方法可以做到这一点,只是我还不知道。
** 更新:
尝试使用 BoundingBoxHelper - 我之前只是像这样创建 hud:
<a-entity id="hud" position="-1.2 -2.39 -7" pivot="0 0 0" ></a-entity>
我甚至尝试过这个,这样我就可以看到它:
<a-entity id="hud" geometry="primitive: box; width:2; height:2; depth:2" position="0 0 -7" pivot="0 0 0" ></a-entity>
我添加了此代码:
var hud = document.querySelector('#hud').object3D;
var helper = new THREE.BoundingBoxHelper(hud, 0xff0000);
helper.update();
var min = helper.box.min;
var max = helper.box.max;
var newX = -1 * (max.x - min.x) / 2;
hudEl.setAttribute('position', newX + ' 0 0')
但我收到此错误: 未捕获的 TypeError:无法读取未定义的属性“updateMatrixWorld” 在 $.setFromObject (three.js:7891) 在 $n.update (three.js:41123) 在 c. (tvr2.html:103) 在 TWEEN.Tween.update (tween.js:399)
我应该指出,如果我在创建/更新该帮助程序后记录它,它就没有“box”属性或几何图形。
2个回答
您可能希望首先获取对象的边界框,包括其所有子对象。 THREE.BoxHelper 可以执行此操作:
var object = el.object3D;
var helper = new THREE.BoundingBoxHelper(object);
helper.update();
然后,将对象置于
X
轴的中心:
var min = helper.box.min;
var max = helper.box.bax;
el.setAttribute('position', {
x: -1 * (max.x - min.x) / 2,
y: 0,
z: 0
});
随着您添加旋转,数学运算会变得更加复杂,但这是一般方法。
Don McCurdy
2017-03-05
这些答案现在都过时了。
this._sidePane.addEventListener('object3dset', e => {
if(e.detail.type === 'mesh'){
var size = new window.THREE.Box3().setFromObject(object).getSize()
})
对我有用
beek
2019-05-06