X, Y положение полуцилиндра - луч - треугольник - пересечение с пространством [-1,1] [-1,1] - PullRequest
0 голосов
/ 26 февраля 2019

Я рендерил карту тайлов в fbo, а затем перемещал полученный буфер в текстуру и рендерил ее в FSQ.Затем из событий щелчка мыши я получил координаты экрана и переместил их в область обрезки [-1,1]:

    glm::vec2 posMouseClipSpace((2.0f * myCursorPos.x) / myDeviceWidth - 
                 1.0f, 1.0f - (2.0f *  myCursorPos.y) / myDeviceHeight);

У меня есть логика в моей программе, которая на основе этих координат выбирает конкретныйплитка на текстуре.

enter image description here

Теперь, переходя к 3D, я текстурирую полуцилиндр с помощью FBO, который я использовал на предыдущем шаге:

enter image description here

В этом случае я использую точку пересечения луч-треугольник, которая попадает в цилиндр с радиусом r и высотой h.Идея состоит в том, чтобы переместить эту точку пересечения в пространство [-1,1], чтобы я мог сохранить логику в моей программе для выбора плиток

Я использую алгоритм Мёллера – Трумборе для проверки точек на цилиндре, пораженном лучом,Допустим, точка пересечения (x, y) (не уверена, находится ли точка в треугольнике, объекте или мировом пространстве. Очевидно, это мировое пространство).Я хочу перевести эту точку в пространство x: [- 1,1], y [-1,1].

Я знаю высоту своего цилиндра, равную четверти длины дуги цилиндра:

cylillHeight = myRadius * (PI / 2);

, поэтому точку на оси Y можно задать в пространстве [-1,1]:

vec2.y = (2.f * (intersectedPoint.y - myCylinder->position().y) ) / 
         (myCylinder->height()) - 1.f

иЭто прекрасно работает.

Однако, Как вычислить горизонтальную ось, которая зависит от 2 переменных x и z?

В настоящее время радиус моего цилиндра равен 1, поэтому по совпадению набор полуцилиндров вПроисхождение пошло бы от (-1, 1) по оси X, что заставило меня думать, что это было [-1,1] пространство, но оказалось, что нет.Мой следующий подход состоял в том, чтобы использовать длину дуги полукруга s = r * PI , а затем вставить это значение в уравнение:

vec2.x = (2.f * (intersectedPoint.x - myCylinder->position().x) ) / 
             (myCylinder->arcLength()) - 1.f

, но очевидно, что оно уходит на 1 единицу приотрицательное направление.

Я ценю помощь.

1 Ответ

0 голосов
/ 26 февраля 2019

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

Для этого вам также понадобится координата Z, так как должно быть two "горизонтальные" координаты.Однако вам не нужна длина дуги.

Используя относительные координаты X и Z intersectedPoint, рассчитайте полярный угол, используя atan2, и разделите на PI (угловой диапазон дуги полукруга):

vec2.x = atan2(intersectedPoint.z - myCylinder->position().z,
               myCylinder->position().x - intersectedPoint.x) / PI;
...