Я делаю первые шаги с OpenGL ES 2.0, пробуя что-то на моем ipod touch.Мне было интересно, как решить эту проблему с координатами ..
Чтобы объяснить лучше, я пытался нарисовать квад и повернуть / перевести его с помощью вершинного шейдера (также потому, что из того, что я прочитал, кажется единственнымспособ сделать это).
Так как я работаю с iPod, у меня есть соотношение 1.5 : 1
и область просмотра, установленная на
glViewport(0, 0, backingWidth, backingHeight);
Так что 0,0
- это центр и границыдля отсечения должно быть -1.0, -1.0
, -1.0, 1.0
и т. д. (верно?)
Чтобы нарисовать квадрат, мне пришлось использовать разные значения для координат x и y из-за соотношения сторон:
static const GLfloat lineV[] = {
-0.5f, 0.33f, 0.5f, 0.33f,
0.5f, 0.33f, 0.5f,-0.33f,
0.5f,-0.33f, -0.5f,-0.33f,
-0.5f,-0.33f, -0.5f, 0.33f,
-0.5f, 0.33f, 0.5f,-0.33f,
0.5f, 0.33f, -0.5f,-0.33f,
};
Это квадрат с обеими диагоналями (я знаю, что использование индексов было бы более эффективным, но это не главное) ..
Затем я попытался написать вершинный шейдер, чтобы вращать объект при его перемещении:
void main()
{
m = mat4( cos(rotation), sin(rotation), 0.0, 0.0,
-sin(rotation), cos(rotation), 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
m2 = mat4(1.0);
m2[1][3] = sin(rotation)*0.8;
gl_Position = position*(m*m2);
}
Это работает, но, поскольку координаты не совпадают, квад вращается при вращении.Как я должен предотвратить это?Я подумал, можно ли изменить усеченный вид, чтобы он имел разные границы (не от -1,0 до 1,0 по обеим осям, так что увеличение по оси Y решило бы проблему).
Кроме того, есть лучший способиспользовать матрицы?Я имею в виду, я привык использовать glRotatef
без указания всей матрицы. Существуют ли вспомогательные функции / конструкторы для выполнения этой задачи?