我正在开发3d配置器。多维数据集出现在场景中。如果单击此立方体的侧面,将显示一个矩形。问题是,如果单击多维数据集的同一侧,则会在现有矩形的上方添加另一个。我想阻止点击的一面。我的立方体和矩形是缓冲区几何。我可以获得光线投射的面部(a,b,c)和faceIndex。但是如何获得两个不同对象的两个不同面的交集?对不起,我的英语
这是我的项目https://alovert.ru
我的代码
if (intersect) {
var index = Math.floor( intersect.faceIndex / 6 );
if ( intersect.object.name == 'cube' ) {
switch ( index ) {
case 0: load( intersect.object.position.x + 6.58, intersect.object.position.y, intersect.object.position.z, 'beam', 0, 0, 0 ); break;
case 1: load( intersect.object.position.x - 6.58, intersect.object.position.y, intersect.object.position.z, 'beam', 0, 0, 0 ); break;
case 2: load( intersect.object.position.x, intersect.object.position.y + 6.58, intersect.object.position.z, 'beam', 0, 0, 90 ); break;
case 3: load( intersect.object.position.x, intersect.object.position.y - 6.58, intersect.object.position.z, 'beam', 0, 0, 90 ); break;
case 4: load( intersect.object.position.x, intersect.object.position.y, intersect.object.position.z + 6.58, 'beam', 0, 90, 0 ); break;
case 5: load( intersect.object.position.x, intersect.object.position.y, intersect.object.position.z - 6.58, 'beam', 0, 90, 0 ); break;
}
}`
答案 0 :(得分:0)
我想重复创建的新对象将具有与已经存在的对象相同的全局位置(检查this)值。因此,您可以简单地遍历现有对象并比较它们的位置,如果它们匹配或位置值有微小差异,则进行阻塞。
为使操作更快,您可以在创建对象后将其全局位置值保留在列表中,然后遍历列表。
答案 1 :(得分:0)
请参阅以下描述此想法的元代码:
let newObject = loadObject(...);
parentObj.add(newObject);
newObject.position.set(new_x, new_y, new_z);
let globalPosition = new THREE.Vector3();
newObject.getWorldPosition(globalPosition);
for (let i = 0; i < existingPositions.length; i++){
if( existingPositions[i].x === globalPosition.x
&& existingPositions[i].y === globalPosition.y
&& existingPositions[i].z === globalPosition.z) {
parentObj.remove(newObject);
return;
}
}
existingPositions.push(globalPosition);
答案 2 :(得分:0)
也许对有相同问题的人有用。 主要思想是使用userData创建具有6个参数“ false”的矩形和立方体。我从每张脸发出光线,如果它与其他对象的脸相交,则该脸变为“真实”。 Check it out