如何简单地缩放 openGL 中的对象?
How to simply Scale an object in openGL?
我正在尝试学习如何在 openGL 中进行缩放、旋转和平移,但我不确定具体如何操作。我尝试按照示例进行操作,但它不起作用。下面是我的示例代码,它没有绘制对象。谁能告诉我我做错了什么?
#include <stdlib.h>
#include <GL/glut.h>
GLfloat vertices[][2] = { { -1.0,1.0 },{ -1.0,0.857 },
{ -0.857,0.857 },{ -0.857,1.0 } };
void drawObject() {
glColor3f(0.0f, 0.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex2fv(vertices[0]);
glVertex2fv(vertices[1]);
glVertex2fv(vertices[2]);
glVertex2fv(vertices[3]);
glEnd();
}
void display(void)
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glShadeModel(GL_SMOOTH);
glColor3f(0.0f, 0.0f, 0.0f);
glPushMatrix();
glLoadIdentity();
glScalef(2.0, 2.0, 0.0);
drawObject();
glPopMatrix();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(1600, 800);
glutInitWindowPosition(0, 0);
glutCreateWindow("Window");
glutDisplayFunc(display);
glutMainLoop();
}
使用您当前的坐标和变换,您的对象就在屏幕之外。
将所有变换矩阵设置为identity时,直接在clip中绘制space。如果您从不使用 1 以外的输入 w
值(glVertex2*
将始终将 w
设置为 1),剪辑 space 等于规范化设备 space。在规范化设备 space 中,观察体积被定义为沿所有维度的立方体 [-1,1]。
但是,通过应用 glScale(2.0, 2.0, 0.0)
,您可以将对象缩放 2,中心为原点。因此,场景的可见部分是对象 space 坐标中 [-0.5,0.5] 范围内的所有内容,而您的对象完全超出该范围。
如果要缩放单个对象,应先将其平移到中心,然后再应用缩放。
以下一系列转换应该会使您的对象可见:
glScalef(2.0f, 2.0f, 1.0f);
glTranslatef(0.9285f, -0.9285f, 0.0f);
另请注意,所有这些在现代 GL 中都是弃用。您依赖于具有集成矩阵堆栈、即时模式 (Begin/End) 渲染、GL_POLYGON
原始类型的固定功能管道,这些都已从现代核心中 移除 OpenGL 的配置文件。如果您现在刚开始使用 GL,我强烈建议您学习新方法。
我正在尝试学习如何在 openGL 中进行缩放、旋转和平移,但我不确定具体如何操作。我尝试按照示例进行操作,但它不起作用。下面是我的示例代码,它没有绘制对象。谁能告诉我我做错了什么?
#include <stdlib.h>
#include <GL/glut.h>
GLfloat vertices[][2] = { { -1.0,1.0 },{ -1.0,0.857 },
{ -0.857,0.857 },{ -0.857,1.0 } };
void drawObject() {
glColor3f(0.0f, 0.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex2fv(vertices[0]);
glVertex2fv(vertices[1]);
glVertex2fv(vertices[2]);
glVertex2fv(vertices[3]);
glEnd();
}
void display(void)
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glShadeModel(GL_SMOOTH);
glColor3f(0.0f, 0.0f, 0.0f);
glPushMatrix();
glLoadIdentity();
glScalef(2.0, 2.0, 0.0);
drawObject();
glPopMatrix();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(1600, 800);
glutInitWindowPosition(0, 0);
glutCreateWindow("Window");
glutDisplayFunc(display);
glutMainLoop();
}
使用您当前的坐标和变换,您的对象就在屏幕之外。
将所有变换矩阵设置为identity时,直接在clip中绘制space。如果您从不使用 1 以外的输入 w
值(glVertex2*
将始终将 w
设置为 1),剪辑 space 等于规范化设备 space。在规范化设备 space 中,观察体积被定义为沿所有维度的立方体 [-1,1]。
但是,通过应用 glScale(2.0, 2.0, 0.0)
,您可以将对象缩放 2,中心为原点。因此,场景的可见部分是对象 space 坐标中 [-0.5,0.5] 范围内的所有内容,而您的对象完全超出该范围。
如果要缩放单个对象,应先将其平移到中心,然后再应用缩放。 以下一系列转换应该会使您的对象可见:
glScalef(2.0f, 2.0f, 1.0f);
glTranslatef(0.9285f, -0.9285f, 0.0f);
另请注意,所有这些在现代 GL 中都是弃用。您依赖于具有集成矩阵堆栈、即时模式 (Begin/End) 渲染、GL_POLYGON
原始类型的固定功能管道,这些都已从现代核心中 移除 OpenGL 的配置文件。如果您现在刚开始使用 GL,我强烈建议您学习新方法。