PIXELFORMATDESCRIPTOR

合集下载

基于OpenGL的三维图形绘制实验

基于OpenGL的三维图形绘制实验

基于OpenGL的三维图形绘制实验基于OpenGL的三维图形绘制实验⽬录实验题⽬:交互图形程序设计基础实验 (3)1.实验⽬的 (3)2.实验内容 (3)2.1 实验内容 (3)2.2 实验任务 (3)3.实验过程 (4)3.1 预处理 (4)3.3 主要函数说明 (5)3.4 过程描述 (6)3.5 运⾏截图 (7)4.实验结果 (7)5.实验体会 (7)实验题⽬:交互图形程序设计基础实验1.实验⽬的1)理解并掌握三维基本图形数据结构表⽰⽅法。

2)掌握编写OpenGL图形程序的基本⽅法.3)掌握OpenGL基本图形表⽰及绘制。

2.实验内容2.1 实验内容基于OpenGL的三维图形绘制实验⽬的是掌握图形信息的表⽰、数据的组织,在此基础上基于OpenGL绘制出三维图形。

实验内容包括OpenGL编程环境搭建、OpenGL程序结构、基本数据类型、核⼼函数等的使⽤;基本图形的绘制(点、线段、折线、闭合折线、多边形、三⾓形、三⾓扇、三⾓条带、四边形、四边形条带等)及图形属性控制(线宽、颜⾊、线型、填充样式等);对指定的若⼲三维模型进⾏建模、绘制,在⼀个程序框架下实现,提交1次程序,1份实验报告。

2.2 实验任务1、使⽤Visual C++建⽴⼀个单⽂档(SDI)程序,完成OpenGL绘制框架程序的设计。

在此基础上参照提供的资料,定义绘制函数,基于⾃定义的若⼲点坐标与颜⾊,分别绘制绘制点、线段、不闭合折线、闭合折线、多边形、三⾓形、四边形、三⾓扇、三⾓条带、四边形条带。

2、使⽤1中建⽴的程序框架,完成如下任务:(1)绘制正棱柱(底⾯多变形的边数及⾼度可以通过对话框输⼊)(2)正棱锥(底⾯多变形的边数及⾼度可以通过对话框输⼊)(3)正棱台(底⾯多变形的边数、台⾼、锥⾼可以通过对话框输⼊)注意模型坐标系的选择和顶点坐标的计算,每个图形的绘制单独写成函数。

加⼊菜单绘制三、四、五、六边的情况,其他边数情况从弹出对话框中输⼊参数,然后绘制。

OpenGL完全教程 第一章 初始化OpenGL

OpenGL完全教程 第一章 初始化OpenGL

OpenGL完全教程 第一章 初始化OpenGL作者:何咏 日期:2006-2-3 20:47:09 点击:3373如需转载本文,请声明作者及出处。

第一章初始化OpenGL无论是什么东西,要使用它,就必须对它进行初始化。

如果你之前使用过GDI,你应该也多多少少了解到GDI 在绘制图形之前要为之创建渲染环境。

OpenGL也一样。

本章给出的代码,大家可以不必理解其中的具体意义,反正以后每次初始化是使用这个代码即可。

首先,在一个新的应用程序中,我们需要添加对OpenGL库的引用。

Delphi已经为我们写好了OpenGL的头文件,因此我们只须直接在单元的uses中添加OpenGL即可:...uses Windows, Graphics, OpenGL, ......在创建窗口时,应添加如下代码:procedure Form1.Create(Sender:TObject);var DC: HDC;HRC :HGLRC ; pfd:TPIXELFORMATDESCRIPTOR; pixelFormat:integer;beginDC := GetDC(Handle);With pfd dobeginnSize:=sizeof(TPIXELFORMATDESCRIPTOR); // sizenVersion:=1; // versiondwFlags:=PFD_SUPPORT_OPENGL or PFD_DRAW_to_WINDOW orPFD_DOUBLEBUFFER; // support double-bufferingiPixelType:=PFD_TYPE_RGBA; // color typecColorBits:=24; // preferred color depthcRedBits:=0;cRedShift:=0; // color bits (ignored)cGreenBits:=0;cGreenShift:=0;cBlueBits:=0;cBlueShift:=0;cAlphaBits:=0;cAlphaShift:=0; // no alpha buffercAccumBits:=0;cAccumRedBits:=0; // no accumulation buffer,cAccumGreenBits:=0; // accum bits (ignored)cAccumBlueBits:=0;cAccumAlphaBits:=0;cDepthBits:=16; // depth buffercStencilBits:=0; // no stencil buffercAuxBuffers:=0; // no auxiliary buffersiLayerType:=PFD_MAIN_PLANE; // main layerbReserved:=0;dwLayerMask:=0;dwVisibleMask:=0;dwDamageMask:=0;end;pixelFormat := ChoosePixelFormat(DC, @pfd);if (pixelFormat = 0) thenexit;if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) thenexit;hRc := wglCreateContext(DC);wglMakeCurrent(DC,HRC);end;上面的代码是Windows下初始化OpenGL的固定代码。

OpenGL安装

OpenGL安装

OpenGL版本与OpenGL扩展机制1 opengl的版本区别(在opengl官方文档中有详细说明)针对Opengl不同版本的升级是主要是扩展指令集。

1.1 opengl1.11995年,SGI推出了更为完善的OpenGL 1.1版本。

OpenGL 1.1的性能比1.0版提高甚多。

其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。

1.2 opengl1.32001年8月,ARB发布OpenGL 1.3规范,它增加了立方纹理贴图、纹理环境、多重采样、纹理框架压缩等扩展指令,但是改进程度非常有限。

1.3 opengl1.42002年7月,ARB正式发布OpenGL 1.4,它也只加入了深度纹理/阴影纹理、顶点设计框架、自动纹理贴图等简单的功能。

1.3 opengl1.52003年的7月,ARB公布OpenGL 1.5规范。

OpenGL 1.5内包含ARB制定的“正式扩展规格绘制语言”(OpenGL Shading Language v1.0),该语言用于着色对象、顶点着色、片断着色等扩展功能,同时也将作为下一代OpenGL 2.0版本的内核。

OpenGL 1.5的变化还增加了顶点缓冲对象(可提高透视性能)、非乘方纹理(可提高纹理内存的使用效率)以及阴影功能、隐蔽查询功能等等。

