Я пытаюсь использовать то, что многие люди, кажется, находят хорошим способом, я вызываю gluUnproject 2 раза с разными z-значениями, а затем пытаюсь вычислить вектор направления для луча из этих двух векторов.
Я прочитал этот вопрос и попытался использовать эту структуру для своего собственного кода:
glGetFloat(GL_MODELVIEW_MATRIX, modelBuffer);
glGetFloat(GL_PROJECTION_MATRIX, projBuffer);
glGetInteger(GL_VIEWPORT, viewBuffer);
gluUnProject(mouseX, mouseY, 0.0f, modelBuffer, projBuffer, viewBuffer, startBuffer);
gluUnProject(mouseX, mouseY, 1.0f, modelBuffer, projBuffer, viewBuffer, endBuffer);
start = vecmath.vector(startBuffer.get(0), startBuffer.get(1), startBuffer.get(2));
end = vecmath.vector(endBuffer.get(0), endBuffer.get(1), endBuffer.get(2));
direction = vecmath.vector(end.x()-start.x(), end.y()-start.y(), end.z()-start.z());
Но это возвращает только однородные координаты клипа (я считаю), поскольку они варьируются только от -1 до 1 по каждой оси.
Как на самом деле получить координаты, по которым я могу создать луч?
РЕДАКТИРОВАТЬ: Вот как я строю матрицы:
Matrix projectionMatrix = vecmath.perspectiveMatrix(60f, aspect, 0.1f,
100f);
//The matrix of the camera = viewMatrix
setTransformation(vecmath.lookatMatrix(eye, center, up));
//And every object sets a ModelMatrix in it's display method
Matrix modelMatrix = parentMatrix.mult(vecmath
.translationMatrix(translation));
modelMatrix = modelMatrix.mult(vecmath.rotationMatrix(1, 0, 1, angle));
ИЗМЕНИТЬ 2:
Вот так функция выглядит сейчас:
private void calcMouseInWorldPosition(float mouseX, float mouseY, Matrix proj, Matrix view) {
Vector start = vecmath.vector(0, 0, 0);
Vector end = vecmath.vector(0, 0, 0);
FloatBuffer modelBuffer = BufferUtils.createFloatBuffer(16);
modelBuffer.put(view.asArray());
modelBuffer.rewind();
FloatBuffer projBuffer = BufferUtils.createFloatBuffer(16);
projBuffer.put(proj.asArray());
projBuffer.rewind();
FloatBuffer startBuffer = BufferUtils.createFloatBuffer(16);
FloatBuffer endBuffer = BufferUtils.createFloatBuffer(16);
IntBuffer viewBuffer = BufferUtils.createIntBuffer(16);
//The two calls for projection and modelView matrix are disabled here,
as I use my own matrices in this case
// glGetFloat(GL_MODELVIEW_MATRIX, modelBuffer);
// glGetFloat(GL_PROJECTION_MATRIX, projBuffer);
glGetInteger(GL_VIEWPORT, viewBuffer);
//I know this is really ugly and bad, but I know that the height and width is always 600
// and this is just for testing purposes
mouseY = 600 - mouseY;
gluUnProject(mouseX, mouseY, 0.0f, modelBuffer, projBuffer, viewBuffer, startBuffer);
gluUnProject(mouseX, mouseY, 1.0f, modelBuffer, projBuffer, viewBuffer, endBuffer);
start = vecmath.vector(startBuffer.get(0), startBuffer.get(1), startBuffer.get(2));
end = vecmath.vector(endBuffer.get(0), endBuffer.get(1), endBuffer.get(2));
direction = vecmath.vector(end.x()-start.x(), end.y()-start.y(), end.z()-start.z());
}
Я пытаюсь использовать свою собственную матрицу проекции и вида, но это дает только более странные результаты.
С помощью GlGet ... я получаю это, щелкнув в правом верхнем углу:
начало: (0,97333336, -0,98, -1,0)
конец: (0,97333336, -0,98, 1,0)
Когда я использую свои собственные материалы, я получаю это для той же позиции:
start: (-2.4399707, -0.55425626, -14.202201)
end: (-2.4399707, -0.55425626, -16.198204) em >
Теперь мне действительно нужна матрица modelView, а не просто матрица представления, но я не знаю, как мне ее получить, поскольку она изменяется и создается заново при каждом вызове отображения каждого объекта.
Но действительно ли это эта проблема? В этом руководстве он говорит: «Обычно, чтобы попасть в пространство клипа из глазного пространства, мы умножьте вектор на матрицу проекции. Мы можем вернуться назад, умножив на обратную матрицу ». и на следующем шаге он снова умножит на обратную матрицу вида, поэтому я подумал, что это то, что я должен на самом деле делать?
ИЗМЕНИТЬ 3:
Здесь я попробовал то, что предложил user42813:
Matrix view = cam.getTransformation();
view = view.invertRigid();
mouseY = height - mouseY - 1;
//Here I only these values, because the Z and W values would be 0
//following your suggestion, so no use adding them here
float tempX = view.get(0, 0) * mouseX + view.get(1, 0) * mouseY;
float tempY = view.get(0, 1) * mouseX + view.get(1, 1) * mouseY;
float tempZ = view.get(0, 2) * mouseX + view.get(1, 2) * mouseY;
origin = vecmath.vector(tempX, tempY, tempZ);
direction = cam.getDirection();
Но теперь значения направления и исходной точки всегда одинаковы:
origin: (-0.04557252, -0.0020000197, -0.9989586)
direction: (-0.04557252, -0.0020000197, -0.9989586)
gluUnProject
предполагается полностью вернуться к координатам пространства объекта. Скорее всего, у вас есть идентификационная матрица ModelView / Projection. На какую версию GL вы нацеливаетесь? Я легко могу увидетьglGetFloat (...)
возврат неинициализированных матриц, например, если вы используете ядро GL 3.2. В этом случае будет определено только окно просмотра, и это объяснит, почему вы возвращаетесь только в пространство клипа. - person Andon M. Coleman   schedule 19.09.2014GL_ARB_compatibility
одним из расширений в строке расширений? Более того, если вы строите матрицы с использованием отдельной библиотеки, почему вы пытаетесь запрашивать их из OpenGL? - person Andon M. Coleman   schedule 19.09.2014