gpt4 book ai didi

c++ - 如何在 OpenGL C++ 中旋转旋转轴?

转载 作者:行者123 更新时间:2023-11-28 05:24:17 27 4
gpt4 key购买 nike

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

...

如果我旋转物体(汽车),我想将它移动到汽车的头部。现在,无论车头如何,车只向上移动。 代码如何使目录旋转?

最佳答案

可以通过以下方式改变旋转中心:

  1. 记住,从右到左矩阵相乘,第一个变换在最右边,最后一个在左边

  2. 首先,创建一个将旋转中心带到场景原点 (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);

  3. 存储这个 vector ,我们将把它用于网格中的所有点
  4. 现在将所需的旋转应用到这个转换矩阵并将它们存储在一个新的 mat4 中,这样做:glm::mat4 final = glm::rotate(..) * origin
  5. 最后,通过创建与 vector3 相同的平移,将中心(和模型的其余部分)带回原始位置,方法如下:glm::mat4 relocate = glm::translate(relocate, center) 然后glm::mat4 final = relocate * glm::rotate(..) * origin
  6. 本质上,我们在这里所做的是将模型的中心带到原点,相对于原点平移所有点,然后围绕中心(现在是原点)旋转它们,然后将它们带回原点.
  7. 现在将此转换应用于所有模型点,显然是在顶点着色器中执行此操作。如果模型真的很小,您可以在代码中执行此操作,但这会占用大多数网格的内存。如果您不想添加另一个矩阵,可以将此 mat4 应用于模型矩阵。 model = model * final//注意,先做转换,再缩放模型

完整代码看起来像这样:(您也可以手动乘以矩阵,但 GLM 允许您将矩阵传递到 translate() 函数的参数中,然后它只是将翻译应用于当前形式的矩阵)

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() 构造函数进行转换。

关于c++ - 如何在 OpenGL C++ 中旋转旋转轴?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40856731/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com