其主要内容包括l 顶点Buffer Object:进行顶点配列方式可以提高透视性能l Shadow功能:增加用来比较Shadow映射的函数l 隐蔽查询(QUERY):为提高Curling性能采用非同步隐蔽测试l 非乘方纹理(Texture):提高mipmap等纹理内存的使用效率l OpenGL Shading Language v.1.0:用于着色(shader)对象、顶点着色以及片断着色技术(fragment shader )的扩展功能1.4 opengl2.0OpenGL 1.0推出后的相当长的一段时间里,OpenGL唯一做的只是增加了一些扩展指令集,这些扩展指令是一些绘图功能,像是ClearCoat、Multisample、视频及绘图的整合工具(某些是通过OpenML的努力而开发出来的,它本身属于OpenGL ARB扩展指令之一。

OpenGL介绍

OpenGL介绍
OpenGL实用库
glaux.h: OpenGL扩展库 glut.h: OpenGL实用工具包 #include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h> #include <GL/glut.h>
此外,OpenGL还提供了反走样技术,能够实现深度暗示(Depth Cue)、运动模糊(Motion Blur)、雾化(Fog)等特殊效果。
6.1.3 OpenGL的绘制流程和原理
点数据 评价器 逐点操作 基元匹配 基片 操作
显示 列表
像素 数据 像素操作
光栅化
帧缓冲区
纹理存储器
OpenGL指令从左侧进入OpenGL,有两类数据,分别是由顶点描述的几何模 型和由像素描述的位图、影像等模型,其中后者经过像素操作后直接进入光栅 化。评价器(Evaluator)用于处理输入的模型数据,例如对顶点进行转换、光照, 并把图元剪切到视景体中,为下一步光栅化做好准备。显示列表(Display List) 用于存储一部分指令,留待合适时间以便于快速处理。光栅化将图元转化成二 维操作,并计算结果图像中每个点的颜色和深度等信息,产生一系列图像的帧 缓存描述值,其生成结果称为基片(Fragment)。基片操作主要的有帧缓存的更 新、测试、融合和屏蔽操作,以及基片之间的逻辑操作和抖动(Dithering)。
第6章 OpenGL
6.1 基本介绍
6.1.1 背景情况
OpenGL(Open Graphics Library,即开放性图形库)是以SGI的 GL三维图形库为基础制定的一个开放式三维图形标准。SGI在 1992年7月发布了1.0版。 OpenGL 规 范 由 ARB(OpenGL Architecture Review Board, OpenGL结构评审委员会)负责管理,目前加入OpenGL ARB的 成员有SGI、Microsoft、Intel、IBM、SUN、Compaq、HP等公 司,它们均采用了OpenGL图形标准,许多软件厂商以OpenGL 为基础开发自己的产品,硬件厂商提供对OpenGL的支持。由 于OpenGL的广泛应用,它已经成为一个工业标准。

像素格式

像素格式

像素格式编辑锁定像素格式(pixel format)像素色彩按分量的大小和排列。

这种格式以每个像素所使用的总位数以及用于存储像素色彩的红、绿、蓝和 alpha 分量的位数指定。

中文名像素格式外文名pixel format方法像素色彩按分量的大小和排列作用描述了像素数据存储所用的格式目录1. 1 像素格式2. 2 颜色通道3. 3 全部格式4. 4 格式管1.▪调色板2.▪表示与转换3.▪生成算法4.▪格式设置5.▪格式属性1. 5 格式笔记2. 6 WPF格式3.7 窗口渲染像素格式像素格式编辑像素格式描述了像素数据存储所用的格式。

定义了像素在内存中的编码方式。

下面的像素格式 (PF_*) 类型定义了:本地格式 (PF_A8R8G8B8 以及其他大量的不同的类型)这意味着在内存中使用了本地储存方式(big endian或者little endian,包括16,24,32位)的整形数据。

同时意味着可以把PF_A8R8G8B8格式的图片看作一个32位的整形数组,在16进制表现为0xAARRGGBB。

这些字母的意义我们在稍后会提供。

位组格式Byte formats(PF_BYTE_*)在这种格式下每个通道对应一个byte,通道在内存里的组织方式和格式名称定义的相同。

例如PF_BYTE_RGBA格式的像素包含了四个byte,一个对应红色,一个绿色,一个蓝色,以及一个alpha通道。

Short格式(PF_SHORT_*)在这种格式下每个通道对应一个unsigned short数据(16 bit整型),通道在内存里的组织方式和格式名称定义的相同。

例如PF_BYTE_RGBA格式的像素包含了四个unsigned short数据,一个对应红色,一个绿色,一个蓝色,以及一个alpha 通道。

Float16 格式(PF_FLOAT16_*)在这种格式下每个通道对应一个16 bit浮点数,通道在内存里的组织方式和格式名称定义的相同。

金字塔代码

金字塔代码
0, 0,//窗口的X,Y坐标位置
windowRect.right - windowRect.left,//窗口宽度
windowRect.bottom - windowRect.top,//窗口高度
HWND_DESKTOP,//父窗口为桌面
0,//无菜单
window->init.application->hInstance,//传入应用程序实例
#defineWIDTH640//定义窗口宽度
#define HEIGHT480//定义窗口高度
#define BPP16//定义每象素的位数
#define MAXTEXTURE1//定义最大的纹理数目(new)
//在此处引用程序要求的头文件:
#include <windows.h>// Windows的头文件
//定义位置在屏幕左下方的光源
GLfloat light_position1[] = {-1.0f, -1.0f, 1.0f, 0.0f};//设置光源的位置
GLfloat light_ambient1[] = {0.5f, 0.5f, 0.5f, 1.0f};//定义环境光的颜色
GLfloat light_diffuse1[] = {1.0f, 1.0f, 1.0f, 1.0f};//定义漫反射光的颜色
dmScreenSettings.dmFields= DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
//尝试设置显示模式并返回结果。注: CDS_FULLSCREEN移去了状态栏
if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)

delphi版的opengl入门

delphi版的opengl入门

第一、准备好OpenGLwindows平台下:OpenGL是由SGI公司开发的低层三维图形API,目前已经成为工业标准,由独立非赢利组织ARB管理。

它在WINDOWS中以动态链接库的形式存在,Win95 osr2以上版本及Win NT 自带有微软公司实现的OpenGL。

但本人推荐使用SGI实现的OpenGL来调试程序,快速可靠而且功能丰富,缺点是它是纯软件实现,无法利用硬件加速。

下载了opengl95.exe或opengl2.exe之后执行之,按提示安装即可。

默认情况情况下会在C:\oglsdk,包括了VC和BC的库及头文件,还有两个演示程序,不妨看看,Fly in the Sky在窗口中移动鼠标就可控制飞行了,还有一份说明书,也不妨看看。

相关文件请到资源区下载Linux平台下:装一个Mesa好了,另外在gtk+(GtkGLArea)/qt(QGLWidget+QGLContext)中均包括了Open GL支持构件(WIDGET),gnome下有许多OpenGL的应用。

注意在LD_LIBRARY_PATH加上必要的路径,详见各软件的安装说明(通常叫README或INSTALL)。

Solaris:OpenGL Library装上随Solaris发售的OpenGL library 。

如果执行以下命令:> cd /usr/openwin/lib> ls libGL*结果显示如下:libGL.so@ libGLU.so@ libGLw.so@libGL.so.1* libGLU.so.1* libGLw.so.1*则意味着OpenGL运行库已经装好了。

通常LD_LIBRARY_PATH里会有该目录,如果没有自己加上就成。

在/usr/openwin/include/GL下有以下头文件:gl.h glu.h glxmd.h glxtokens.hglmacros.h glx.h glxproto.h在sun的网站有OpenGL开发者FAQ,可参阅。

delphiopengl三维坐标鼠标拾取[资料]

delphiopengl三维坐标鼠标拾取[资料]

