Позиционирование объектов в 3D-сцене, а затем выяснение того, на что нажал пользователь - PullRequest
1 голос
/ 16 апреля 2011

Я создаю кроссплатформенную игру на C ++, используя OpenGL ES 2.0. Цель - iPhone на данный момент. Я новичок в программировании игр, но не новичок в программировании.

Я запутался в том, как создать игру. Но, в частности, я спрашиваю о том, как настроить объекты, необходимые для позиционирования моделей в сцене.

У меня есть объект, который представляет сцену. Есть 5 сцен. Только одна сцена показана одновременно. Сцена похожа на игровой уровень. Каждая сцена имеет весь код для рендеринга, игровой логики, работы с мышью и клавиатурой. Работа с сенсорным экраном осуществляется как щелчок мыши.

Каждая сцена имеет: Это собственная проекционная матрица. Это собственная матрица «Вид» - в настоящее время не используется - всегда установлена ​​в единичную матрицу Список моделей для рендеринга

Каждая модель имеет: Список вершин Программа GLSL для визуализации себя Текстура «Модельная» матрица

Я использую матрицу ортогональной проекции.

Поскольку мы используем GLES 2, я должен делать почти все вручную. Включая матрицы. Поэтому я не использую glPushMatrix, glPopMatrix, glTranslate и т. Д. Они недоступны. Вместо этого у меня есть свои собственные функции, которые работают с моими собственными объектами Matrix.

Хорошо, вот где все становится странным для меня.

1) Настройка матрицы проекции (с использованием ортографической матрицы)

_math_matrix_ortho(&this->ProjectionMatrix, 0.0, 1.0, 0.0, (float)height / (float)width, -1.0f, 1.0f);

2) Оставьте матрицу вида в качестве единичной матрицы

3) Загрузить каждую модель

4) «Модель» матрицы каждой модели по умолчанию соответствует единичной матрице

5) Теперь я масштабирую каждую модель, чтобы сделать их правильной стороной пропорционально друг другу. Функция масштабирования регулирует матрицу модели.

model->modelMatrix.Scale(0.25, 0.25, 0.25);

6) Переместите каждую модель на место

model->modelMatrix.Translate(2.0, 0.0, 0.0);

7) Рендеринг каждой модели

{
    glUseProgram(this->_program.program);
    GL_CHECK_ERROR();

    glVertexAttribPointer(_positionLoc, 3, GL_FLOAT, GL_FALSE, 0, _vertices );
    GL_CHECK_ERROR();

    glVertexAttribPointer(_texCoordLoc, 2, GL_FLOAT, GL_FALSE, 0, _texCoords);
    GL_CHECK_ERROR();

    glEnableVertexAttribArray(_positionLoc);
    GL_CHECK_ERROR();

    glEnableVertexAttribArray(_texCoordLoc);
    GL_CHECK_ERROR();

    glBindTexture ( GL_TEXTURE_2D, _texture->getGLID() );
    GL_CHECK_ERROR();

    glUniform1i ( _texLoc, 0 );
    GL_CHECK_ERROR();

    glUniformMatrix4fv(_pMatrixLoc, 1, GL_FALSE, SceneManager::getInstance().getCurrentScene().ProjectionMatrix.m);
    GL_CHECK_ERROR();

    glUniformMatrix4fv(_vMatrixLoc, 1, GL_FALSE, this->_vMatrix.m);
    GL_CHECK_ERROR();

    glUniformMatrix4fv(_mMatrixLoc, 1, GL_FALSE, this->_mMatrix.m);
    GL_CHECK_ERROR();

    glDrawArrays ( GL_TRIANGLE_STRIP, 0, 4);
    GL_CHECK_ERROR();
}

Что мне сразу кажется странным: Уместно ли переводить матрицу модели?

Сложная часть появляется, когда я пытаюсь просмотреть проект мыши / сенсорного экрана.

1) Получить координаты мыши / сенсорного экрана

2) Отпроектировать их.

Теперь у меня есть координаты относительно матрицы просмотра. Какая матрица идентичности. Это означает, что координаты x, y переводятся в систему координат, где максимальные вертикальные и горизонтальные экстенты равны 1,0.

Как выяснить, по какому объекту щелкнули?

Кажется, чтобы ответить на мой последний вопрос, мне нужно лучше понять, где я его разместил.

Я думаю, что переоценил это. Помощь.

1 Ответ

1 голос
/ 16 апреля 2011

Вы можете либо:

1.вычислите пересечение линии с вашей моделью, это зависит от того, насколько сложна ваша модель.

2.визуализируйте изображение метки в неэкранном растровом изображении: вместо рисования светом и текстурами используются плоские цвета, которые являются метками объекта.выбрать заостренный пиксель, значение дает объект.Вы должны назначить метки для объектов, которые вы хотите обнаружить, и значение по умолчанию для всех остальных и фона.

Надеюсь, это поможет.

...