OpenGL中glVertex2f函数与gluOrtho2D的参数的对应关系,以及常见函数的对应坐标系

两个函数的函数原型如下:

glVertex(GLfloat x, GLfloat y);

gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);

简单的说前者的两个参数所代表的坐标点,必须落在后者参数所形成的坐标系内,不然该点就在viewport之外。

举个例子:

void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(9);
glBegin(GL_POINTS);
glVertex2f(67.0,67.0);//6行
glEnd();
glFlush();
}
void init()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-70.0,70.0,-70.0,70.0);//第十四行
}

如果第8行改为glVertex2f(80.0,80.0)这时就看不到这个点了。

在没有设置gluOrtho2D函数的情况下(2维的情况),默认为窗口的中心是(0,0),而到矩形的边的最远距离为0;参数大于0则该点又看不到了。

     同时,在这里也凭平时的经验总结一下opengl中的一些函数的参照坐标

     glViewport函数:它的原点(0,0)在所生产的窗口的坐下角。

     gluOrtho,glBegin,glEnd函数:它们的原点是glViewport在glutCreatWindow函数所产生的窗口的上的投影(即视口)的中心。比如说画一个点glVertex2i(0,0),在没设置gluOrtho函数(即默认时),这个点在窗口的正中间。

     glutMouseFunc(mymouse):此时鼠标指针的原点(0,0)在视口的最左上角。


    参考坐标这么多,画图时我们脑海中想要画的图到底该怎么转换到窗口里去呢?个人认为,先假设没有设置视口(viewport),即glCreateWindow函数产生的那个窗口整个就是视口(viewport)。然后窗口的中心即是gluOrtho函数的原点,用gluOrtho函数裁剪窗口,然后就用glBegin一系列的函数画图(在所裁剪的窗口上),画完后图形已经固定,再考虑用glViewport函数将图形在glCreatWindow函数所产生的窗口上进行投影。假设刚才的裁剪窗口是一个正方形,你画的图形也是个正方形而视口(viewport)也是个正方形,那么最后在窗口中生成的图形也是个正方形如果画的是正方形,裁剪窗口也是正方形,但视口(viewport)不是一个正方形那最后得到的也不是一正方形,这就是为什么在没有设置glViewport函数(即默认整个窗口为视口)时,我们用鼠标将窗口拖大、缩小时,里面之前画的正方形会跟着窗口的变化一起变化,以至于会成为一个矩形的原因。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
绘制天线波瓣图需要借助图形库,例如 OpenGL、SFML、Qt 等。以下是使用 OpenGL 在屏幕上绘制天线波瓣图的详细解释: ```cpp #include <GL/glut.h> #include <cmath> // 波瓣图的半径 const float RADIUS = 200.0f; // 波瓣图的分辨率 const int RESOLUTION = 360; // 绘制波瓣图 void drawPattern() { glBegin(GL_LINE_STRIP); // 开始绘制一条线段 glColor3f(1.0f, 1.0f, 1.0f); // 设置线段颜色为白色 for (int i = 0; i <= RESOLUTION; i++) // 循环绘制波瓣图上的每一个点 { float x = RADIUS * cos(i * M_PI / 180.0f); // 计算点的 x 坐标 float y = RADIUS * sin(i * M_PI / 180.0f); // 计算点的 y 坐标 glVertex2f(x, y); // 添加点到线段上 } glEnd(); // 结束绘制线段 } // 绘制函数 void display() { glClear(GL_COLOR_BUFFER_BIT); // 清空颜色缓存 drawPattern(); // 绘制波瓣图 glutSwapBuffers(); // 交换前后缓存 } // 初始化函数 void init() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 设置背景色为黑色 glMatrixMode(GL_PROJECTION); // 选择投影矩阵 gluOrtho2D(-RADIUS, RADIUS, -RADIUS, RADIUS); // 设置正交投影 } // 主函数 int main(int argc, char** argv) { glutInit(&argc, argv); // 初始化 GLUT 库 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 设置双缓存和颜色模式 glutInitWindowSize(400, 400); // 设置窗口大小 glutCreateWindow("Antenna Pattern"); // 创建窗口并命名 init(); // 初始化 OpenGL glutDisplayFunc(display); // 设置绘制函数 glutMainLoop(); // 进入主循环 return 0; } ``` 这个示例使用了以下 OpenGL 函数参数: - `glBegin(GL_LINE_STRIP)`:开始绘制一条线段,`GL_LINE_STRIP` 表示绘制一条连接所有点的折线; - `glColor3f(1.0f, 1.0f, 1.0f)`:设置绘制颜色为白色,参数分别表示红、绿、蓝三个分量的值; - `glVertex2f(x, y)`:添加一个点到线段上,参数分别表示点的 x、y 坐标; - `glEnd()`:结束绘制线段; - `glClear(GL_COLOR_BUFFER_BIT)`:清空颜色缓存,即将屏幕清空为背景色; - `glMatrixMode(GL_PROJECTION)`:选择投影矩阵,即设置如何将物体投影到屏幕上; - `gluOrtho2D(-RADIUS, RADIUS, -RADIUS, RADIUS)`:设置正交投影,即将坐标系的范围限制在一个矩形内; - `glutInit(&argc, argv)`:初始化 GLUT 库; - `glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)`:设置双缓存和颜色模式,即使用双缓存窗口,并使用 RGB 颜色模式; - `glutInitWindowSize(400, 400)`:设置窗口大小为 400x400 像素; - `glutCreateWindow("Antenna Pattern")`:创建窗口并命名为 "Antenna Pattern"; - `glutDisplayFunc(display)`:设置绘制函数,即每次需要绘制窗口时调用 `display()` 函数; - `glutMainLoop()`:进入主循环,等待事件响应,包括窗口关闭、鼠标点击等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值