У меня есть сцена, в которой я обрабатываю пару кубов в ней с помощью openGL (структура программы не использует GLUT, она находится в структуре программ win32, но я просто рисую кубы с glutSolidCube
) сейчас Я хочу выбрать эти кубы мышью, выбрав. это то, что я делаю: сначала, когда пользователь нажимает кнопку мыши на сцене, я получаю позицию мыши и пытаюсь найти ее координаты в координатах сцены (templateSkeletons - это скелет, который я создал из кубов, не более):mouse picking in opengl using `gluUnProject`
if (mouse.buttonPressed(Mouse::BUTTON_LEFT))
{
mouse.update();
templateSkeletons[0].selectionMode = true;
Vector3* points;
points = GetOGLPos();
templateSkeletons[0].setIntersectionPoints(points[0],points[1]);
}else
templateSkeletons[0].selectionMode = false;
это GerOGLPos
функция, я извлекая координаты в сцене (уведомление, что у меня есть свой собственный camrea и свою собственную матрицу проекции, но я выборки матрицу проекции здесь, в этой функции только по телефону glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);
это неправильно и Я должен получить матрицу проекций собственной камеры?):
Vector3* GetOGLPos()
{Vector3 pointsOnLine[2];
double mvmatrix[16];
double projmatrix[16];
int viewport[4];
double dX, dY, dZ, dClickY,zz;
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev (GL_MODELVIEW_MATRIX, mvmatrix);
glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);
dClickY = double (viewport[3] - mouse.yPos());
// OpenGL renders with (0,0) on bottom, mouse reports with (0,0) on top
//glReadPixels(mouse.xPos(), int(dClickY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &zz);
gluUnProject ((double) mouse.xPos(), dClickY, 0.0, mvmatrix, projmatrix, viewport, &dX, &dY, &dZ);
pointsOnLine[0] = Vector3((float) dX, (float) dY, (float) dZ);
gluUnProject ((double) mouse.xPos(), dClickY, 1.0, mvmatrix, projmatrix, viewport, &dX, &dY, &dZ);
pointsOnLine[1] = Vector3((float) dX, (float) dY, (float) dZ);
return pointsOnLine;
}
Теперь я полагаю, что у меня есть две точки, указывающие мой луч на сцене. теперь, когда я делаю кубы, я пытаюсь рассчитать расстояние линии, созданной лучом и кубом, и если оно меньше значения, я меняю цвет куба, чтобы знать, что я его выбрал (суставыОфШкелетон указывает каждый куб, который не создается скелет больше ничего, здесь я тестирую только куб номер 6 в массиве):
if(selectionMode)
{
distToLine = Vector3::PointToLineDistance3D(rayPoints[0],rayPoints[1],Vector3::Vector3(jointsOfSkeleton[6].x,
jointsOfSkeleton[6].y,jointsOfSkeleton[6].z));
//distToLine = sqrt(distToLine);
if(distToLine < 0.5)
glColor3f(1.0,0.0,0.0);
else
glColor3f(1.0,1.0,1.0);
}
, когда я нажимаю на нерелевантные позиции на окне я вижу цвета изменений куба, он не работает правильно, я смотрю расстояния на отладчике, и расстояния не выглядят правильно. и это функция, которую я использовал для поиска расстояния Line-точка:
static float PointToLineDistance3D(Vector3 a, Vector3 b, Vector3 point)
{
Vector3 lineDirection = b - a;
float t = (Vector3::dot(point,lineDirection) - Vector3::dot(lineDirection,a))/(Vector3::dot(lineDirection,lineDirection));
Vector3 direction;
direction.x = a.x + (lineDirection.x *t) - point.x;
direction.y = a.y + (lineDirection.y *t) - point.y;
direction.z = a.z + (lineDirection.z *t) - point.z;
float ShortestDistance = sqrtf((direction.x*direction.x)+(direction.y*direction.y)+(direction.z*direction.z));
return ShortestDistance;
}
позвольте мне попробовать, я скоро вернусь – user667222
В моем классе 'Vector3' есть ваши предположения. но эта модификация в коде не решила проблему. как я уже сказал, я использую матрицу проекции по умолчанию. Разве вы не думаете, что я являюсь причиной проблемы? как я могу использовать его вместо 'glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);' – user667222
хорошее понимание: код, в котором вы используете свою собственную матрицу, не отображается, но вы, вероятно, установите его в конвейере преобразования OpenGL с помощью 'glLoadMatrix'. Если это так, то вам нужно только предоставить эту же матрицу для 'gluUnproject', а не тот, который вы получите с помощью' glGetDouble': это может быть или не быть одинаковой матрицей в зависимости от того, что вы делаете между рендерингом и пользователем код взаимодействия. Я переопределил функцию, чтобы проверить ее, и, возможно, ваш код каким-то образом оптимизирован, я не мог видеть сходство с моим. – didierc