Как обнаружить пересечения двух граней двух bufferGeometryBox?

Я разрабатываю 3D-конфигуратор. На сцене появляется куб. Если щелкнуть по стороне этого куба, появится прямоугольник. Проблема в том, что если я нажму на ту же сторону куба, поверх существующего прямоугольника будет добавлен еще один. Я хотел бы заблокировать щелкнутую сторону. Мои кубы и прямоугольники — это буферная геометрия. Я могу получить raycasting face (a,b,c) и faceIndex. Но как получить пересечение двух разных граней двух разных объектов? Извините за мой английский

Это мой проект https://alovert.ru

Как обнаружить пересечения двух граней двух bufferGeometryBox?Как обнаружить пересечения двух граней двух bufferGeometryBox?Как обнаружить пересечения двух граней двух bufferGeometryBox?

мой код

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;
                    }

                }`





Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
485
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я предполагаю, что вновь созданный объект, который дублируется, будет иметь то же значение глобальной позиции (проверьте это), что и уже существующий. Таким образом, вы можете просто пройтись по существующим объектам и сравнить их позиции, если они совпадают или имеют незначительную разницу в значениях позиций, а затем заблокировать.

Чтобы ускорить работу, вы можете сохранять значения глобальной позиции объектов в списке после их создания и вместо этого выполнять итерацию по списку.

Привет! Не могли бы вы объяснить немного больше? К сожалению, я не понимаю, как это должно работать

vinkovsky 28.05.2019 19:25

пожалуйста, посмотрите мой другой ответ

Aram Avetisyan 29.05.2019 10:56

см. следующий метакод, описывающий идею:

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/…

vinkovsky 30.08.2019 10:51
Ответ принят как подходящий

Может быть, это может быть полезно для людей, у которых такая же проблема. Основная идея состоит в том, чтобы создать прямоугольник и кубы с пользовательскими данными, которые имеют 6 параметров «false». От каждой грани я отбрасывал луч, и если он пересекал грань другого объекта, эта грань становилась «истинной». Проверьте это

Другие вопросы по теме