Как мне найти пересечение щелчка мышью и 3D-сетки? - PullRequest
4 голосов
/ 03 декабря 2010

В моей программе я загружаю трехмерную сетку для просмотра и взаимодействия с ней.Пользователь может вращать и масштабировать вид.Я буду использовать матрицу вращения для поворота и вызывать multmatrix, чтобы повернуть вид, и масштабировать, используя glScalef.Пользователь также может нарисовать сетку, и поэтому мне нужно перевести координаты мыши, чтобы увидеть, пересекается ли она с сеткой.

Я прочитал http://www.opengl.org/resources/faq/technical/selection.htm и метод, в котором я используюgluUnproject в ближней и дальней плоскостях и вычитание, и у меня есть некоторый успех с этим, но только когда позиция gluLookAt равна (0, 0, z), где z может быть любым разумным числом.Когда я перемещаю позицию, чтобы сказать (0, 1, z), она становится бесполезной и возвращает пересечение, где есть только пустое пространство, и не возвращает пересечения, где сетка явно находится под мышью.

Этокак я делаю луч от щелчка мыши до сцены:

float hx, hy;
hx = mouse_x;
hy = mouse_y;

GLdouble m1x,m1y,m1z,m2x,m2y,m2z;
GLint viewport[4];
GLdouble projMatrix[16], mvMatrix[16];
glGetIntegerv(GL_VIEWPORT,viewport);
glGetDoublev(GL_MODELVIEW_MATRIX,mvMatrix);
glGetDoublev(GL_PROJECTION_MATRIX,projMatrix);

//unproject to find actual coordinates
gluUnProject(hx,scrHeight-hy,2.0,mvMatrix,projMatrix,viewport,&m1x,&m1y,&m1z);
gluUnProject(hx,scrHeight-hy,10.0,mvMatrix,projMatrix,viewport,&m2x,&m2y,&m2z);

gmVector3 dir = gmVector3(m2x,m2y,m2z) - gmVector3(m1x,m1y,m1z);
dir.normalize();

gmVector3 point;
bool intersected = findIntersection(gmVector3(0,0,5), dir, point);

Я использую glFrustum, если это имеет какое-то значение.

Код findIntersection действительно длинный, и я 'Я уверен, что это работает, поэтому я не буду публиковать его, если кто-то не захочет его увидеть.Суть в том, что для каждого лица в сетке найдите пересечение между лучом и плоскостью, а затем посмотрите, находится ли точка пересечения внутри лица.

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

Я также еще не сделал матрицу вращения или что-то еще с glScalef, поэтому кто-нибудь может дать мне понимание этого?Как, например, unproject счет для вызовов multmatrix и glScalef при расчете?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 05 декабря 2010

направляя луч от камеры к сцене, используя луч dir, я должен был использовать:

bool intersected = findIntersection(gmVector3(m1x,m1y,m1z), dir, point); 

(обратите внимание, что другой вектор передается функции).Это решило мою проблему и, в конце концов, не имело никакого отношения к gluLookAt!

Кроме того, для второй части вопроса, которую я задал, да, unproject учитывает glScale и glmultmatrixфункции.

0 голосов
/ 04 декабря 2010

Решение с трассировкой лучей.Луч, который вы снимаете, определяется через две точки.Первый - это источник камеры, второй - положение мыши, спроецированное на плоскость обзора сцены (плоскость, которую вы описываете с помощью glFrustum).Пересечение этого луча с вашей моделью - это точка, где щелчок мышью коснулся модели

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...