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