В моей программе я загружаю трехмерную сетку для просмотра и взаимодействия с ней.Пользователь может вращать и масштабировать вид.Я буду использовать матрицу вращения для поворота и вызывать 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
при расчете?
Большое спасибо!