【发布时间】:2017-10-07 20:55:51
【问题描述】:
我正在尝试创建对象的准确边界框,但如果对象未与轴对齐(我认为),则该框似乎未与对象对齐。
例如:
粉红色和更接近橙色的顶点是这面墙的 Box3.min、Box3.max,但你看到红色、绿色和蓝色不在那面墙上。您可以忽略水色顶点。
这是创建边界框的代码(返回 Box3):
static getWorldBoundingBox(model, dbId) {
return new Promise(async(resolve, reject)=>{
try{
var fragIds = await ViewerToolkit.getFragIds(
model, dbId);
if(!fragIds.length){
return reject('No geometry, invalid dbId?');
}
var fragList = model.getFragmentList();
var fragbBox = new THREE.Box3();
var nodebBox = new THREE.Box3();
fragIds.forEach(function(fragId) {
fragList.getWorldBounds(fragId, fragbBox);
nodebBox.union(fragbBox);
});
return resolve(nodebBox);
}
catch(ex){
return reject(ex);
}
});
}
这就是我从最小值、最大值创建盒子的方式:
let ddd = new THREE.Vector3(min.x, min.y, min.z);
let ddu = new THREE.Vector3(min.x, min.y, max.z);
let dud = new THREE.Vector3(min.x, max.y, min.z);
let udd = new THREE.Vector3(max.x, min.y, min.z);
let duu = new THREE.Vector3(min.x, max.y, max.z);
let uud = new THREE.Vector3(max.x, max.y, min.z);
let udu = new THREE.Vector3(max.x, min.y, max.z);
let uuu = new THREE.Vector3(max.x, max.y, max.z);
this.drawVertices([ddd,ddu,dud,udd,duu,uud,udu,uuu]);
let facesPoints = [
{
BL: ddd.clone(),
UL: ddu.clone(),
UR: udu.clone(),
BR: udd.clone()
},
{
BL: udd.clone(),
UL: udu.clone(),
UR: uuu.clone(),
BR: uud.clone()
},
{
BL: uud.clone(),
UL: uuu.clone(),
UR: duu.clone(),
BR: dud.clone()
},
{
BL: dud.clone(),
UL: duu.clone(),
UR: ddu.clone(),
BR: ddd.clone()
}
];
我想避免对所有顶点对的所有距离进行排序并取前两个的蛮力方法。
是否有另一种数据结构会暴露一个立方体的 8 个点,而不是像上面的函数一样,我可以给它多边形来构建它的 2 个点?
【问题讨论】:
标签: 3d three.js autodesk autodesk-forge autodesk-viewer