OpenGL: нормализация мировой координации - PullRequest
1 голос
/ 27 января 2012

Я получаю исправленную координацию экрана (0,0 слева внизу):

GLint realy;
realy = winHeight - (GLint) y - 1;
screen.x = (float)x;
screen.y = (float)realy;

Тогда я получаю мир в zNear и zFar:

worldNear = glm::unProject(glm::vec3(screen.x, screen.y, 0.0), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));
worldFar = glm::unProject(glm::vec3(screen.x, screen.y, 1.0), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));

, ноЯ настроил свою проекцию на перспективу следующим образом, так что я знаю zFar и zNear, и я не уверен, нужен ли приведенный выше код: glm ::спектива (fovy, 1.0f * winWidth / winHeight, zNear,zFar); (нам нужно получить zNear и zFar по X, Y, Z - поэтому нам нужно распроектировать ближний и дальний)

Кроме того, обнаружить буфер Zdepth можно следующим образом:

GLfloat depth;
glReadPixels(screen.x, screen.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);

и цвета пикселей, как это:

GLubyte pixel[3];
glReadBuffer( GL_BACK );
glReadPixels(screen.x, screen.y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, (void *)pixel);

Проблема здесь : я могу получить Мир X, Y, Z, но мне нужно нормализовать координацию, чтобы я могплавно перемещать объекты с помощью мыши, как?

glm::vec4 normalizePoint = ** ??? **
world.x = normalizePoint.x;
world.y = normalizePoint.y;
world.z = normalizePoint.z;

(в настоящее время моя мировая координата слишком далеко или слишком близко, вот в чем проблема)

Редактировать : я нахожуответ на первый вопрос здесь:

iPhone OpenGL: использование gluUnProject (порт) и определение нажатия на объект

Мне нужен ray-object столкновение, это работает сейчас !!

1 Ответ

0 голосов
/ 27 января 2012

Проецируйте 2D-вектор, который у вас есть в пространстве экрана, для перемещения (например, (20,0) - это 20 пикселей вправо) в мировое пространство на той же глубине, что и объект, который вы перемещаете.

The 'той же глубины », в которой объект находится, проецируя положение объекта в пространство экрана через матрицы просмотра и проекции.

glm::vec3 addThisToYourObjectPosition = glm::unProject(glm::vec3(screenMove.x, screenMove.y, objectProjectedZ), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...