[英]How to rotate rotation axis in OpenGL C++?
glm :: mat4模型= glm :: mat4(1.0f);
float dir_x = 0.0f, dir_y = 1.0f, dir_z = 0.0f;
do {
// Clear the screen
glClear(GL_COLOR_BUFFER_BIT);
// Use our shader
glUseProgram(programID);
GLuint MatrixID = glGetUniformLocation(programID, "MVP");
glm::mat4 Projection = glm::perspective(glm::radians(45.0f), 4.0f / 3.0f, 0.1f, 100.0f);
//glm::mat4 Projection = glm::ortho(-1.0f,1.0f,-1.0f,1.0f,0.0f,100.0f); // In world coordinates
// Camera matrix
glm::mat4 View = glm::lookAt(
glm::vec3(0.5, 0.5, 3), // Camera is at (4,3,3), in World Space
glm::vec3(0.5, 0.5, 0), // and looks at the origin
glm::vec3(0, 1, 0) // Head is up (set to 0,-1,0 to look upside-down)
);
float rot_angle = 0.0f;
const float speed = 0.01f;
glm::vec3 dir = glm::vec3(dir_x, dir_y, dir-z);
if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS)
{
rot_angle = -1.0f;
Model = glm::translate(tri_center)* glm::rotate(glm::mat4(), glm::radians(rot_angle), glm::vec3(0, 0, -1))*glm::translate(-tri_center)*Model;
//dir left
...
如果旋转物体(汽车),我想将其移动到汽车的头部。 现在,不管汽车的头高,汽车都只能向上移动。 代码如何使目录旋转?
更改旋转中心可以通过以下方法实现:
请记住,将矩阵RIGHT TO LEFT相乘,第一个转换在最右边,最后一个在左边
首先,创建一个平移,将旋转中心带到场景的原点(0、0、0),这基本上是将x,y和z分别反转。 因此,示例中心vec3(1.0, 2.3, -5.2)
为glm::mat4 origin = glm::translate(origin, glm::vec3(-1.0, -2.3, 5.2);
glm::mat4 final = glm::rotate(..) * origin
glm::mat4 relocate = glm::translate(relocate, center)
relocate glm::mat4 relocate = glm::translate(relocate, center)
relocate glm::mat4 relocate = glm::translate(relocate, center)
然后是glm::mat4 final = relocate * glm::rotate(..) * origin
model = model * final //note, first do transformations, then scale for the model
完整的代码看起来像这样:(您也可以手动将矩阵相乘,但是GLM允许您将矩阵传递到transform translate()
函数的args中,然后将转换形式以当前形式应用于矩阵)
glm::vec3 center = vec3(1.0, 2.3, -5.2);
glm::mat4 finalTransform = glm::translate(finalTransform, glm::vec3(-1.0, -2.3, 5.2)); //first bring everything to origin, notice this is a mat4
finalTransform = glm::rotate(finalTransform, ...); //rotate how you want
finalTransform = glm::translate(finalTransform, center); //return to center
model = model * finalTransform; //apply this transformation to be calculated by the vertex shader for the object
glUniformMatrix4fv(glGetUniformLocation(sp, "model"), 1, GL_FALSE, glm::value_ptr(model)); //pass model matrix into shader program
另外,在您当前的代码中,您似乎有正确的主意,但使用的翻译功能不正确。 应该这样称呼: glm::translate(mat4, vec3)
。 至少,构造一个空的mat4
以使用glm::mat4()
构造函数进行翻译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.