delphi opengl 三维坐标鼠标拾取unit MainUnit;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs,gl,glu, ExtCtrls, StdCtrls,Math, ComCtrls;typeTMainForm = class(TForm)StatusBar1: TStatusBar;procedure FormCreate(Sender: TObject);procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure Panel1Resize(Sender: TObject);procedure FormResize(Sender: TObject);procedure FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,procedure FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);//procedure glDrawString(x,y,z:Extended;const ss: string);private{ Private declarations }public{ Public declarations }end;constBUFSIZE = 32; // Size of selection buffer.typegl1f = glfloat;gl3f = array [0..2] of glfloat;gl4f = array [0..3] of glfloat;varMainForm: TMainForm;WinW:integer;WinH:integer;keys : Array[0..255] of Boolean; // Holds keystrokesviewP :TviewPortArray;modeM,projM :T16DArray;//viewP:Array [0..3] of GLint;//modeM,projM:Array [0..15] of GLdouble;// User vaiablesLdown,Rdown :boolean;zPos :Tpoint;x0, y0 :Integer; // mouse movementrx, ry :single;// Object positionobj :array[1..236410] of gl3f; //对象的空间坐标Pos :array[1..236410] of gl3f; //对象的屏幕坐标{***********************}p,pi:single;m_Pattern:Integer;mat:array[0..3] of GLDouble;m_bhide,m_bColor:boolean;dnum:integer;bs,zl:double;implementation{$R *.dfm}procedure glDrawCamber;varx1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4,x0,y0,z0,QL,m,n:Extende d;i,j,z,k,tt:integer;Arr1:Array [1..720,1..3] of Extended;Arr2:Array [1..720,1..3] of Extended;beginglColor3f(1.0,1.0,0.0);// glbegin(GL_LINE_LOOP);//初始化for i:=1 to 720 dobeginfor j:=1 to 3 dobeginArr1[i,j]:=100;Arr2[i,j]:=100;end;end;for i:=0 to 80 dobeginfor j:=1 to 720 dobegin//tt:=tt+1;z:=((j) mod 16)+1;ql:=p;case z of1:beginql:=p*0.95;//glColor3f(1.0,0.0,0.0); end;2:beginql:=p*0.96;// glColor3f(0.0,1.0,0.0); end;3:beginql:=p*0.97;//glColor3f(0.0,0.0,1.0);end;4:beginql:=p*0.99;//glColor3f(1.0,1.0,0.0);end;5:beginql:=p*1.00;//glColor3f(1.0,0.0,1.0);end;6:ql:=p*1.02;7:ql:=p*1.03;8:ql:=p*1.04;9:ql:=p*1.05;10:ql:=p*1.04;11:ql:=p*1.03;12:ql:=p*1.02;13:ql:=p*1.00;14:ql:=p*0.99;15:ql:=p*0.98;16:ql:=p*0.97;end;k:=i-40;m:=k/2;n:=j/2;x0:=ql*cos(m*pi/180)*cos(n*pi/180); z0:=ql*sin(m*pi/180);y0:=ql*cos(m*pi/180)*sin(n*pi/180);Arr1[j,1]:=x0;Arr1[j,2]:=y0;Arr1[j,3]:=z0;if (i>0) and (j>1) thenbeginx1:=Arr2[j-1,1];y1:=Arr2[j-1,2];z1:=Arr2[j-1,3];x2:=Arr1[j-1,1];y2:=Arr1[j-1,2];z2:=Arr1[j-1,3];x3:=Arr2[j,1];y3:=Arr2[j,2];z3:=Arr2[j,3];x4:=Arr1[j,1];y4:=Arr1[j,2];z4:=Arr1[j,3];//GlBegin(GL_POINTS);//GlBegin(GL_lines);//glColor3f(1.0,1.0,0.0); //GlBegin(GL_POLYGON);GlBegin(GL_LINE_LOOP);glVertex3f(x1,y1,z1);glVertex3f(x3,Y3,z3);glVertex3f(x4,y4,z4);glVertex3f(x2,y2,z2);glend();end;if j=720 thenbeginfor tt:=1 to 720 dobeginArr2[tt,1]:=Arr1[tt,1];Arr2[tt,2]:=Arr1[tt,2];Arr2[tt,3]:=Arr1[tt,3];end;end;end;end;//glend();end;procedure glDrawColor( Mode :integer);varx1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4:GL1f;i,j,k,pnum:integer;beginpnum:=3;for i:=0 to 40 dobeginfor j:=1 to 360 dobeginpnum:=pnum+1;if mode = GL_SELECT then glLoadName(pnum);k:=i-20;x1:=P*cos(k*pi/180)*cos(j*pi/180);z1:=p*sin(k*pi/180);y1:=p*cos(k*pi/180)*sin(j*pi/180);x2:=P*cos((k+1)*pi/180)*cos(j*pi/180);z2:=p*sin((k+1)*pi/180);y2:=p*cos((k+1)*pi/180)*sin(j*pi/180);x3:=P*cos(k*pi/180)*cos((j+1)*pi/180);z3:=p*sin(k*pi/180);y3:=p*cos(k*pi/180)*sin((j+1)*pi/180);x4:=P*cos((k+1)*pi/180)*cos((j+1)*pi/180);z4:=p*sin((k+1)*pi/180);y4:=p*cos((k+1)*pi/180)*sin((j+1)*pi/180);if (k<=5) and (k>=-5) thenbeginif (j>=1) and (j<=90) thenglColor3f(1.0,0.0,0.0)else if (j>90) and (j<=180) thenglColor3f(0.0,1.0,1.0)else if (j>180) and (j<=270) thenglColor3f(1.0,1.0,1.0)elseglColor3f(1.0,1.0,0.0);endelse if ((k<=10) and (K>=5)) or ((k>=-10) and (k<=-5)) thenglColor3f(0.0,1.0,0.0)else if ((k<=15) and (K>=10)) or ((k>=-15) and (k<=-10)) thenglColor3f(0.0,0.0,1.0)elseglColor3f(0.0,1.0,1.0);glbegin(GL_POLYGON );if hit=pnum thenglColor3f(1, 0, 0);// obj[pnum]:=Vert(x1,y1,z1);//obj[pnum+1]:=Vert(x2,y2,z2);//obj[pnum+2]:=Vert(x3,y3,z3);//obj[pnum+3]:=Vert(x4,y4,z4);//glVertex3fv(@obj[pnum]);//glVertex3fv(@obj[pnum+2]);//glVertex3fv(@obj[pnum+3]);//glVertex3fv(@obj[pnum+1]);glVertex3f(x1,y1,z1);glVertex3f(x3,Y3,z3);glVertex3f(x4,y4,z4);glVertex3f(x2,y2,z2);glend();//end;end;end;end;procedure glDrawString(x,y,z:Extended;const ss: string);const MAX_char:integer=128;{$J+}const isFirstCall:integer = 1;const lists:GLuint=0;{$J-}vari,j:integer;beginglRasterPos3f(x,y,z);if isFirstCall=1 thenbegin// 如果是第一次调用,执行初始化// 为每一个ASCII字符产生一个显示列表isFirstCall:=0;// 申请MAX_CHAR个连续的显示列表编号lists:=glGenLists(MAX_CHAR);// 把每个字符的绘制命令都装到对应的显示列表中wglUseFontBitmaps(wglGetCurrentDC(),0,MAX_CHAR,lists);end;// 调用每个字符对应的显示列表,绘制每个字符for i:=1 to length(ss) dobeginj:=Ord(ss[i]);glCallList(Lists+j);end;end;{------------------------------------------------------------------}{ Function to convert int tostring. }{------------------------------------------------------------------}function IntToStr(Num : Integer) : String;beginStr(Num, result);end;function Vert( x,y,z :gl1f) :gl3f;beginresult[0]:=x; result[1]:=y; result[2]:=z;end;function Point(X, Y: Integer): TPoint;beginResult.X:= X; Result.Y:= Y;end;procedure setAxisList;beginglNewList(1,GL_COMPILE); //坐标线glColor3f(1,0.5,0.5); glLineWidth (1);//绘图直线时笔的宽度glBegin(GL_LINE_STRIP);glColor3f(1,0,1); glVertex3f( 0,0,0);glVertex3f( 2.5,0,0);glColor3f(0,1,0); glVertex3f( 0,0,0);glVertex3f( 0,2.5,0);glColor3f(0,0,1); glVertex3f( 0,0,0);glVertex3f( 0,0,2.5);glEnd;glEndList;end;procedure setupPixelFormat(DC:HDC);constpfd:TPIXELFORMATDESCRIPTOR =(nSize:sizeof(TPIXELFORMATDESCRIPTOR); // sizenVersion:1; // versiondwFlags:PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-bufferingiPixelType:PFD_TYPE_RGBA; // color typecColorBits:24; // preferred color depthcRedBits:0; cRedShift:0; // color bits (ignored)cGreenBits:0; cGreenShift:0;cBlueBits:0; cBlueShift:0;cAlphaBits:0; cAlphaShift:0; // no alpha buffercAccumBits: 0;cAccumRedBits: 0; // no accumulation buffer,cAccumGreenBits: 0; // accum bits (ignored)cAccumBlueBits: 0;cAccumAlphaBits: 0;cDepthBits:16; // depth buffercStencilBits:0; // no stencil buffercAuxBuffers:0; // no auxiliary buffersiLayerType:PFD_MAIN_PLANE; // main layerbReserved: 0;dwLayerMask: 0;dwVisibleMask: 0;dwDamageMask: 0; // no layer, visible, damage masks);var pixelFormat:integer;beginpixelFormat := ChoosePixelFormat(DC, @pfd);if (pixelFormat = 0) thenexit;if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) thenexit;end;{------------------------------------------------------------------}{ InitialiseOpenGL }{------------------------------------------------------------------}procedure GLInit;begin// set viewing projectionglMatrixMode(GL_PROJECTION);glFrustum(-0.1, 0.1, -0.1, 0.1, 0.3, 25.0);// position viewer */glMatrixMode(GL_MODELVIEW);glEnable(GL_DEPTH_TEST);glClearColor(0.0, 0.0, 0.0, 0.0); // Black Background// glShadeModel(GL_SMOOTH); // Enables Smooth Color ShadingglClearDepth(1.0); // Depth Buffer SetupglDepthFunc(GL_LESS); // The Type Of Depth Test To DoglEnable(GL_DEPTH_TEST); // Enable Depth BufferglHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//Realy Nice perspective calculationsglBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //控制混合方式glEnable(GL_BLEND); //混合(透明)使能glEnable(GL_line_smooth);glEnable(GL_POINT_SMOOTH);end;procedure gldrawball;beginend;//############ 获得对象的屏幕坐标 ################function GetWinPos( h:integer) :gl3f;var wx,wy,wz :glDouble; // 屏幕坐标begingluProject( obj[h,0],obj[h,1],obj[h,2], modeM,projM,viewP, @wx,@wy,@wz);result:= Vert( wx,wy,wz);end;//############ 将屏幕坐标转换为空间坐标 ################function GetObjPos( x,y,z:gl1f) :gl3f;var px,py,pz :glDouble; // 对象坐标a,b:Double;begingluUnProject( x,y,z, modeM,projM,viewP, @px,@py,@pz);result:= Vert( px,py,pz);MainForm.StatusBar1.Panels[0].Text:='X='+FloattoStr(px); MainForm.StatusBar1.Panels[1].Text:='Y='+FloattoStr(py); MainForm.StatusBar1.Panels[2].Text:='Z='+FloattoStr(pz);if Hit>3 thenbegina:=ArcSin(pz/p)*180/pi; //纬度与xy平面的反正弦b:=ArcCos(Sqrt(px*px+pz*pz)/p)*180/pi; //经度与xz平面的反余弦if (px<0) and (py>=0) thenb:=180-b;if (px<0) and (py<0) thenb:=b-180;MainForm.StatusBar1.Panels[3].Text:='LON='+FloattoStr(a); MainForm.StatusBar1.Panels[4].Text:='LAT='+FloattoStr(b);end;end;--------}{ Handle windowresize }{------------------------------------------------------------------}procedure glResizeWnd(Width, Height : Integer);beginwinW:= width; winH:= Height;if (Height = 0) then Height := 1; // prevent divide by zero exceptionglViewport(0, 0, Width, Height); // Set the viewport for the OpenGL windowglMatrixMode(GL_PROJECTION); // Change Matrix Mode to ProjectionglLoadIdentity(); // Reset ViewgluPerspective(45, Width/Height, 1, 100); // Do the perspective calculations. Last value = max clipping depthglMatrixMode(GL_MODELVIEW); // Return to the modelview matrixglLoadIdentity(); // Reset Viewend;{------------------------------------------------------------------}{ Function to draw the actualscene }--------}procedure glDraw( Mode :integer);var h :integer;i,j,latw,lonw:integer;x,y,z,x0,y0,z0,m,n:Extended;x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4,lx,ly,lz:GL1f;k,pnum:integer;pp:Array of Array of GL3f;beginglClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth BufferglLoadIdentity(); // Reset The ViewglTranslatef(0,0,-eye);glRotatef( ry, 1,0,0);glRotatef( rx, 0,0,1);glColor3f(0, 0.1, 0.6);glCallList(1);{*******************************}glmatrixmode(gl_modelview);glclipplane(gl_clip_plane1,@mat[0]);if m_bhide thenglenable(gl_clip_plane1)elsegldisable(gl_clip_plane1);//glLineWidth(1);{===================================}glPointSize(6);glLineWidth(2);{ if mode = GL_SELECT then glLoadName(1);glBegin(GL_POINTS);glColor3f(1, 1, 0);if hit=1 then glColor3f(1, 0, 0) else glColor3f(1, 1, 0); glVertex3fv(@obj[1]); //画第一点glEnd;if mode = GL_SELECT then glLoadName(2);glBegin(GL_POINTS);glColor3f(1, 1, 0);if hit=2 then glColor3f(1, 0, 0) else glColor3f(1, 1, 0); glVertex3fv( @obj[2]); //画第二点glEnd;if mode = GL_SELECT then glLoadName(3);glBegin( GL_LINES);if hit=3 then glColor3f(1, 0, 0) else glColor3f(1, 0.5, 0.5);glVertex3fv( @obj[1]); glVertex3fv( @obj[2]); //连接线glEnd;}//if mode = GL_SELECT then glLoadName(4);{**********************************}{红色: (1.0,0.0,0.0)(1.0,0.125,0.0)红橙色: (1.0,0.25,0.0);(1.0,0.45,0.0)橙色: (1.0,0.65,0.0)(1.0,0.7,0.0)黄橙色: (1.0,0.8,0.0)(1.0,0.9,0.0)黄色: (1.0,1.0,0.0)(0.75,1.0,0.0)黄绿色: (0.5,1.0,0.0)(0.25,1.0,0.0)绿色: (0.0,1.0,0.0)(0.0,0.75,0.25)蓝绿色: (0.0,0.5,0.5)(0.0,0.25,0.75)蓝色 (0.0,0.0,1.0)(0.25,0.0,1.0)蓝紫色: (0.5,0.0,1.0)(0.5,0.0,0.75)紫色: (0.5,0.0,0.5)(0.75,0.0,0.75)红紫色: (1.0,0.0,1.0)(1.0,0.0,0.5)}pnum:=0;glPointSize(1);setlength(pp,1440,161);for i:=0 to 1439 dobeginfor j:=0 to 159 dobegin//pnum:=pnum+1;//if mode=GL_Select then GLLoadName(pnum);n:=i*0.25;m:=j*0.25-20;pp[i,j,0]:=P*cos(m*pi/180)*cos(n*pi/180);pp[i,j,2]:=p*sin(m*pi/180);pp[i,j,1]:=p*cos(m*pi/180)*sin(n*pi/180);endend;for i:=0 to 1438 dobeginfor j:=0 to 159 dobegin//颜色选取pnum:=pnum+1;if mode=GL_Select then GLLoadName(pnum);//k:=(pnum div 23000)+1;case pnum of1..9600: glColor3f(1.0,0.0,0.0); //红色9601..19200:glColor3f(1.0,0.125,0.0);19201..28800: glColor3f(1.0,0.25,0.0);28801..38400: glColor3f(1.0,0.45,0.0);38401..48000:glColor3f(1.0,0.65,0.0);48001..57600: glColor3f(1.0,0.7,0.0);57601..67200: glColor3f(1.0,0.8,0.0);67201..76800: glColor3f(1.0,0.9,0.0);76801..86400: glColor3f(1.0,1.0,0.0);86401..96000: glColor3f(0.75,1.0,0.0);96001..105600: glColor3f(0.5,1.0,0.0);105601..115200: glColor3f(0.25,1.0,0.0);115201..124800:glColor3f(0.0,1.0,0.0);124801..134400:glColor3f(0.0,0.75,0.25);134401..144000: glColor3f(0.0,0.5,0.5); 144001..153600:glColor3f(0.0,0.25,0.75);153601..163200: glColor3f(0.0,0.0,1.0); 163201..172800: glColor3f(0.25,0.0,1.0);172801..182400: glColor3f(0.5,0.0,1.0); 182401..192000: glColor3f(0.5,0.0,0.75);192001..201600: glColor3f(0.5,0.0,0.5); 201601..211200: glColor3f(0.75,0.0,0.75);211201..220800: glColor3f(1.0,0.0,1.0); 220801..239000: glColor3f(1.0,0.0,0.5); end;if j<>159 thenbeginGLbegin(GL_POLYGON);if hit=pnum thenbeginGLColor3f(1.0,1.0,1.0);MainForm.StatusBar1.Panels[5].Text:='光强='+InttoStr(hit);end;obj[pnum]:=Vert(pp[i,j,0],pp[i,j,1],pp[i,j,2]); obj[pnum+1]:=Vert(pp[i+1,j,0],pp[i+1,j,1],pp[i+1,j,2]);obj[pnum+2]:=Vert(pp[i+1,j+1,0],pp[i+1,j+1,1],pp[i+1,j+1,2] );obj[pnum+3]:=Vert(pp[i,j+1,0],pp[i,j+1,1],pp[i,j+1,2]);glVertex3fv(@obj[pnum]);glVertex3fv(@obj[pnum+1]);glVertex3fv(@obj[pnum+2]);glVertex3fv(@obj[pnum+3]);GLend();end;end;end;{pnum:=0;for i:=0 to 40 dobeginfor j:=1 to 360 dopnum:=pnum+1;if mode = GL_SELECT then glLoadName(pnum);k:=i-20;x1:=P*cos(k*pi/180)*cos(j*pi/180);z1:=p*sin(k*pi/180);y1:=p*cos(k*pi/180)*sin(j*pi/180);x2:=P*cos((k+1)*pi/180)*cos(j*pi/180);z2:=p*sin((k+1)*pi/180);y2:=p*cos((k+1)*pi/180)*sin(j*pi/180);x3:=P*cos(k*pi/180)*cos((j+1)*pi/180);z3:=p*sin(k*pi/180);y3:=p*cos(k*pi/180)*sin((j+1)*pi/180);x4:=P*cos((k+1)*pi/180)*cos((j+1)*pi/180);z4:=p*sin((k+1)*pi/180);y4:=p*cos((k+1)*pi/180)*sin((j+1)*pi/180);if (k<=5) and (k>=-5) thenbeginif (j>=1) and (j<=90) thenglColor3f(1.0,0.0,0.0)else if (j>90) and (j<=180) thenglColor3f(0.0,1.0,1.0)else if (j>180) and (j<=270) thenglColor3f(1.0,1.0,1.0)elseglColor3f(1.0,1.0,0.0);else if ((k<=10) and (K>=5)) or ((k>=-10) and (k<=-5)) thenglColor3f(0.0,1.0,0.0)else if ((k<=15) and (K>=10)) or ((k>=-15) and (k<=-10)) thenglColor3f(0.0,0.0,1.0)elseglColor3f(0.0,1.0,1.0);glbegin(GL_POLYGON );if hit=pnum thenbeginglColor3f(1, 0, 0);MainForm.Edit6.Text:=InttoStr(hit);end;obj[pnum]:=Vert(x1,y1,z1);obj[pnum+1]:=Vert(x2,y2,z2);obj[pnum+2]:=Vert(x3,y3,z3);obj[pnum+3]:=Vert(x4,y4,z4);glVertex3fv(@obj[pnum]);glVertex3fv(@obj[pnum+2]);glVertex3fv(@obj[pnum+3]);glVertex3fv(@obj[pnum+1]);glend();//end;end;end;}//显示0、x,y,zglDrawString(0,0,0,'0');glDrawString(2.5,0,0,'X');glDrawString(0,2.5,0,'Y');glDrawString(0,0,2.5,'Z');//颜色绘图// if MainForm.CheckBox3.Checked then// glDrawCamber; //画曲面{=================================}if mode = GL_SELECT then glLoadName(0);glCallList(1); //画坐标轴线{ if Ldown and(hit>0) then //画坐标指示线beginglColor3f( 0.5,0.5,0.5);glEnable( GL_LINE_STIPPLE);glLineStipple(1,$4444);if hit<3 then h:=hit else h:=1;glBegin( GL_LINE_STRIP);glVertex3fv( @obj[h]);glVertex3f( obj[h,0],obj[h,1],0);glVertex3f( obj[h,0],0,0); glVertex3f( 0,0,0);glVertex3f( 0,obj[h,1],0);glVertex3f( obj[h,0],obj[h,1],0);glEnd;glDisable( GL_LINE_STIPPLE);end;}SwapBuffers(wglGetCurrentDC);end;{------------------------------------------------------------------}{ Processes all mouseClicks }{------------------------------------------------------------------}{function doSelect(X, Y : Integer) :integer;var selectBuff : Array[1..8] of glUint;begin// result:= -1;glGetIntegerv(GL_VIEWPORT, @viewP); // Viewport = [0, 0, width, height]glSelectBuffer(8, @selectBuff);// glSelectBuffer(BUFSIZE, @selectBuff);glRenderMode(GL_SELECT);glInitNames;glPushName(0);glMatrixMode(GL_PROJECTION);glPushMatrix(); //--glLoadIdentity();gluPickMatrix(x, winH-y, 0.1, 0.1, viewP); // Set-up pick matrixgluPerspective(45, winW/winH, 1, 100); // Do the perspective calculations. Last value = max clipping depthglMatrixMode(GL_MODELVIEW);glDraw( GL_SELECT);glMatrixMode(GL_PROJECTION);glPopMatrix();glMatrixMode(GL_MODELVIEW);if (glRenderMode(GL_RENDER)>0 )then result:= selectBuff[4] else result :=-1;end; }function doSelect(X, Y : Integer) :integer;var selectBuff : Array[0..31] of glUint;beginglGetIntegerv(GL_VIEWPORT, @viewP); // Viewport = [0, 0, width, height]glSelectBuffer(BUFSIZE, @selectBuff);glRenderMode(GL_SELECT);glInitNames;glPushName(32);glMatrixMode(GL_PROJECTION);glPushMatrix();glLoadIdentity();gluPickMatrix(x, winH-y-20, 4, 4, viewP); // Set-up pick matrixgluPerspective(45, winW/winH, 1, 100); // Do the perspective calculations. Last value = max clipping depthglMatrixMode(GL_MODELVIEW);glDraw(GL_SELECT);glMatrixMode(GL_PROJECTION);glPopMatrix();glMatrixMode(GL_MODELVIEW);if glRenderMode(GL_RENDER)>0then result:= selectBuff[3]else result:= -1;end;//============ 按下鼠标 =============procedure MouseDw( hit, x,y : Integer);var i :integer;beginLdown:= TRUE;if hit<=0 then exit;zPos:= point(x,y); //很奇怪,这个变量无任何用处,但在这里却不能删除,否则就会黑屏!glGetDoublev( GL_Modelview_Matrix, @modeM);glGetDoublev(GL_Projection_Matrix, @projM);for i:= 1 to 236160 do Pos[i]:= GetWinPos(i);//构件的屏幕坐标glDraw(GL_RENDER);end;//============= 移动鼠标 ==============procedure MouseMv( hit, x,y, x0,y0 : Integer);var dx,dy, i :integer;begindx:= x-x0; dy:= y-y0;if hit<0 then begin rx:= rx+ (x-x0)/5; ry:= ry+ (y-y0)/5; end; //改变视角if hit<3 thenobj[hit]:= GetObjPos( x, winH-y, GetWinPos( hit)[2]); //直接将构件移动到新的位置if hit=3 thenfor i:= 1 to 2 dobeginobj[i]:=GetObjPos( Pos[i][0]+dx,(Pos[i][1]-dy),Pos[i][2]);//将构件移动到新的位置Pos[i]:= GetWinPos(i);//构件的屏幕坐标end;if hit>3 thenbeginobj[hit]:=GetObjPos( Pos[hit][0],(Pos[hit][1]),Pos[hit][2]);//将构件移动到新的位置Pos[hit]:= GetWinPos(hit);//构件的屏幕坐标end;glDraw(GL_RENDER);end;procedure TMainForm.FormCreate(Sender: TObject);var DC:HDC;RC:HGLRC;beginDC:=GetDC(Handle); //Actually, you can use any windowed control hereSetupPixelFormat(DC);RC:=wglCreateContext(DC); //makes OpenGL window out of DC wglMakeCurrent(DC, RC); //makes OpenGL window activeGLInit; //initialize OpenGLglResizeWnd(800,600);glDraw(GL_RENDER);p:=2.0;mat[0]:=0;mat[1]:=0;mat[2]:=1;mat[3]:=0;m_bHide:=False;m_bColor:=False;m_Pattern:=2;dnum:=24;pi:=3.1415926;setAxisList;rx:= -125; ry:= -65; //视角eye:= 10; //景深obj[1]:=Vert(-1, 2, 0.8);obj[2]:=Vert( 2,-1,-0.5);bs:=8*pi*p*p*sin(pi/9);bs:=bs/(1440*160);zl:=Sqrt(bs);end;procedure TMainForm.Panel1MouseDown(Sender: TObject; Button:TMouseButton;Shift: TShiftState; X, Y: Integer);beginif Button=mbLeft thenbeginx0:=x;y0:=y;MouseDw( hit, x0,y0 );MouseMv( hit, x,y, x0,y0);end;if Button=mbRight thenbeginx0:= x;y0:= y;Rdown:= true;end;// glDraw(GL_RENDER);glDraw(GL_RENDER); // Draw the sceneend;procedure TMainForm.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif not(Ldown or Rdown) thenbeginhit:= doSelect(x, y); //自由移动// MouseMv( hit, x,y, x0,y0);end;if Ldown then MouseMv( hit, x,y, x0,y0); //拖动左键if Rdown then begin //拖动右键eye:= eye- (x-x0); //改变景深if eye>80 theneye:=80;if eye<5 theneye:=5;end;x0:= x; y0:= y;glDraw(GL_RENDER); // Draw the sceneend;procedure TMainForm.Panel1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginif Button=mbLeft thenbeginLdown :=FALSE;end;if Button=mbRight thenbeginRdown :=FALSE;end;// glDraw(GL_RENDER);glDraw(GL_RENDER); // Draw the sceneend;procedure TMainForm.Panel1Resize(Sender: TObject);beginglResizeWnd(MainForm.Width,MainForm.Height);end;procedure TMainForm.FormResize(Sender: TObject);beginglResizeWnd(MainForm.Width,MainForm.Height);end;procedure TMainForm.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginif Button=mbLeft thenbeginx0:=x;y0:=y;MouseDw( hit, x0,y0 );MouseMv( hit, x,y, x0,y0);end;if Button=mbRight thenbeginx0:= x;y0:= y;Rdown:= true;end;// glDraw(GL_RENDER);glDraw(GL_RENDER); // Draw the sceneend;procedure TMainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif not(Ldown or Rdown) thenbeginhit:= doSelect(x, y); //自由移动// MouseMv( hit, x,y, x0,y0);end;if Ldown then MouseMv( hit, x,y, x0,y0); //拖动左键if Rdown then begin //拖动右键eye:= eye- (x-x0); //改变景深if eye>80 theneye:=80;if eye<5 theneye:=5;end;x0:= x; y0:= y;glDraw(GL_RENDER); // Draw the sceneend;procedure TMainForm.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginif Button=mbLeft thenbeginLdown :=FALSE;end;if Button=mbRight thenbeginRdown :=FALSE;end;// glDraw(GL_RENDER);glDraw(GL_RENDER); // Draw the sceneend;end.。

