Попытка создать функциональный код для выбора объектовC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Попытка создать функциональный код для выбора объектов

Сообщение Гость »


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

unsigned int InSceneGizmo::EntitySelector(unsigned int selectedentity) { glm::vec2 currmouse { ImGui::GetMousePos().x, ImGui::GetMousePos().y }; //убедимся, что мышь находится в области просмотра, прежде чем будет выбран объект если (IsMouseWithinViewport()) { если (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { float x_ndc = currmouse.x/(_ViewPortInfo.z/2) - 1.f; float y_ndc = 1.f - currmouse.y/(_ViewPortInfo.w/2); // Создаем начальную и конечную позицию луча в NDC glm::vec4 rayStart_NDC(x_ndc, y_ndc, -1.0f, 1.0f); glm::vec4 rayEnd_NDC(x_ndc, y_ndc, 0.0f, 1.0f); std::cout GetCamController()->GetDefaultCamera(); // Преобразование лучевой проекции из NDC в мировое пространство glm::mat4 InverseProjectionMatrix = glm::inverse(DefaultCamera->GetCameraProj()); glm::mat4 InverseViewMatrix = glm::inverse(DefaultCamera->GetCameraViewMat()); std::cout 0.0f || -ey + BoundingBox.BBMax.y < 0.0f) { вернуть ложь; } } //Проверка пересечения луча и двух плоскостей, перпендикулярных оси Z OBB glm::vec3 zaxis(objectmatrix[2].x, objectmatrix[2].y, objectmatrix[2].z); float ez = glm::dot(zaxis, delta); float fz = glm::dot(rayDirection, zaxis); если (fabs(fz) > 0,001f) { float t1 = (ez + BoundingBox.BBMin.z)/fz; // Пересечение с "левой" плоскостью float t2 = (ez + BoundingBox.BBMax.z)/fz; // Пересечение с "правой" плоскостью //если t1 не ближайшее пересечение, меняем местами с t2 если (t1 > t2) { станд::своп(т1, т2); } //tmax — ближайшее пересечение «max» (среди осей x,y,z) если (t2 < tmax) { tмакс = t2; } //tmin — ближайшее пересечение «min» (среди осей x,y,z) если (t1 > tmin) { Тмин = Т1; } //если tmax меньше tmin, то пересечения нет если (tmax < tmin) { вернуть ложь; } } //Редкий случай, когда луч почти параллелен объекту, что приводит к «отсутствию взаимодействия» еще { if (-ez + BoundingBox.BBMin.z > 0.0f || -ez + BoundingBox.BBMax.z < 0.0е) { вернуть ложь; } } // Луч пересекает OBB вернуть истину; } последний фрагмент – это то, как создается rayOBB с использованием tmax и tmin и отслеживанием того, пересекается ли луч внутри или снаружи панелей.

Я не могу понять, что я делаю неправильно, потому что логически шаги для каждой функции основаны на моем понимании преобразования луча из NDC в мир и OBB из локального в мир и тестирования пересечения. Но когда я тестирую и нажимаю на объект, вычисления кажутся искаженными, когда я распечатываю отладочную информацию


Изображение

Изображение

Изображение

Изображение


Это 4 разных снимка экрана с распечаткой каждого вектора и матрицы, когда я щелкаю в 4 разных точках окна просмотра: вверху слева, внизу слева, вверху справа, внизу справа (не по порядку)

Я слышал об использовании вершин для выбора объектов, но с моим текущим движком это невозможно. Я очень надеюсь, что предоставленные ответы или отзывы больше связаны с raycasting
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»