任何从three.js Object3D中获取边界框的方法
Any way to get a bounding box from a three.js Object3D?
我正在使用Three.js和OBJLoader.js加载OBJ文件。这将返回一个3。Object3D对象,它具有您所期望的3D模型(位置矢量,向上矢量…)
我不明白的是如何为它获得一个边界框——这可能吗?
你不需要遍历对象的所有子元素;库中有一个方法可以做到这一点:THREE.Box3#setFromObject
:请参阅文档。例如,可以这样做:
var bbox = new THREE.Box3().setFromObject(obj);
获取obj
的边界框,包括它的所有子框,并考虑任何平移,旋转等
请注意,BoundingBox
助手的目的是在场景中绘制一个边界框,而不仅仅是计算一些对象的边界框。
如果您希望在对象出现在场景时设置边界框的位置和大小,请尝试使用BoundingBoxHelper:
var helper = new THREE.BoundingBoxHelper(someObject3D, 0xff0000);
helper.update();
// If you want a visible bounding box
scene.add(helper);
// If you just want the numbers
console.log(helper.box.min);
console.log(helper.box.max);
几何体上的.boundingBox
不考虑可能应用于父网格等的平移,旋转或缩放,我发现手动调整非常困难,但助手为您做了
对于任何形状,在其几何对象上,都有一个boundingBox
属性。这个属性保存一个THREE.Box3
对象。这个Box3
对象由两个THREE.Vector3
对象min
和max
组成。
var geometry = new THREE.CylinderGeometry(...);
var material = new THREE.LineBasicMaterial(...);
var mesh = new THREE.Mesh(geometry, material);
var boundingBox = mesh.geometry.boundingBox.clone();
alert('bounding box coordinates: ' +
'(' + boundingBox.min.x + ', ' + boundingBox.min.y + ', ' + boundingBox.min.z + '), ' +
'(' + boundingBox.max.x + ', ' + boundingBox.max.y + ', ' + boundingBox.max.z + ')' );
对于更复杂的形状,比如那些从JSON Object文件加载的形状,默认情况下,bounding box属性是未定义的。必须显式计算
var loader = new THREE.ObjectLoader();
loader.load(imagePath, function(object){
geometry = object.children[0].children[0].geometry; // substitute the path to your geometry
geometry.computeBoundingBox(); // otherwise geometry.boundingBox will be undefined
var boundingBox = geometry.boundingBox.clone();
alert('bounding box coordinates: ' +
'(' + boundingBox.min.x + ', ' + boundingBox.min.y + ', ' + boundingBox.min.z + '), ' +
'(' + boundingBox.max.x + ', ' + boundingBox.max.y + ', ' + boundingBox.max.z + ')' );
}
是的,你需要这样的东西:
if (object instanceof THREE.Object3D)
{
object.traverse (function (mesh)
{
if (mesh instanceof THREE.Mesh)
{
mesh.geometry.computeBoundingBox ();
var bBox = mesh.geometry.boundingBox;
// compute overall bbox
minX = Math.min (minX, bBox.min.x);
minY = Math.min (minY, bBox.min.y);
minZ = Math.min (minZ, bBox.min.z);
maxX = Math.max (maxX, bBox.max.x);
maxY = Math.max (maxY, bBox.max.y);
maxZ = Math.max (maxZ, bBox.max.z);
}
});
var bBox_min = new THREE.Vector3 (minX, minY, minZ);
var bBox_max = new THREE.Vector3 (maxX, maxY, maxZ);
var bBox_new = new THREE.Box3 (bBox_min, bBox_max);
scene.add (object);
}
编辑:此方法是在BoundingBoxHelper()
或BoxHelper()
可用之前
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- toBoolean方法类似于toString
- 如何在单击复选框后调用控制器方法
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 有没有一种方法可以使用HTML Canvas和JavaScript从一个点填充到它到达边界
- 任何在没有完全重新编程/重新编程的情况下为我的迷宫添加边界的方法
- 有没有一种方法可以获得DOM元素的边界框(以像素为单位)
- 检查边界的更好方法
- 任何从three.js Object3D中获取边界框的方法
- 在HTML5画布游戏中为“房间”创建移动边界的好方法是什么