博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenGl中如何在一个在窗口坐标中固定大小绘图
阅读量:6458 次
发布时间:2019-06-23

本文共 2343 字,大约阅读时间需要 7 分钟。

  hot3.png

void CModelView::test()//by ZhouZhuo 2014.06.21 固定大小绘图测试{		glMatrixMode(GL_PROJECTION);	glPushMatrix();	glMatrixMode(GL_MODELVIEW);	glPushMatrix();	GLfloat oldcolor[4];	glGetFloatv(GL_CURRENT_COLOR,oldcolor);	GLfloat oldlinewidth;	glGetFloatv(GL_LINE_WIDTH,&oldlinewidth);	int OpenGLVersion[2];	glGetIntegerv(GL_MAJOR_VERSION, &OpenGLVersion[0]);	glGetIntegerv(GL_MINOR_VERSION, &OpenGLVersion[1]);	glLineWidth(2);	int l = glGetError();	if (l == GL_INVALID_VALUE)	{		return;	}	glDisable(GL_LIGHTING);	float delta = 0;		float r = 100;	Pnt3 v;	Pnt3 newv;	GLdouble modelviewM[16];	glGetDoublev(GL_MODELVIEW_MATRIX,modelviewM);	MatX4 M(modelviewM);	M.Transpose();//一定要转置	MatX4 Mi = M;		Mi.Invert();	GLdouble projectionP[16];	glGetDoublev(GL_PROJECTION_MATRIX,projectionP);	MatX4 P(projectionP);	P.Transpose();	MatX4 Pi = P;	Pi.Invert();	Pnt3 centerinObjectCrood(200,0,0);	float ratio = 0.1*Pi.m[0][0]/r;	Pnt3 center2(0,0,0);	glBegin(GL_LINES);	glColor3f(1,0,0);	glVertex3f(0,0,0);	glVertex3f(500,0,0);	glColor3f(0,1,0);	glVertex3f(0,0,0);	glVertex3f(0,500,0);	glColor3f(0,0,1);	glVertex3f(0,0,0);	glVertex3f(0,0,500);	glEnd();	Pnt4 v4;	Pnt3 yu(0,1,0);	Pnt3 xu(1,0,0);	xu = xu.Normalize();	glBegin(GL_LINE_LOOP);//方法一	glColor3f(1,0,0);	for (int i = 0;i<100;i++)	{ 		delta += 2*PI/100;		v = xu*3*0.1*sin(delta) + yu*3*0.1*cos(delta);//经过模型视图矩阵,视景体投影矩阵后,坐标应为,在一个长宽高都是1的归一化视景体中		v4 = Pnt4(v.x,v.y,v.z,1);		//v *= ratio;		v4 = Mi*Pi*v4;		v4 =v4/v4.w;		glVertex3f(v4.x,v4.y,v4.z);	}	glEnd();	yu =Pnt3(0,1,0);	xu =Pnt3(1,0,0);	glBegin(GL_LINE_LOOP);//方法二	glColor3f(0,1,0);	for (int i = 0;i<100;i++)	{ 		delta += 2*PI/100;		v = xu*2*r*sin(delta) + yu*2*r*cos(delta);				v *= ratio;		v = v ;		newv = Mi*v - Mi*Pnt3(0,0,0)+ centerinObjectCrood;//注意,此处的原点坐标(0,0,0)不是零向量齐次坐标应为(0,0,0,1),不可用结合律		glVertex3f(newv.x,newv.y,newv.z);	}	glEnd();	yu = Pnt3(0,0.5,1);	xu = Pnt3(1,0,0);	yu = yu.Normalize();	glBegin(GL_LINE_LOOP);	glColor3f(0,0,1);	for (int i = 0;i<100;i++)	{ 		delta += 2*PI/100;		v = xu*2*r*sin(delta) + yu*2*r*cos(delta);				v *= ratio;		v = v;		newv = Mi*v - Mi*Pnt3(0,0,0) + centerinObjectCrood;		glVertex3f(newv.x,newv.y,newv.z);	}	glEnd();	glEnable(GL_LIGHTING);	glColor4fv(oldcolor);	glLineWidth(oldlinewidth);	glMatrixMode(GL_MODELVIEW);	glPopMatrix();	glMatrixMode(GL_PROJECTION);	glPopMatrix();}

转载于:https://my.oschina.net/syhgzz/blog/282704

你可能感兴趣的文章
js 效果
查看>>
19.Java5同步集合类的应用
查看>>
python 关键字yield解析
查看>>
<c:forEach varStatus="status">中 varStatus的作用
查看>>
Aqua Data Studio 数据库开发工具
查看>>
puppet来管理文件和软件包
查看>>
【转载】基于lucene的搜索方案
查看>>
Python基础进阶之路(一)之运算符和输入输出
查看>>
阻塞非阻塞异步同步 io的关系
查看>>
ClickStat业务
查看>>
DMA32映射问题
查看>>
Android内存泄露之开篇
查看>>
leetcode-38 Count And Say
查看>>
提高效率—编程中的技巧
查看>>
导出excel——弹出框
查看>>
高并发程序设计
查看>>
ExtJs之组件(window)
查看>>
SoapUI中如何传递cookie
查看>>
shell中的一些技巧和知识
查看>>
eclipse 导出Runnable JAR file ,双击无法执行原因与解决 双击后闪退的原因 批处理java打包文件 @echo off start javaw -jar *.jar...
查看>>