glm rotate 是旋转左手坐标还是右手坐标
时间: 2023-02-07 11:00:06 浏览: 110
glm rotate 是用来旋转左手坐标系的。左手坐标系是一种常用的三维坐标系,其中坐标轴的方向如下:x 轴向右,y 轴向上,z 轴向外(或者说向深处)。如果用右手指向坐标轴的方向,则拇指指向 x 轴,食指指向 y 轴,中指指向 z 轴。
如果你想旋转右手坐标系,可以使用右手坐标系旋转函数,例如 glm::rotateX(),glm::rotateY() 和 glm::rotateZ()。
相关问题
旋转是绕自身进行旋转的吗?
在OpenGL中,旋转变换默认是绕着世界坐标系进行旋转的。也就是说,如果你对一个物体进行旋转变换,那么它会绕着世界坐标系的某个轴进行旋转,而不是绕着自身进行旋转。
当然,如果你需要对物体进行绕自身的旋转,也是可以实现的。你可以在进行旋转变换之前,先进行平移变换,将物体的中心点平移到世界坐标系的原点,然后进行旋转变换。这样,旋转变换就会绕着物体自身的中心点进行旋转。
具体的实现方法如下:
1. 首先进行平移变换,将物体的中心点平移到世界坐标系的原点。
```
glm::mat4 transform = glm::mat4(1.0f);
transform = glm::translate(transform, glm::vec3(-obj_center_x, -obj_center_y, -obj_center_z));
```
这里的obj_center_x, obj_center_y, obj_center_z表示物体的中心点坐标。
2. 进行旋转变换。
```
transform = glm::rotate(transform, glm::radians(angle), glm::vec3(0.0f, 1.0f, 0.0f));
```
这里的angle表示旋转角度,glm::vec3(0.0f, 1.0f, 0.0f)表示绕着y轴进行旋转。
3. 最后再进行反向平移变换,将物体平移回原来的位置。
```
transform = glm::translate(transform, glm::vec3(obj_center_x, obj_center_y, obj_center_z));
```
这样,旋转变换就会绕着物体自身的中心点进行旋转了。
OpenGL显示图像且跟坐标移动
好的,让我们来看看如何在OpenGL中显示图像并实现坐标移动。
首先,我们需要载入一张图片。我们可以使用第三方库如SOIL来读取图片文件。SOIL提供了一个简单的接口函数`SOIL_load_image`,可以方便地读取常见的图片格式。
```
GLuint textureId;
void loadImage()
{
int width, height;
unsigned char* image = SOIL_load_image("image.png", &width, &height, 0, SOIL_LOAD_RGB);
// 生成纹理
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
SOIL_free_image_data(image);
}
```
在载入图片后,我们需要将它绑定到一个OpenGL纹理对象上。纹理对象是OpenGL中的一个对象,它可以用来保存图片数据,并应用到几何体上。我们可以使用glGenTextures函数生成一个纹理对象,并使用glBindTexture函数将它绑定到GL_TEXTURE_2D目标上。然后,我们可以使用glTexImage2D函数将图片数据加载到纹理对象上。最后,我们可以使用glTexParameteri函数设置纹理过滤方式。
接下来,我们需要在OpenGL中绘制一个矩形,并将纹理应用到矩形上。
```
void renderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// 移动物体
glTranslatef(objectPosition.x, objectPosition.y, objectPosition.z);
// 绘制矩形
glBindTexture(GL_TEXTURE_2D, textureId);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
glutSwapBuffers();
}
```
在这个示例中,我们使用glBindTexture函数将纹理对象绑定到GL_TEXTURE_2D目标上。然后,我们使用glBegin和glEnd函数来定义一个矩形,并使用glTexCoord2f函数来指定纹理坐标。glVertex3f函数用来定义矩形的四个顶点坐标。
最后,我们需要在每个时间间隔内更新物体位置,并调用glutPostRedisplay函数重新渲染场景。
完整的代码示例:
```
glm::vec3 objectPosition = glm::vec3(0.0f, 0.0f, 0.0f);
GLuint textureId;
void loadImage()
{
int width, height;
unsigned char* image = SOIL_load_image("image.png", &width, &height, 0, SOIL_LOAD_RGB);
// 生成纹理
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
SOIL_free_image_data(image);
}
void renderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// 移动物体
glTranslatef(objectPosition.x, objectPosition.y, objectPosition.z);
// 绘制矩形
glBindTexture(GL_TEXTURE_2D, textureId);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
glutSwapBuffers();
}
void update(int value)
{
// 修改物体位置
objectPosition.x += 0.1f;
glutPostRedisplay();
glutTimerFunc(16, update, 0);
}
int main(int argc, char **argv)
{
// ...
loadImage();
glutDisplayFunc(renderScene);
glutTimerFunc(0, update, 0);
// ...
glutMainLoop();
return 0;
}
```
希望这对你有所帮助!