Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2020, 14:06   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
Вопрос Пересечение луча и квадрата в 3D

Здравствуйте.
До последнего не хотел создавать эту тему. Перекопал кучу сайтов, но не понял что надо делать.
Смысл вот в чём. Есть луч и квад в 3D пространстве:
Код:
vec3 rayStart; //точка начала луча
vec3 rayFinish; //точка конца луча

vec3 p1,p2,p3,p4; //точки (вершины), из которых образуется квад
Надо определить, пересекает ли луч квад и найти точку пересечения. Простейшая задача, а решить не могу. Из гугла понял, что сначала надо найти нормаль этого квада. Нормаль это, вроде как, перпендикулярный вектор. А что дальше - не понятно.
Напишите псевдокод с последовательностью действий. Или хотя-бы просто последовательность действий по пунктам.
BLACK_RAIN вне форума Ответить с цитированием
Старый 18.07.2020, 21:34   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Нужна конкретизация: луч - это отрезок или бесконечная прямая, включающая этот отрезок ? Метод решения зависит от этого, я думаю.
digitalis вне форума Ответить с цитированием
Старый 18.07.2020, 22:10   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

(The AP Professional graphics CD-ROM) Andrew S. Glassner-Graphics Gems. Volume 1-AP Professional (1995)
страницы 385-395

Вот смотри квадрат это плоскость. У тебя есть плоскость она описывается каноническим уравнением (A*X+B*Y+C*Z+D=0) или кратко N*P+D=0
N - нормаль P -множество точек плоскости D- константа кратчайшее расстояние от O(0,0,0) до плоскости.
Из своих p1,p2,p3,p4 находишь N и D.
Есть луч P=R*t+R0.
Из своих rayStart и rayFinish находишь R,R0.

Получаем систему
N*P+D=0
P=R*t+R0
Вернее 3 однотипных системы для x,y,z. Решаем каждую подситему уравнений находим P. Решать можно методом элементарных вычитаний Гаусса или через детерминанты методом Крамера.
После проверяем, что точка P лежит внутри квадрата.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 18.07.2020 в 22:20.
Pavia вне форума Ответить с цитированием
Старый 19.07.2020, 06:42   #4
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Pavia
Вот опять. Уравнения-уравнения-уравнения. Системы-системы-системы. Это я и так в интернете видел. Но я не понимаю, что с этим делать (потому что я тупой). Напишите чёткую последовательность действий по пунктам (можно даже без формул).

Цитата:
Сообщение от Pavia Посмотреть сообщение
P -множество точек плоскости
Тупой вопрос №1: как можно записать множество точек одной переменной? Это должен быть массив?
Цитата:
Сообщение от digitalis Посмотреть сообщение
Нужна конкретизация: луч - это отрезок или бесконечная прямая, включающая этот отрезок ?
ну допустим отрезок - от rayStart до rayFinish.

Последний раз редактировалось BLACK_RAIN; 19.07.2020 в 06:44.
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.07.2020, 08:36   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Это должен быть массив?
Это должно быть начало и конец.
waleri вне форума Ответить с цитированием
Старый 19.07.2020, 08:40   #6
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Это должно быть начало и конец.
начало и конец чего?
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.07.2020, 09:11   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Есть луч P=R*t+R0.
что такое P?
Цитата:
Сообщение от Pavia Посмотреть сообщение
Из своих rayStart и rayFinish находишь R,R0.
что такое R и R0?
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.07.2020, 11:24   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Цитата:
Сообщение от Pavia
Есть луч P=R*t+R0.
что такое P?
Это множество точек луча(прямой).

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Тупой вопрос №1: как можно записать множество точек одной переменной? Это должен быть массив?
Цитата:
Это бесконечное множество. Поэтому сохранить в памяти компьютера мы не можем. Но мы можем вычислить пересечение двух множеств луча и плоскости и получить 1 точку которую сохраним в памяти компьютера.
-----------------------------
Параметриское уравнение плоскости
N*P+D=0
Найдём параметры.
Нормаль вычисляется вот так вот.
N=CrossProduct(p2-p1,p4-p1);
D=-N*p1;

Цитата:
что такое R и R0?
Параметры луча.
Подставляем ваши значения P=R*t+R0 получаем rayStart==R*0+R0 откуда
R0=rayStart;
Находим R, будем считать что t=1, P=rayFinish;
R=rayFinish-rayStart;

Система
N*P+D=0
P=R*t+R0
Решаем подставим второе уравнение в первое
N*R*t+N*R0+D=0
t=-(N*R0+D)/N*R
Полученное t подставляем во второе уравнение
P=-R*(N*R0+D)/N*R+D
R - сокращается
P=-(N*R0+D)/N+D

На С++ у вас будет
P=-(N*R0+D)/N+D;

Код целиком:
Код:
vec3 N,D,R,R0;
N=CrossProduct(p2-p1,p4-p1);
D=-N*p1;
R0=rayStart;
R=rayFinish-rayStart;
P=-(N*R0+D)/N+D;
return (PointInsideTriangle(P, Tringle(p1,p2,p4)) | PointInsideTriangle(P, Tringle(p2,p3,p4)) );
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 19.07.2020, 12:04   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Спасибо, попробую. Но я не пойму, почему в конце проверяется два треугольника, если изначально был один квад?
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.07.2020, 15:05   #10
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Не пойму, каким боком квадрат до 3D
Если речь о 3D, тогда не квадрат а куб.
И у точек вектора куба не две, а три координаты.
Пример:
p0 = x0, y0, z0;
соответственно удаленные от начала координат точки вектора pn = xn, yn, zn.
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать пересечение луча и модели в OpenGL? Rasool Мультимедиа в Delphi 1 28.03.2015 23:07
Обрезание луча по границам прямоугольника С# Weyner Помощь студентам 0 10.04.2013 17:10
Обрезание луча по границам прямоугольника Weyner C# (си шарп) 0 10.04.2013 17:00
Обратный ход луча по горизонтали 04h andy301086 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 23.12.2011 12:56
Отражение луча Illusionist Общие вопросы Delphi 3 30.05.2009 23:20