C#使用原生的Directx和OpenGL绘图

C#使用原生的Directx和OpenGL绘图

C#使⽤原⽣的Directx和OpenGL绘图原⽂由于项⽬需要做⼀些图形展⽰,所以就想到了使⽤Directx和OpenGL来绘图,但项⽬准备使⽤C#来开发(⼤家⽐较熟悉C#),在⽹上看了相关的资料,有⼀些第三⽅的控件可⽤,试⽤了下,⼀运⾏就占了⼏百M的内存,⽽且也不知道是否稳定,教程也少,还不如直接使⽤原⽣的。

在⽹上看的Directx和OpenGL的教程基本上都是C/C++的,找了很久也就找到相关介绍,只能⾃⼰研究下。

我以前做过C#和C++混合语⾔编程相关的东西,在C++实现⼀些C#不好实现的功能,C#动态调⽤DLL⽂件,所以也想到了⽤C++的代码来控制Winform控件的绘画,这样就可实现⽤Direct和OpenGL在Winform的控件上绘画了。

由于我对Direct和OpenGL都不熟悉,没有这⽅⾯的编程经验,只能去瞎折腾,下⾯分别说说最近在Directx和OpenGL怎么试验的。

Directx:之前没学过Directx,拿了同学的代码来看,也是雾⾥看花啊,不过有⼀点启⽰了我,在初始化的时候,要传⼊⼀个句柄去创建设备(CreateDevice),通常都是传⼊窗⼝的设备,我想如果传⼊⼀个控件的句柄,那所有的绘画都将在这个控件上实现,因为控件也是继承⾃Window的。

