вращение в OpenGL имеет разное влияние каждый раз - PullRequest
2 голосов
/ 11 октября 2019

Я пытаюсь изучить Opengl, кодируя некоторые вещи, но все еще не в состоянии понять концепцию вращения

вот мой код:

glm::mat4 projection1 = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
glm::mat4 view1 =camera.GetViewMatrix();////    //
ourShader.setMat4("projection", projection1);
ourShader.setMat4("view", view1);
ourShader.setInt ("pass1",1);           
glm::mat4 model1 = glm::mat4(1.0f);
vangle+=0.1;
float cvangle = (vangle-90)*PI /180;
model1=glm::translate (model1 ,glm::vec3(cos(cvangle )*50,0,sin(cvangle )*50));
model1 = glm::scale(model1, glm::vec3(1,1, 1));             
model1 = glm::rotate(model1,3.0f , glm::vec3(1, 0, 0));
model1 = glm::rotate(model1,2.0f, glm::vec3(0, 1, 0)); 
ourShader.setMat4("model", model1);
ourModel.Draw(ourShader);

Вертолет должен вращаться вокругкамера, но моя проблема, вращение оказывает различное влияние на каждый угол, то есть под углом 0 выглядит так

angle 0

где угол 90 выглядит так

angle 90

Моя цель - вращать вертолет вокруг камеры, показывая всегда одну и ту же сторону. Любая помощь приветствуется

1 Ответ

1 голос
/ 11 октября 2019

Если вы хотите повернуть объект на месте, то вы должны поставить точку вращения перед переводом:

model = translate * rotate;

Если вы хотите повернуть вокруг точки, то вы должны перевестиобъект (по радиусу вращения), а затем поверните переведенный объект:

model = rotate * translate

Обратите внимание, что такие операции, как rotate, scale и translate, определите новую матрицу и умножьте входную матрицу на новую матрицу.

Итак, в вашем случае translate необходимо выполнить после поворота (rotate) вокруг оси z:

vangle+=0.1;

glm::mat4 model1 = glm::mat4(1.0f);

model1 = glm::rotate(model1, glm::radians(vangle), glm::vec3(0, 0, 1)); 
model1 = glm::translate(model1, glm::vec3(50.0f, 0.0f, 0.0f);

model1 = glm::scale(model1, glm::vec3(1, 1, 1));
...