OpenGL实线、虚线、点划线的绘制(16进制与2进制的巧妙结合)

说明:

实线很简单,指定两个顶点画出来就行了,关键在于用虚线、点划线绘制直线,很有意思
在这里插入图片描述

重要的函数:

glEnable(GL_LINE_STIPPLE);//打开画线模式
glLineStipple(GLint factor,GLushort pattern);//建立画线的模式
factor参数充当倍数,结合pattern和代码理解,比如factor为2时代表pattern中每位在一行中充当两个像素的开或者关。
重点就在于pattern,它是16进制的值,用来指定画线时所用的模式:
把pattern换成2进制0时不画,1时画,先看转换规则:

还是看例子理解:本文中:
glLineStipple(2,0X00FF);//画虚线
在这里插入图片描述
0X00FF的二进制位0000 0000 1111 1111,但是0时不画,1时画,为什么开始却画了,因为在应用模式时pattern是逆向使用的,即模式的最低有效位先作用于指定线段。

glLineStipple(2,0X11FF);//画点划线
在这里插入图片描述
0X11FF的二进制为:0001 0001 1111 1111,知道了pattern是逆向使用的,所以用0X11FF而不是0XFF11。

代码:

有详细的注释,因为是一次性画三条,所以打开的函数并未在初始化函数中调用,而是也写在了display中

#include <stdio.h>
#include <windows.h>
#include <GL/freeglut.h>
//摄像机离物体的距离
float G_fDistance = 3.6f;
int mode=0;
GLfloat fullline[]={-1.0,0.0,0.0,1.0,0.0,0.0};//实线的顶点数组

void myinit(void);
void myReshape(GLsizei w, GLsizei h);
void display(void);
//响应键盘输入, 从而设定物体移近移远以及旋转的回调函数
void processNormalKeys(unsigned char key,int x,int y);

//主函数
int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	//初始化OPENGL显示方式
	glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);

	//设定OPENGL窗口位置和大小
	glutInitWindowSize (400, 300); 
	glutInitWindowPosition (100, 100);
	//打开窗口
	glutCreateWindow ("画实线、虚线、点划线");
	//调用初始化函数
    myinit();
	//设定窗口大小变化的回调函数
	glutReshapeFunc(myReshape);
	//开始OPENGL的循环
	glutDisplayFunc(display); 
	glutMainLoop();

	return 0;
}


//用户初始化函数
void myinit(void)
{
	
}
//窗口大小变化时的回调函数
void myReshape(GLsizei w, GLsizei h)
{
	//设定视区
    glViewport(0, 0, w, h);
	//设定透视方式
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
	gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1.0,30.0);
}