⽽Winform的控件在底层的实现应该和WIN32是⼀样的。

这样的话只要把Winform的控件的句柄传⼊C++代码进⾏初始化,那么绘画的结果将显⽰在这个控件上。

结果⼀试,还真⾏。

关键代码如下:代码如下:extern "C" _declspec(dllexport) HRESULT InitD3D( HWND hWnd );extern "C" _declspec(dllexport) VOID Render();在InitD3D传⼊控件的句柄进⾏初始化,C#再调⽤Render进⾏绘画,以下是C#代码:代码如下:HWND handle = this.button1.Handle;InitD3D(handle);private void Draw(){for (; ; ){Render();}}效果图:代码如下:extern "C" _declspec(dllexport) void Init( HWND hWnd);extern "C" _declspec(dllexport) void Render();void Init(HWND hWnd){int PixelFormat;int bits = 16;hDC = GetDC(hWnd);static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be{sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor1, // Version NumberPFD_DRAW_TO_WINDOW | // Format Must Support WindowPFD_SUPPORT_OPENGL | // Format Must Support OpenGLPFD_DOUBLEBUFFER, // Must Support Double BufferingPFD_TYPE_RGBA, // Request An RGBA Formatbits, // Select Our Color Depth0, 0, 0, 0, 0, 0, // Color Bits Ignored0, // No Alpha Buffer0, // Shift Bit Ignored0, // No Accumulation Buffer0, 0, 0, 0, // Accumulation Bits Ignored16, // 16Bit Z-Buffer (Depth Buffer)0, // No Stencil Buffer0, // No Auxiliary BufferPFD_MAIN_PLANE, // Main Drawing Layer0, // Reserved0, 0, 0 // Layer Masks Ignored};PixelFormat=ChoosePixelFormat(hDC,&pfd);SetPixelFormat(hDC,PixelFormat,&pfd);hRC=wglCreateContext(hDC);}void Render(){wglMakeCurrent(hDC, hRC);draw();SwapBuffers(hDC);wglMakeCurrent(NULL, NULL);}代码如下:Init(this.pictureBox1.Handle);//开始绘制var timer = new System.Timers.Timer();timer.Interval = 100;timer.Elapsed += (tsender, te) =>{Render();};timer.AutoReset = true;timer.Enabled = true;效果图:WPF:WPF的控件没有句柄,但是可以换个思路,把绘画代码封装在Winform控件上,在WPF使⽤⾃定义的Winform控件。

