2015-07-11 3 views
0

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

PaintGl рисует мой треугольник на экран

void MeGlWindow::paintGL() 
{ 
GLint TriPositionUniformLocation = glGetUniformLocation(programID, "TriPosition"); 
TriPosition = rot * tra; 
glUniformMatrix3fv(TriPositionUniformLocation, 1, GL_FALSE, &TriPosition[0][0]); 

//glClearColor(1, 0, 0, 1); 
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glViewport(0, 0, width(), height()); 
//glDrawArrays(GL_TRIANGLES, 0, 6); 
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0); 

} 

мое обновление вызывается каждый кадр и им пытаются использовать это, чтобы получить ввод с клавиатуры, чтобы знать, когда для перемещения объекта. прямо сейчас im пытается перевести, если клавиша u или down нажата и вращается, если нажата левая или правая клавиша.

void MeGlWindow::myUpdate() 
{ 


short Left = GetAsyncKeyState(37); 
short Up = GetAsyncKeyState(38); 
short Right = GetAsyncKeyState(39); 
short Down = GetAsyncKeyState(40); 
float speed = .001f; 
float angle = 0; 


if (Left != 0) 
{ 
    angle -= .5; 
    rot = mat3(cos(angle), -sin(angle), rot[0][2], sin(angle), cos(angle), rot[1][2], rot[2][0], rot[2][1], rot[2][2]); 
    cout << "moved" << endl; 
} 

if (Right != 0) 
{ 
    angle += .5; 
    rot = mat3(cos(angle), -sin(angle), rot[0][2], sin(angle), cos(angle), rot[1][2], rot[2][0], rot[2][1], rot[2][2]); 
    cout << "moved" << endl; 
} 
if (Up != 0) 
{ 
    tra = mat3(tra[0][0], tra[0][1], tra[0][2], tra[1][0], tra[1][1], tra[1][2] + speed, tra[2][0], tra[2][1], tra[2][2]); 
    cout << "moved" << endl; 
} 
if (Down != 0) 
{ 
    tra = mat3(tra[0][0], tra[0][1], tra[0][2], tra[1][0], tra[1][1], tra[1][2] + -speed, tra[2][0], tra[2][1], tra[2][2]); 
    cout << "moved" << endl; 
} 
if (angle < 0) angle += 360; 
if (angle > 360) angle -= 360; 



paintGL(); 
} 

мой последний кусок кода vertexshadercode, что им с помощью нарисовать треугольник Aswell.

#version 430 

in layout(location=0) vec2 position; 
in layout(location=1) vec3 vertexColor; 

uniform mat3 TriPosition; 

out vec3 theColor; 

void main() 
{ 
vec4 v = vec4(position, 0.0, 1.0); 
gl_Position.x = gl_Position.x + TriPosition[0][2]; 
gl_Position.y = gl_Position.y + TriPosition[1][2]; 
theColor = vertexColor; 
}; 

Почему мой треугольник не перемещается и не вращается. Я смог сделать это, когда я не использовал opengl, но теперь потерял.

+1

Посмотрите на свой вершинный шейдер. Вы используете атрибут «position» для ввода значения 'v', который никогда не используется. Таким образом, это не влияет на результат. С другой стороны, вы используете значения из 'gl_Position', которые никогда не инициализируются. –

ответ

0

1.

Я не уверен, что без доступа к вашему конструктору TriPosition, но вполне возможно, что ваша матрица транспонированы в процессе преобразования из класса «mat3» в классе «» TriPosition ,

glUniformMatrix3fv (TriPositionUniformLocation, 1, GL_FALSE, & TriPosition [0] [0]);

Попробуйте изменить третий аргумент на GL_TRUE, который сделает ваш вход транспонированным при передаче на GPU. Проверьте и посмотрите, что произойдет.

glUniformMatrix3fv (TriPositionUniformLocation, 1, GL_TRUE, & TriPosition [0] [0]);

Причина, по которой ничего не происходит, объясняется в комментарии Рето.

2.

Хотя, я могу видеть, что ваш треугольник означает жить в 2D пространстве, попробуйте использовать mat4 вместо mat3 в вершинных шейдеров, так что вам нужно будет только умножать матрицу и вершину, вместо получить ценность, как то, что вы там делаете.

#version 430 

in layout(location=0) vec2 position; 
in layout(location=1) vec3 vertexColor; 

uniform mat4 TriPosition; 

out vec3 theColor; 

void main() 
{ 
vec4 v = vec4(position, 0.0, 1.0); 
gl_Posiiton = TriPosition * v; 
theColor = vertexColor; 
}; 

Как вы не будете иметь никакого г перевода или вращение, Ваша матрица будет выглядеть следующим образом, где r0, r1, r2, r3 являются ротационными факторами, Тм, Те являются факторами перевода:

r0 r1 0 tx  r0 r1 0 0  1 0 0 tx 
r2 r3 0 ty = r2 r3 0 0 * 0 1 0 ty 
0 0 1 0  0 0 1 0  0 0 1 0 
0 0 0 1  0 0 0 1  0 0 0 1 
TRIPOSITION = ROTATION  * TRANSLATION 

Обратите внимание, что все то же, что и матрица 3x3, если вы вынимаете ряды thrid и thrid.

3.

Я бы сказал, что это "Transform", а не "TriPosition", потому что TriPosition походит только для перевода.

4.

класс mat3 у вас есть в C++. Это от glm? Затем вы можете проверить this для создания простой матрицы преобразования.

Смежные вопросы