Я разрабатываю 3D-конфигуратор. На сцене появляется куб. Если щелкнуть по стороне этого куба, появится прямоугольник. Проблема в том, что если я нажму на ту же сторону куба, поверх существующего прямоугольника будет добавлен еще один. Я хотел бы заблокировать щелкнутую сторону. Мои кубы и прямоугольники — это буферная геометрия. Я могу получить raycasting face (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;
}
}`
Я предполагаю, что вновь созданный объект, который дублируется, будет иметь то же значение глобальной позиции (проверьте это), что и уже существующий. Таким образом, вы можете просто пройтись по существующим объектам и сравнить их позиции, если они совпадают или имеют незначительную разницу в значениях позиций, а затем заблокировать.
Чтобы ускорить работу, вы можете сохранять значения глобальной позиции объектов в списке после их создания и вместо этого выполнять итерацию по списку.
пожалуйста, посмотрите мой другой ответ
см. следующий метакод, описывающий идею:
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);
Привет ! Извините за задержку, я решил свою проблему с помощью фрагмента кода в этой статье discourse.threejs.org/t/…
Может быть, это может быть полезно для людей, у которых такая же проблема. Основная идея состоит в том, чтобы создать прямоугольник и кубы с пользовательскими данными, которые имеют 6 параметров «false». От каждой грани я отбрасывал луч, и если он пересекал грань другого объекта, эта грань становилась «истинной». Проверьте это
Привет! Не могли бы вы объяснить немного больше? К сожалению, я не понимаю, как это должно работать