openggl

openggl

MFC中的OpenGL窗口MFC中的OpenGL窗口建立一个基于对话框的工程(名称:OpenGL)并且在设置的Link里加入库opengl32.lib glu32.lib glaux.lib为对话框添加picture control 控件,ID:IDC_RENDER主要程序:// OpenGLDlg.cpp : implementation file//#include "stdafx.h"#include "OpenGL.h"#include "OpenGLDlg.h"#include <gl\gl.h>#include <gl\glu.h>#include <gl\glaux.h>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MS G(CAboutDlg)//}}AFX_MS GDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MS G_MAP(CAboutDlg)// No message handlers//}}AFX_MS G_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// COpenGLDlg dialogCOpenGLDlg::COpenGLDlg(CWnd* pParent /*=NULL*/): CDialog(COpenGLDlg::IDD, pParent){//{{AFX_DATA_INIT(COpenGLDlg)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 PixelFormat=0;m_yRotate = 0;m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void COpenGLDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(COpenGLDlg)// NOTE: the ClassWizard will add DDX and DDV calls here//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(COpenGLDlg, CDialog)//{{AFX_MS G_MAP(COpenGLDlg)ON_WM_S YSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_TIMER()//}}AFX_MS G_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// COpenGLDlg message handlersBOOL COpenGLDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); }}// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon///////////////////////OPENGL INIT/////////////////////////CWnd *wnd=GetDlgItem(IDC_RENDER);hrenderDC=::GetDC(wnd->m_hWnd);if(SetWindowPixelFormat(hrenderDC)==FALSE)return 0;if(CreateViewGLContext(hrenderDC)==FALSE)return 0;glPolygonMode(GL_FRONT,GL_FILL);glPolygonMode(GL_BACK,GL_FILL);///////////////////////////////////////////glEnable(GL_TEXTURE_2D);glShadeModel(GL_SMOOTH);glViewport(0,0,259,231);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45,1,0.1,100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glShadeModel(GL_SMOOTH); // Enable Smooth ShadingglClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black BackgroundglClearDepth(1.0f); // Depth Buffer SetupglEnable(GL_DEPTH_TEST); // Enables Depth TestingglDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do/////////////////////////////////////////////////////////////////////////glEnableClientState(GL_VERTEX_ARRAY);glEnableClientState(GL_TEXTURE_COORD_ARRAY);SetTimer(1,10,0);////////////////////////////////////////////////////////////////// TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a control}void COpenGLDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.void COpenGLDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangleint cxIcon = GetS ystemMetrics(SM_CXICON);int cyIcon = GetS ystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags // the minimized window.HCURSOR COpenGLDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}BOOL COpenGLDlg::SetWindowPixelFormat(HDC hDC){PIXELFORMATDESCRIPTOR pixelDesc;pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR); pixelDesc.nVersion = 1;pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |PFD_S UPPORT_OPENGL |PFD_DOUBLEBUFFER |PFD_TYPE_RGBA;pixelDesc.iPixelType = PFD_TYPE_RGBA; olorBits = 32;pixelDesc.cRedBits = 0;pixelDesc.cRedShift = 0;pixelDesc.cGreenBits = 0;pixelDesc.cGreenShift = 0;pixelDesc.cBlueBits = 0;pixelDesc.cBlueShift = 0;pixelDesc.cAlphaBits = 0;pixelDesc.cAlphaShift = 0;pixelDesc.cAccumBits = 0;pixelDesc.cAccumRedBits = 0;pixelDesc.cAccumGreenBits = 0;pixelDesc.cAccumBlueBits = 0;pixelDesc.cAccumAlphaBits = 0;pixelDesc.cDepthBits = 0;pixelDesc.cStencilBits = 1;pixelDesc.cAuxBuffers = 0;pixelDesc.iLayerType = PFD_MAIN_PLANE; pixelDesc.bReserved = 0;pixelDesc.dwLayerMask = 0;pixelDesc.dwVisibleMask = 0;pixelDesc.dwDamageMask = 0;PixelFormat = ChoosePixelFormat(hDC,&pixelDesc);if(PixelFormat==0) // Choose default{PixelFormat = 1;if(DescribePixelFormat(hDC,PixelFormat,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0) {return FALSE;}}if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)==FALSE) {return FALSE;}return TRUE;}BOOL COpenGLDlg::CreateViewGLContext(HDC hDC) {hrenderRC = wglCreateContext(hDC);if(hrenderRC==NULL)return FALSE;if(wglMakeCurrent(hDC,hrenderRC)==FALSE)return FALSE;return TRUE;}void COpenGLDlg::RenderScene(){/////////////////////////////////////////////////glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0.0f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0 glRotated(m_yRotate, 0.0, 1.0, 0.0);glBegin(GL_TRIANGLES); // Drawing Using TrianglesglVertex3f( 0.0f, 1.0f, 0.0f); // TopglVertex3f(-1.0f,-1.0f, 0.0f); // Bottom LeftglVertex3f( 1.0f,-1.0f, 0.0f); // Bottom RightglEnd(); // Finished Drawing The TriangleSwapBuffers(hrenderDC);}void COpenGLDlg::OnTimer(UINT nIDEvent) //实时绘制场景{// TODO: Add your message handler code here and/or call defaultRenderScene();m_yRotate +=3;CDialog::OnTimer(nIDEvent);}// OpenGLDlg.h : header file//#if !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDE D_)#define AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_ #if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000/////////////////////////////////////////////////////////////////////////////// COpenGLDlg dialogclass COpenGLDlg : public CDialog{// Constructionpublic:COpenGLDlg(CWnd* pParent = NULL); // standard constructorBOOL SetWindowPixelFormat(HDC hDC); //设定象素格式BOOL CreateViewGLContext(HDC hDC); //View GL Contextvoid RenderScene(); //绘制场景HDC hrenderDC; //DCHGLRC hrenderRC; //RCfloat m_yRotate; //转速int PixelFormat;// Dialog Data//{{AFX_DATA(COpenGLDlg)enum { IDD = IDD_OPENGL_DIALOG };// NOTE: the ClassWizard will add data members here//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(COpenGLDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MS G(COpenGLDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnTimer(UINT nIDEvent);//}}AFX_MS GDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif// !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED _)/rwdata/temp/opengl.rarafx_msg void OnTimer(UINT nIDEvent);一、OpenGL简介众所周知,OpenGL原先是Silicon Graphics Incorporated(SGI公司)在他们的图形工作站上开发高质量图像的接口。

图像处理专业英语词汇

图像处理专业英语词汇

图像处理专业英语词汇图像处理是计算机科学领域中的一个重要分支,它涉及到数字图像的获取、处理、分析和展示。

在图像处理领域,有许多专业的英语词汇需要掌握。

本文将介绍一些常用的图像处理专业英语词汇,帮助读者更好地理解和运用这些术语。

一、数字图像获取数字图像获取是指通过传感器或者扫描仪等设备获取图像的过程。

在这个过程中,有一些常用的英语词汇需要了解。

1. Sensor(传感器)- 一种用于检测和测量环境变化的装置,常用于捕捉图像中的光线信息。

2. Scanner(扫描仪)- 一种设备,用于将纸质图像或照片转换为数字图像。

3. Resolution(分辨率)- 衡量图像细节的能力,通常以像素为单位表示。

4. Pixel(像素)- 图像的最小单位,每个像素代表一个颜色值。

5. Color depth(颜色深度)- 表示每个像素可以显示的颜色数量,通常以位数表示。

二、图像处理基础图像处理的基础是对图像进行各种操作和处理,以改善图像质量或提取有用的信息。

以下是一些常用的英语词汇。

1. Enhancement(增强)- 通过调整图像的对比度、亮度或者颜色等参数来改善图像质量。

2. Filtering(滤波)- 通过应用滤波器来改变图像的频率特性或去除噪声。

3. Segmentation(分割)- 将图像分成不同的区域或对象,以便更好地进行分析和处理。

4. Edge detection(边缘检测)- 识别图像中的边缘或轮廓。