//每桢OpenGL都会调用这个函数,用户应该把显示代码放在这个函数中
void display(void)
{
	//设置清除屏幕的颜色,并清除屏幕和深度缓冲
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
	//视角的变化
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glTranslatef(0.0,0.0,-G_fDistance);

	//画红色的实线
	//开启顶点数组画直线
	glEnableClientState(GL_VERTEX_ARRAY);
	glVertexPointer(3,GL_FLOAT,0,fullline);
	glColor3f(1.0,0.0,0.0);
	glDrawArrays(GL_LINES,0,2);
	//画绿色的虚线
	glEnable(GL_LINE_STIPPLE);//打开画线模式
	glLineStipple(2,0X00FF);//建立画线的模式
	glColor3f(0.0,1.0,0.0);
	glPushMatrix();
		glTranslatef(0.0,0.5,0.0);
		glBegin(GL_LINES);
			glVertex2f(-1.0,0.0);
			glVertex2f(1.0,0.0);
		glEnd();
	glPopMatrix();
	glDisable(GL_LINE_STIPPLE);//最后一定要关闭画线模式否则重新绘制时红色的实线也会被按虚线绘制
	//画蓝色的点划线
	glEnable(GL_LINE_STIPPLE);//打开画线模式
	glLineStipple(2,0X11FF);//建立画线的模式
	glColor3f(0.0,0.0,1.0);
	glPushMatrix();
		glTranslatef(0.0,-0.5,0.0);
		glBegin(GL_LINES);
			glVertex2f(-1.0,0.0);
			glVertex2f(1.0,0.0);
		glEnd();
	glPopMatrix();
	glDisable(GL_LINE_STIPPLE);//最后一定要关闭画线模式否则重新绘制时红色的实线也会被按虚线绘制
	//交换前后缓冲区
	glutSwapBuffers();
}

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用OpenGL绘制鼠标拖动的方法如下: 1. 首先,我们需要在OpenGL中创建一个窗口并设置好视口和投影矩阵。 2. 接下来,我们需要定义一个存储坐标的数据结构,以便在鼠标拖动过程中保存绘制。 3. 在窗口的鼠标回调函数中,我们需要监听鼠标的移动事件,获取到当前鼠标的坐标。 4. 当鼠标按下且移动时,在鼠标回调函数中调用OpenGL绘制函数,将当前鼠标的坐标作为参数传入。 5. 在绘制函数中,我们可以使用OpenGL提供的绘制的函数(如glPointSize、glBegin和glVertex),将鼠标的坐标作为的位置进行绘制。 6. 在鼠标释放时,我们可以将最后的鼠标坐标保存到数据结构中,以便在下次绘制时继续绘制。 7. 最后,在OpenGL的主函数中,我们需要循环调用绘制函数,实时更新绘制。 通过以上步骤,我们可以实现使用OpenGL绘制鼠标拖动的。在鼠标移动过程中,不断绘制得到的,实现了鼠标拖动绘制的效果。 ### 回答2: 在使用OpenGL进行鼠标拖动绘制的过程中,我们可以通过鼠标事件来获取鼠标的位置信息,并将该位置转换为OpenGL坐标系中的。 首先,我们需要注册鼠标事件的回调函数,以便在鼠标移动时获取到鼠标的位置。在鼠标移动事件中,可以获取到当前鼠标的位置坐标。通过OpenGL的视口转换函数,将该坐标转换为OpenGL坐标系中的。 在绘制函数中,我们可以通过存储鼠标移动事件时获取到的位置,并调用OpenGL绘制函数完成绘制。可以使用glPointSize函数设置的大小,使用glBegin(GL_POINTS)和glVertex2f函数绘制。 当鼠标拖动时,通过判断鼠标左键是否按下,并将鼠标移动事件的位置添加到绘制的数组中。在绘制函数中,通过遍历数组中存储的位置,调用OpenGL绘制函数完成所有绘制。 最后,在主函数中,设置OpenGL绘制模式和窗口大小,并初始化OpenGL的窗口。注册鼠标事件回调函数并进入主循环,等待鼠标事件的触发。 总结起来,通过监听鼠标事件,获取鼠标的位置信息并转换为OpenGL坐标系中的,再通过绘制函数将这些绘制出来,即可完成鼠标拖动绘制的功能。 ### 回答3: 首先,要实现在OpenGL中通过鼠标拖动绘制,我们需要考虑以下几个方面。 首先,我们需要捕捉鼠标事件以获取鼠标位置。在OpenGL中,可以通过注册回调函数来捕捉鼠标事件,如鼠标按下、移动和释放。在注册回调函数时,我们可以获取鼠标的当前坐标。 接下来,我们需要在OpenGL绘制函数中根据鼠标位置绘制。在绘制函数中,我们根据鼠标位置计算的坐标,并使用OpenGL提供的绘制函数(如glPointSize和glBegin/glEnd等)来绘制这些。 具体实现的步骤如下: 1. 注册鼠标事件回调函数,捕捉鼠标按下、移动和释放事件。可以使用GLUT库提供的glutMouseFunc和glutMotionFunc等函数。 2. 在鼠标移动事件回调函数中,获取当前鼠标位置。可以使用glutMotionFunc函数实现。 3. 在OpenGL绘制函数中,根据鼠标位置计算要绘制的坐标,并使用glBegin/glEnd函数绘制这些。可以使用glPointSize函数设置的大小。 4. 运行OpenGL程序,通过鼠标拖动来绘制。 需要注意的是,在使用OpenGL绘制的过程中,我们还可以考虑使用顶缓冲对象(VBO)来提高性能,而不是每次都重新计算的坐标。 总结起来,实现在OpenGL中通过鼠标拖动绘制的步骤包括捕捉鼠标事件、获取鼠标位置、计算的坐标以及绘制。通过这些步骤,我们可以实现简单的鼠标交互绘制的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值