5. Histogram(直方图)- 表示图像中不同灰度级的像素数量的统计图。

三、图像分析与识别图像分析和识别是图像处理的重要应用之一,它涉及到从图像中提取和识别有用的信息。

以下是一些常用的英语词汇。

1. Feature extraction(特征提取)- 从图像中提取有用的特征,用于分类和识别。

2. Pattern recognition(模式识别)- 通过比较图像中的模式和已知的模式,来识别图像中的对象或场景。

opengl使用方法教程

opengl使用方法教程
使用辅助库glaux的方法。
使用GDI和WGL函数的方法。
使用OpenGL实用函数库glut的方法。
OpenGL 使用介绍第10页
OpenGL编程方法
OpenGL与Windows的绘图方式是不同的,其区别主要
表现在以下三个方面:
Windows用GDI绘图。
OpenGL用图形操作描述表(着色描述表、绘制描
wglDeleteContext(hglrc);
OpenGL编程方法
管理像素格式的函数
函数功能
ChoosePixelFormat() 返回与制定像素格式最相
近的像素格式
DescribePixelFormat() 得到指定制定像素格式的
信息
GetPixelFormat() 得到指定像素格式
它。
OpenGL 使用介绍第11页
OpenGL 使用介绍第12页
OpenGL编程方法
Windows提供了5个函数管理图形操作描述
表。这5个函数都有前缀“wgl”,各函数的功能 本文来GIS公园
如下所示。
wglCreateContext() 建立一个图形操作描述表
wglDeleteContext() 删除一个图形操作描述表
OpenGL 使用介绍第6页
OpenGL命令语法和规范
OpenGL包含了近200个函数,分为5类:
核心函数:115个,以gl开头。
实用函数:43个,以glu开头。
辅助函数:31个,以aux开头。
专用函数:6个,以wgl开头。
Win32API函数:5个,无特定前缀。
hglrc:指定一个图形操作描述表。

结合OpenGL的图形编程教学模式研究

结合OpenGL的图形编程教学模式研究

结合OpenGL的图形编程教学模式研究摘要:计算机图形学有理论性与实践性紧密结合的特点,教师教学和学生学习难度较大。

为帮助计算机图形学课程的教学,提出了控制台应用程序+OpenGL和MFC可执行程序+OpenGL两种图形编程教学模式,并比较了两者的优缺点。

关键词:图形编程;计算机图形学;教学模式;OpenGL1国内教学现状为有助于学生学习和理解计算机图形学的基本概念、原理与算法,需要结合形象化的图形编程实例和实验来补充说明和练习。

国内教材和教学中计算机图形学案例和实验图形编程选用的编程语言有C、C++和Java。

Java主要面向嵌入式设备和网络使用,目前PC机上软件编程教学通常采用C和C++编程语言,选择的图形开发环境是在VC++里使用控制台应用程序、MFC可执行程序、OpenGL开放图形库、Direct3D图形库等几种方式。

在课时有限的前提下,由于没有结合使用图形库的图形编程案例,加上实验难度较大,导致学生学习兴趣降低而很难完成理论学习和实验项目。

Direct3D是微软公司在Microsoft Windows操作系统上所开发的一套3D图形编程接口,是DirectX的一部分,仅能在Windows平台使用,平台移植性差。

OpenGL是一个专业的图形编程接口和功能强大的开放图形库,提供了基本的函数库,涵盖了开发二、三维图形程序所需的各个方面。

OpenGL独立于窗口系统和操作系统,开发的应用程序可以十分方便地在各种平台间移植,且与VC++接口紧密。

因此,在VC++里结合OpenGL图形库开展计算机图形学课程的辅助教学是最佳选择。

2结合OpenGL的教学模式开放图形库OpenGL是一个性能卓越的开放图形编程接口(API),适用于广泛的计算机环境,具有使用简便、高效率、稳定可靠、性能高、可扩展移植、适应性强等特点,是唯一真正开放、独立于供应商、跨平台的图形开发行业标准,是图形开发工作者必须掌握的开发工具。

在OPENGL中读取3DS模型文件

在OPENGL中读取3DS模型文件

在OpenGL中读取3DS模型文件这里要解决的一个关键问题是: 如何在OpenGL中读取3DS模型文件。

在这部分介绍了3DS文件的存储格式,给出了OpenGL与3DS的接口编程,这对三维模型的创建提供了极大的方便,还综合运用其他的技术和算法来完成三维动画。

6.1 3ds文件格式简介3DS文件由许多块组成,每个块首先描述其信息类别,即该块是如何组成的。

块的信息类别用ID来标识,块还包含了下一个块的相对位置信息。

因此,即使不理解一个块的含义,也可以很容易地跳过它,因为该块中指出了下一个块的相对于该块起始位置的偏移字节数。

与许多文件格式一样,3DS二进制文件中的数据也是按低位在前、高位在后的方式组织的,例如,2个十六进制字节,4A 5C组成的整型数,表明5C是高位字节,4A是低位字节;对于长整型数,如:4A 5C 3B 8F表明5C4A是低位字,而8F3B是高位字。

下面描述块的具体定义。

块的前两项信息分别是:块的ID和块的长度(下一个块相对于该块的字节偏移量),块的ID是一个整型数,而块的长度是一个长整型数。

每个块实际上是一个层次结构,不同类型的块,其层次结构也不相同。

3DS文件中有一个基本块,其ID是4D4D,每一个3DS文件的开头都是由这样一个块构成。

基本块内的块称为主块。

为了对块的层次结构有一个初步的认识,下面给出一个图表来说明不同类型(ID)的块及其各自在文件中的位置。

如下图所示给每一个块都起了一个名字,这样更便于理解或直接转换为源程序。

图6.1 3DS文件结构图颜色块是文件中自始至终都能见到的一种块类型,颜色块总共有3种类型,它们是COL_ RGB,COL_ TRU和COL_ UNK。

6.2 存储3ds文件的数据结构本节将对程序中所用到的一些重要数据结构进行简单说明,以便使读者更进一步了解3ds文件所存储的数据。

1.t3Dmodel:struct t3DModel{int numOfObjects; // object的数量(总数)int numOfMaterials; // materials 的数量(总数)vector<tMaterialInfo> pMaterials; // 存贮materials 信息的列表vector<t3DObject> pObject; // 存贮object信息的列表};2.tMaterialInfo:struct tMaterialInfo{char strName[255]; // 材质的名字char strFile[255]; // 材质的文件名(真正存在harddisk的bmp)BYTE color[3]; // object 的颜色(RGB) (0~255)Int texureId; // 材质的ID}3.3DObject:struct t3DObject{int numOfVerts; // object 的顶点数int numOfFaces; // object 的面数int numTexVertex; // 材质坐标的个数int materialID; // 材质ID ,正是材质数组中的索引bool bHasTexture; //有材质就为真char strName[255]; // object的名字CVector3 *pVerts; // object 的顶点,将会指向一个数组CVector3 *pNormals; // object 的法线(只是一个近似的法线)将会指向一个数组CVector3 *pFaceNorm; // 面的法线,将会指向一个数组CVector3 *pFaceVert1; // 面的顶点x,将会指向一个数组CVector3 *pFaceVert2; // 面的顶点y,将会指向一个数组CVector3 *pFaceVert3; // 面的顶点z,将会指向一个数组CVector2 *pTexVerts; // 材质的坐标(二维)将会指向一个数组tFace *pFaces; // 面的结构(在后面有注解)将会指向一个数组};其中:struct tFace{int vertIndex[3]; // 组成面三角形顶点的索引(整型)int coordIndex[3]; // 组成面三角形材质的索引(整型)};6.3 3D动画的实现读取3DS文件的全部操作封装在了CLoad3DS类中,有关CLoad3DS类的具体定义所附光盘中的源程序3ds.cpp and 3ds.h。

基于OpenGL和VC的树木三维可视化研究

基于OpenGL和VC的树木三维可视化研究

基于OpenGL和VC的树木三维可视化研究摘要:本文给出了visual c++下的opengl通用基础框架程序架构,并基于图形纹理映射技术,在visual c++中利用opengl,通过纹理实时处理方法、纹理贴图方法实现了栎树的建模,取得了较好的仿真效果。

关键词:树木可视化 opengl visual c++景观可视化建模是当前3dgis、虚拟现实等领域研究的热点之一,其核心技术是计算机图形学。

对于计算机图形技术而言,生成植物、地形等一类具有真实感的自然景物比人造物体的仿真要复杂得多[1]。

由于自然景物没有规则的几何外形,而且自然景物具有丰富的无限细微的结构,很难用传统的几何方法加以描述。

树木无疑是自然场景的重要构成因素,树木种类繁多、形态各异,复杂的结构使其无论在造型、存储还是绘制上都存在相当的困难。

本文基于opengl与visual c++对宝天曼自然保护区的栎树进行仿真,取得了较好的可视化效果。

1、开发框架在目前众多的windows应用程序开发工具中,微软公司的visual c++6.0已经成为opengl图形应用的首选开发工具,而要使用opengl图形库来开发2d/3d的应用程序,就必须首先解决程序框架的问题[2,3]。

下面就如何建立一个通用基础框架程序做详细的介绍。

(1)首先启动visual c++6.0程序,建立一个新的工程;(2)完成opengl基础库设置;(3)添加变量和函数。

主要包括添加公共成员变量、数组、成员函数、消息响应函数到类等操作;(4)变量初始化;(5)设置像素格式。

在初始化opengl时,初始化函数需要一种叫做pixelformatdescriptor的结构,来完成对像素属性的设置,包括缓存设置、颜色模式、颜色位数、深度缓存位数等。

(6)使用渲染描述表。

创建渲染描述表可以使用以下语句来完成:(7)opengl 其他设置。

2、实现方法2.1 纹理实时处理方法void crenderview::loadtextureimage(cstring strfilepath) {glint m_treetexwidth=256,m_treetexheight=256;image=auxdibimageload(strfilepath);myimage=(unsigned char*)malloc(m_treetexwidth*m_treetexheight*3);glpixelstorei(gl_unpack_alignment,1);glteximage2d(gl_texture_2d,0,4,m_treetexwidth,m_treetex height,0,gl_rgba, gl_unsigned_byte, rgba);/*glteximage2d()函数表示定义一个二维纹理映射。

渲染填充凹凸多边形OpenGL(总结)

渲染填充凹凸多边形OpenGL(总结)

渲染填充凹凸多边形OpenGL(总结)OpenGL中认为合法的多边形必须是凸多边形,凹多边形、⾃交多边形、带孔的多边形等⾮凸的多边形在OpenGL中绘制会出现出乎意料的结果。

例如,在⼤多数系统中,只有多边形的凸包被填充,⽽在有些系统中,并⾮所有的凸包都被填充。

OpenGL之所以对合法多边形类型做出限制,是为了更⽅便地提供能够对符合条件的多边形进⾏快速渲染的硬件。

简单多边形可被快速地渲染,⽽复杂多边形难以快速检测出来。

为了最⼤限度的提⾼性能,OpenGL假定多边形是简单的。

解决凹多边形渲染的⽅法有以下⼏种:第⼀种解决⽅案:多边形⽹格化法 - 已实现并测试对于⾮简单多边形、⾮凸多边形或有洞的多边形,OpenGL在GLU库中提供了⼀个多边形⽹格化对象GLUtesselator,对多边形进⾏⽹格化————将它们分解成⼀组简单的、能够进⾏渲染的OpenGL多边形。

经测试这种⽅法对凹凸多边形和⾃交、带孔多边形都能正确的渲染。

第⼆种解决⽅案:模板缓冲法stencil Buffer - 以实现并测试// 具体流程阐述:// 1.申请模板缓存区为了使⽤OpenGL的模板功能,⾸先必须使⽤平台特定的OpenGL设置过程请求⼀个模板缓存区。

在以VC++.NET为基础的OpenGL平台中,是在设置像素格式时在PIXELFORMATDESCRIPTOR结构中指定的模板缓存,并且需要指定模板缓存的位数。

如果使⽤GLUT,在初始化显⽰模式时请求⼀个模板缓存区,下⾯的代码设置了带模板缓存的双缓存RGB颜⾊缓存区:glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_STENCIL)。

如果使⽤了全屏反⾛样功能,wglChoosePixelFormatARB 使⽤的参数中int iAttributes[] ={WGL_DRAW_TO_WINDOW_ARB,GL_TRUE,WGL_SUPPORT_OPENGL_ARB,GL_TRUE,WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,WGL_COLOR_BITS_ARB,24,WGL_ALPHA_BITS_ARB,8,WGL_DEPTH_BITS_ARB,16,WGL_STENCIL_BITS_ARB,8,WGL_DOUBLE_BUFFER_ARB,GL_TRUE,WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,WGL_SAMPLES_ARB,4,0,0};WGL_STENCIL_BITS_ARB后⾯的参数决不能为0,⽤8就可以。

基于WinCC剪切机三维动画软件设计与实现

基于WinCC剪切机三维动画软件设计与实现

基于WinCC剪切机三维动画软件设计与实现刘学;迟秀荣【摘要】主要介绍的是在组态软件WinCC 中实现对工业剪切机剪切过程的三维动态模拟,本软件基于ActiveX插件技术实现与WinCC软件的通信和数据传递,采用MFC框架结合OpenGL三维图形库来实现三维物体的显示控制,采用3D Max软件绘制的剪切机三维建模并导出的通用3D建模文件OBJ。

在OpenGL中调用OBJ文件实现具体的3D的动画显示。

%This paper refers to the realization of 3D-simulation of the industrial process of sheer forming machine based on WinCC. The realization of the software uses ActiveX software framework to communicate and transfer data with WinCC, combines OpenGL and MFC framework to realize the display and control of 3D objects and simulates the manufacturing process by the OBJ files drawn in 3D Max. That functions in OpenGL parse OBJ files provides the main animation of movements.【期刊名称】《齐齐哈尔大学学报(自然科学版)》【年(卷),期】2014(000)001【总页数】5页(P40-44)【关键词】WinCC;三维动画;剪切机;OpenGL【作者】刘学;迟秀荣【作者单位】哈尔滨理工大学计算机科学与技术学院,哈尔滨 150080;中国环境管理干部学院,河北秦皇岛066000【正文语种】中文【中图分类】TP311.52随着工业现代化进程的不断发展,工业组态软件在真实工业现场中的使用也越来越频繁、功能不断完善,已成为工业控制不可缺少的一部分。

GIS系统三维地景仿真设计教程

GIS系统三维地景仿真设计教程

OpenGL基本程序框架的搭建引言GIS(地理信息系统)、GPS(全球定位系统)和RS(卫星遥感技术)三大空间科学技术并称为"3S"技术,被认为是21世纪信息科学技术发展的重要前沿技术。

特别是进入新世纪,GIS已经列为我国信息产业中的支柱产业之一。

在各种地形数字仿真应用系统中,核心应用系统无一不是高度依赖空间数据,无一不是基于GIS技术平台。

GIS是一个知识面非常宽的应用技术学科,本系列文章将从三维地景仿真的角度对其进行介绍,其间将对DEM数字高程模型和OpenGL等主要技术进行介绍。

此类GIS应用软件通常多建立在OpenGL平台之上,本系统也不例外。

在实现其他特殊功能之前,必须首先正确配置、安装好OpenGL环境,然后才能进行各种实用功能的开发。

下面将对OpenGL做一个简短的介绍,并开始OpenGL应用程序框架的搭建工作。

OpenGL概述OpenGL是一种到图形硬件的软件接口。

从本质上说,它是一个完全可移植并且速度很快的3D图形和建模库。

通过使用OpenGL,可以创建视觉质量接近射线跟踪程序的精致漂亮的3D图形。

但是它在执行速度上要比射线跟踪程序快好几个数量级。

OpenGL使用的是由Silicon Graphcs(SGI)公司精心开发的优化算法,这家公司在计算机图形和动画领域是公认的业界领袖。

开发者可以利用OpenGL提供的150多个图形函数轻松建立三维模型并进行三维实时交互。

这些函数并不要求开发者将三维物体模型的数据写成固定的数据格式,这样一来开发者就不仅可以直接使用自己的数据,而且还可以利用其他格式的数据源,能在很大程度上缩短软件的开发周期。

OpenGL不仅可对整个三维模型进行渲染并绘制出逼真的三维景象,而且还可以进行三维交互、动作模拟等处理。

其提供的基本功能具体包含以下几方面的内容:(1)模型绘制。

在OpenGL中通过对点、线和多边形等基本形体的绘制可以构造出非常复杂的三维模型。

混合编程与Fortran计算程序可视化

混合编程与Fortran计算程序可视化

收稿日期:1999203215(修改稿) 张志华 博士研究生。

研究方向:压电陶瓷机电耦合、计算机应用软件。

 王林江 副研究员。

 研究方向:计算力学。

 吕庆风 研究员。

研究方向:飞机总体设计。

混合编程与F ortran 计算程序可视化张志华 王林江 吕庆风 南京航空航天大学 江苏・南京(210016)摘 要 本文探索了用VC ++,F ortran ,OpenG L 进行混合编程的方法。

该方法充分发挥了三种语言各自的优点,既能设计出画面丰富多彩,方便人机对话的界面,又能最大限度利用已有的用F ortran 语言编写的程序资源,并实现计算结果的可视化。

用作者已有的用F ortran 语言编写的源程序进行了尝试,结果良好。

关键词 VC ++,F ortran ,OpenG L ,混合编程,可视化PROGRAMMING ON MECHANICS CALCU LATIONWITH MIXED LANGUAGESZh ang Zhihu a W ang Linjiang L üQ ingfengNanjing Univer sity o f Aeronautics and Astronautics ,Jiangsu ・Nanjing 210016Abstract Using VC ++to design color ful friendly inter face ,using F ortran to calculate ,using OpenG L todraw ,this paper dwells on programming with mixed languages to the full advantage of every one.I t is valuable for many procedures com piled in F ortran before to be Visualized for better use.The attem pt with existed s oftware com piled by authors results in success.K eyw ords VC ++,F ortran ,OpenG L ,Programming with mixed languages ,Visualization1 引言现有的机械设计,力学计算,工程分析软件,大多都是用F ortran 语言编写的。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档