当前位置:首页 » 编程软件 » 三维图形编程

三维图形编程

发布时间: 2022-06-08 10:45:09

㈠ 图形学编程

在三维绘图蓬勃发展的过程中,计算机公司推出了大量的三维绘图软件包。其中SGI公司推出的OpenGL,作为一个性能优越的图形应用程序设计界面(API)异军突起,取得了很大的成就。它以高性能的交互式三维图形建模能力和易于编程开发,得到了Microsoft、IBM、DEC、Sun、HP等大公司的认同。因此,OpenGL已经成为一种三维图形开发标准,是从事三维图形开发工作的必要工具。

1、初始化OpenGL绘图环境

1.1 定义颜色格式和缓冲模式

OpenGL提供两种颜色模式:RGB(RGBA)模式和颜色索引模式(调色板)。在RGBA模式下所有颜色的定义用RGB三个值来表示,有时也加上Alpha值(表示透明度)。RGB三个分量值的范围都在0和1之间,它们在最终颜色中所占的比例与它们的值成正比。如:(1、1、0)表示黄色,(0、0、1)表示蓝色。颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜色索引值表示(类似于从调色板中选取颜色)。由于三维图形处理中要求颜色灵活,而且在阴影,光照,雾化,融合等效果处理中RGBA的效果要比颜色索引模式好,所以,在编程时大多采用RGBA模式。

OpenGL提供了双缓存来绘制图像。即在显示前台缓存中的图像同时,后台缓存绘制第二幅图像。当后台绘制完成后,后台缓存中的图像就显示出来,此时原来的前台缓存开始绘制第三幅图像,如此循环往复,以增加图像的输出速度。

设置窗口显示模式函数:

void auxInitDisplayMode(
AUX_DOUBLE | // 双缓存方式
AUX_RGBA // RGBA颜色模式
);

1.2 设置光源

OpenGL的光源大体分为三种:环境光(Ambient light),即来自于周围环境没有固定方向的光。漫射光(Diffuse light)来自同一个方向,照射到物体表面时在物体的各个方向上均匀发散。镜面光(Specular light)则是来自于同一方向,也沿同一个方向反射。全局环境光是一种特殊的环境光,它不来自特于某种定光源,通常做为场景的自然光源。

指定光源函数:

void glLightfv(
Glenum light, // 光源号
Glenum pname, // 指明光源类型:
// GL_DIFFUSE 光源为漫射光光源
// GL_AMBIENT 光源为环境光光源
// GL_SPECULAR 光源为镜面光光源
const Glfloat* params // 指向颜色向量的指针
);

设置全局环境光函数:

void glLightModelfv(
GL_LIGHT_MODEL_ AMBIENT,
const Glfloat* param // param:指向颜色向量的指针
);

起用光源函数:

void glEnable(GL_LIGHTING);
void glEnable(GL_enum cap); // cap:指明光源号

1.3 设置材质

在OpenGL中,用材料对光的三原色(红绿蓝)的反射率大小来定义材料的颜色。与光源相对应,材料的颜色,也分为环境色,漫反射色和镜面反射色,由此决定该材料对应不同的光呈现出不同的反射率。由于人所看到物体的颜色是光源发出的光经物体反射后进入眼睛的颜色。所以,物体的颜色是光源的环境光,漫反射光和镜面反射光与材料的环境色,漫反射色和镜面反射色的综合。例如:OpenGL的光源色是(LR、LG、LB),材质色为(MR、MG、MB),那么,在忽略其他反射效果的情况下,最终进入眼睛的颜色是(LR*MR、LG*MG、LB*MB)。

材质定义函数:

void glMaterialfv(
GLenum face, // 指明在设置材质的哪个表面的颜色。
// 可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK
GLenum pname, // 与光源的pname参数相似
const float* params // 指向材质的颜色向量
);

1.4 定义投影方式

也即选择观察物体的角度和范围。由于我们是三维绘图,所以采用不同的视点和观察范围,就会产生不同的观察效果。由于计算机只能显示二维图形,所以在表示真实世界中的三维图形时,需将三维视景转换成二维视景。这是产生三维立体效果的关键。OpenGL提供了两种将3D图形转换成2D图形的方式。正投影(Orthographic Projection)和透视投影(Perspective Projection)。其中,正投影指投影后物体的大小与视点的远近无关,通常用于CAD设计;而透视投影则符合人的心理习惯,离视点近的物体大,离视点远的物体小。此外,在OpenGL中还要定义投影范围,只有在该范围中的物体才会被投射到计算机屏幕上,投影范围外的物体将被裁减掉。

定义投影范围(不同的投影方式对应不同函数):

void glOrtho(
GLdouble left, GLdouble right,
// (left,bottom,near)及(right,top,far)分别给出正射投
GLdouble bottom, GLdouble top, // 影投影范围的左下角和右上角的坐标。
GLdouble near,GLdouble far);

2、定义与Windows接口的系统函数

2.1 定义绘图窗口的位置

// (x,y)给出窗口左上角坐标
// width及heigh给出窗口的宽高
void auxInitPosition(GLint x,GLint y,GLsizei width, GLsizei heigh);

2.2 定义绘图窗口的标题

// STR表示窗口标题字串
void auxInitWindow(GLbyte* STR);

2.3 定义绘图窗口改变时的窗口刷新函数

// 当窗口改变形状时调指定的回调函数
// NAME表示回调函数名称
void auxReshapeFunc(NAME);

2.4 定义空闲状态的空闲状态函数以实现动画

// 当系统空闲时调用指定的回调函数
// NAME表示回调函数名称
void auxIdleFunc(NAME);

2.5 定义场景绘制函数(当窗口更新或场景改变时调用)

// 当窗口需要更新或场景变化时调用
// NAME表示回调函数名称
void auxMainLoop(NAME);
在VC编辑器下键入下述代码后,保存为后缀是.cpp的C++文件。开始编译,在“The build command requires an active project workspace”。“Would you like to create a default project workspace”? 的提示后,选择“是(Y)”。进入“Project”菜单,选择“Setting”项,弹出“Project Setting”对话框,选择“Link”项,在“Libaray”栏目中加入OpenGL提供的函数库:“opengl32.lib glu32.lib glaux.lib”。(注意:在执行程序时,Windows的system目录下要包含opengl32.dll及glu32.dll两个动态连接库)。附源程序代码:

#include "windows.h"
#include "gl/gl.h"
#include "gl/glaux.h"
#include "gl/glu.h"
#include "math.h"

void myinit()
{
glClearColor(1,1,0,0);
GLfloat ambient[]={.5,.5,.5,0};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
GLfloat mat_ambient[]={.8,.8,.8,1.0};
GLfloat mat_diffuse[]={.8,.0,.8,1.0};
GLfloat mat_specular[]={1.0,.0,1.0,1.0};
GLfloat mat_shininess[]={50.0};
GLfloat light_diffuse[]={0,0,.5,1};
GLfloat light_position[]={0,0,1.0,0};
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0,GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
}

void CALLBACK display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
auxSolidSphere(1.0); // 绘制半径为1.0的实体球
glFlush(); // 强制输出图像
auxSwapBuffers(); // 交换绘图缓存
_sleep(100);
}

void CALLBACK Idledisplay()
{
// x,y满足x2+y2=0.01。这样可以使物体沿该圆轨迹运动。
static float x=-.1,y=0.0;
static BOOL mark=TRUE;
static float step=.01;
x+=step;
if(x<=.1&&x>=-.1)
{
if(step>0)
y=sqrt(.01-x*x);
else
y=-sqrt(.01-x*x);
glTranslatef(x,y,0);
}
else
{
step=0-step;
}
display();
}

void CALLBACK myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-3.5,3.5,-3.5*(GLfloat)w/(GLfloat)h, 3.5*(GLfloat)w/(GLfloat)h,-10,10);
else
glOrtho(-3.5*(GLfloat)w/(GLfloat)h,3.5* (GLfloat)w/(GLfloat)h,-3.5,3.5,-10,10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void main()
{
auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);
auxInitPosition(0,0,400,400);
auxInitWindow(" circle ");
myinit();
auxReshapeFunc(myReshape);
auxIdleFunc(Idledisplay);
auxMainLoop(display);
}

给你一个关于VC和OPENGL的网站,不错的
http://dev.yesky.com/402/2084902.shtml

㈡ 三维图形可视化制作技术

(一)OpenGL

OpenGL(Open Graphics Libaray)由SGI公司为其图形工作站开发的可以独立于窗口操作和硬件环境的图形开发系统。其目的是将用户从具体的硬件和操作系统中解放出来。用此系统可以不去理解这些系统的结构和指令系统,只要按规定的格式书写应用程序就可以在任何支持该语言的硬件平台上执行。由于OpenGL的高度可重用性,已经有几十家大公司表示接受OpenGL作为标准软件接口,目前加入OpenGL ARB(OpenGL体系结构审查委员会)的成员有SGI公司、HP公司、MicroSoft公司、Intel公司、IBM公司、SUN公司、DEC公司、AT&T公司的Unix软件实验室等。在该组织的努力下,OpenGL已经成为高性能图形和交互式视景处理的工业标准,能够在Windows95/98、Windows NT、Windows 2K、Macos、Beos、OS/2以及Unix上应用。OpenGL的实质是作为图形硬件的软件接口,是一组三维的API函数。

1.OpenGL的主要功能

(1)建模。不但有简单的点线面还提供了复杂的三维物体(球、锥等)以及复杂的曲线曲面(Bezier、Nurbs等)绘制函数。

(2)变换。主要包括基本变换(平移、旋转等)和投影变换(平行、透视投影等)。

(3)颜色模式设置。RGBA模式、ColorIndex颜色索引。

(4)光照和材质设置。OpenGL光有辐射光、环境光、漫反射光、镜面光;材质是用光反射率来表示的。场景中物体最终反映到人眼的颜色是光的RGB分量和材质的RGB分量叠加形成的。

(5)纹理映射。主要表达物体表面的细节。

(6)位图显示和图像增强。图像功能除了基本的复制和图像像素读写外,还提供融合(Blending)、反走样(Antialiasing)、雾化(Fog)等特殊的图像处理效果。

(7)双缓冲(Double Buffering)动画。双缓冲即前台缓冲和后台缓冲。后台计算场景、产生画面,前台显示后台已经计算好的画面。

(8)交互技术。主要是提供三种工作模式:绘图模式、选择模式和反馈模式。绘图模式完成场景的绘制,可以借助物体的几何参数及运动控制参数、场景的观察参数、光照参数和材质参数、纹理参数、OpenGL函数的众多常量控制参数、时间参数等和Windows对话框、菜单、外部设备等构成实时交互的程序系统。在选择模式下,则可以对物体进行命名,选择命名的物体,控制对命名的物体的绘制。而反馈模式则给程序设计提供了程序运行的信息,这些信息也可反馈给用户,告诉用户程序的运行状况和监视程序的运行进程。

(9)其他。利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等特殊效果。

2.OpenGL的基本原理

OpenGL是一个硬件发生器的软件接口,其主要目的是将二维、三维物体绘制到一个帧缓冲里,它包括几百个图形函数。开发者主要利用这些函数来建立三维模型和进行三维实时交互。

(1)图元操作和指令。OpenGL能够从多种可选择的模式画图元,而且一种模式的设置一般不会影响其他模式的设置,无论发生深墨情况,指令总是被顺序处理,也就是说,一个图元必须完全画完之后,后继图元才能影响帧存。

(2)图形控制。OpenGL提供诸如变换矩阵、光照、反走样方法、像素操作等参数来控制二维和三维图形的绘制。它并不提供一个描述或建立复杂几何物体的手段。OpenGL提供的是怎样画复杂物体的机制而非描绘复杂物体本身的面面俱到的工具。即OpenGL是过程性的而非描述性的。

(3)执行模式。OpenGL命令的解释模式是客户/服务器模式的,即由客户发布命令,命令由OpenGL服务器(解释器)来处理,服务器可以运行在相同的或不同的计算机上,基于这一点,OpenGL是网络透明的。

地下水三维可视化系统开发与应用

3.OpenGL的命令语法与状态

基于OpenGL标准开发的微机应用程序必须在32位Windows平台下,如Windows98/NT环境,运行时所需的动态连接库为OpenGL32.DLL、Glu32.DLL。OpenGL包含100多个库函数,这些函数按一定的格式来命名。

(1)核心函数115个,每个函数以gl开头,这些函数是最基本的,可以运行在任何工作平台上。这些函数创建二维和三维几何形体,设置视点,建立视觉体,设置颜色及材质,建立灯光,进行纹理映射,反走样,处理融合,雾化场景等,它们可以接受不同的参数,因而可派生300多个函数。

(2)OpenGL实用库函数以glu开头,共43个。这些函数基于OpenGL核心函数,主要提供对辅助函数的支持,并且执行了核心OpenGL函数的交互,因而是比核心函数更高一层的函数,也更有通用性。可以运行在任何OpenGL工作平台上。

(3)辅助库函数,共31个。以aux开头,它们是一类特殊的OpenGL函数,是帮助初学者尽快进入OpenGL编程而做简单练习用的。因此并不能在所有平台上运行。但Windows98/NT支持它们。

(4)Windows专用库函数,以wgl开头。主要是连接OpenGL和Windows窗口系统的,用它们可以管理着色描述表及显示列表,扩展功能,管理字体位图等。

(5)Win32 API函数,共6个,用于处理像素格式及缓冲。

(6)OpenGL结构,共4个。

4.OpenGL图形操作步骤

步骤1:设置像素格式:主要包括建立OpenGL绘制风格、颜色模式、颜色位数、深度位数等;

步骤2:建立模型:建立三维模型;

步骤3:舞台布景:如何把景物放置在三维空间的适当位置,设置三维透视视觉体以观察场景;

步骤4:效果处理:设置物体的材质(颜色、光学性能及纹理映射等)加入光照及光照条件;

步骤5:光栅化:把景物及其颜色信息转化为可在计算机上显示的像素信息。

(二)VRML

1.VRML简介

VRML是英文Virtual Reality Modeling Language——虚拟现实造型语言的缩写。其最初的名字叫Virtual Reality Makeup Language。名字是由第一届WWW(1994,日内瓦)大会上,由Tim Berners Lee和Dave Raggett所组织的一个名为Bird-of-a-Feather(BOF)小组提出的。后来Makeup改为Modeling。VRML和HTML是紧密相连的,是HTML在3D领域的模拟和扩展。由于VRML在Internet具有良好的模拟性和交互性,因而显示出强大的生命力。

VRML是一种3D交换格式,它定义了当今3D应用中的绝大多数常见概念,诸如变换层级、光源、视点、几何、动画、雾、材质属性和纹理映射等。VRML的基本目标是确保能够成为一种有效的3D文件交换格式。

VRML是HTML的3D模型。它把交互式三维能力带入了万维网,即VRML是一种可以发布3D网页的跨平台语言。事实上,三维提供了一种更自然的体验方式,例如游戏、工程和科学可视化、教育和建筑。诸如此类的典型项目仅靠基于网页的文本和图像是不够的,而需要增强交互性、动态效果连续感以及用户的参与探索,这正是VRML的目标。

VRML提供的技术能够把三维、二维、文本和多媒体集成为统一的整体。当把这些媒体类型和脚本描述语言(scripting language)以及因特网的功能结合在一起时,就可能产生一种全新的交互式应用。VRML在支持经典二维桌面模型的同时,把它扩展到更广阔的时空背景中。

VRML是赛博空间(cyber space)的基础。赛博空间的概念是由科幻作家William Gibson提出的。虽然VRML没有为真正的用户仿真定义必要的网络和数据库协议,但是应该看到VRML迅速发展的步伐。作为标准,它必须保持简单性和可实现性,并在此前提下鼓励前沿性的试验和扩展。

2.VRML的基本工作原理及其特性

(1)用文本信息描述三维场景。在Internet网上传输,在本地机上由VRML的浏览器解释生成三维场景,解释生成的标准规范即是VRML规范。正是基于VRML的这种工作机制,才使其可能在网络应用中有很快的发展。当初VRML的设计者们考虑的也正是文本描述的信息在网络上的传输比图形文件迅速,所以他们避开在网络上直接传输图形文件而改用传输图形文件的文本描述信息,把复杂的处理任务交给本地机从而减轻了网路的负荷。

(2)统分结合模式。VRML的访问方式基于C/S模式,其中服务器提供VRML文件,客户通过网络下载希望访问的文件,并通过本地平台的浏览器(Viewer)对该文件描述的VR世界进行访问,即VRML文件包含了VR世界的逻辑结构信息,浏览器根据这些信息实现许多VR功能。这种由服务器提供统一的描述信息,客户机各自建立VR世界的访问方式被称为统分结合模式,也是VRML的基本概念。由于浏览器是本地平台提供的,从而实现了VR的平台无关性。

(3)基于ASCII码的低带宽可行性。VRML像HTML一样,用ASCII文本格式来描述世界和链接,保证在各种平台上通用,同时也降低了数据量,从而在低带宽的网络上也可以实现。

(4)实时3D着色引擎。传统的VR中使用的实时3D着色引擎在VRML中得到了更好的体现。这一特性把VR的建模与实时访问更明确地隔离开来,也是VR不同于三维建模和动画的地方。后者预先着色,因而不能提供交互性。VRML提供了6+1个自由度,即三个方向的移动和旋转,以及和其他3D空间的超链接(Anchor)。

(5)可扩充性。VRML作为一种标准,不可能满足所有应用的需要。有的应用希望交互性更强,有的希望画面质量更高,有的希望VR世界更复杂。这些要求往往是相互制约的,同时又受到用户平台硬件性能的制约,因而VRML是可扩充的,即可以根据需要定义自己的对象及其属性,并通过Java语言等方式使浏览器可以解释这种对象及其行为。

(三)X3D

X3D(Extensible 3D——可扩展3D)是一个软件标准,定义了如何在多媒体中整合基于网络传播的交互三维内容。X3D将可以在不同的硬件设备中使用,并可用于不同的应用领域中。比如工程设计、科学可视化、多媒体再现、娱乐、教育、网页、共享虚拟世界等方面。X3D也致力于建立一个3D图形与多媒体的统一的交换格式。X3D是VRML的继承。VRML(Virtual Reality Modeling Language-虚拟现实建模语言)是原来的网络3D图形的ISO标准(ISO/IEC 14772)。X3D相对VRML有了改进,提供了以下的新特性:更先进的应用程序界面,新添的数据编码格式,严格的一致性,组件化结构(用来允许模块化的支持标准的各部分)。

1.X3D设计目标

X3D确立了以下的设计目标:

(1)分离数据编码和运行时间结构;

(2)支持大量的数据编码格式,包括XML(Extensible Markup Language);

(3)增加新的绘图对象、行为对象、交互对象;

(4)给3D场景提供可选的应用程序界面(APIs);

(5)定义规格的子集“概貌(Profiles)”以适合不同的市场需要;

(6)允许在不同层次(1evels)的服务上都能实现X3D规格;

(7)尽可能添加完善规格中行为的定义或描述。

2.X3D特性

为了满足工程设计、科学可视化、多媒体再现、娱乐、教育、网页、共享虚拟世界等方面使用的需要,X3D添加了以下的新特性:

(1)3D图形:多边形化几何体、参数化几何体、变换层级、光照、材质、多通道/多进程纹理帖图;

(2)2D图形:在3D变换层级中显示文本、2D矢量、平面图形;

(3)动画:计时器和插值器驱动的连续动画;人性化动画和变形;

(4)空间化的音频和视频:在场景几何体上映射视听源;

(5)用户交互:基于鼠标的选取和拖曳;键盘输入;

(6)导航:摄像机;用户在3D场景中的移动;碰撞、接近和可见性检测;

(7)用户定义对象:通过创建用户定义的数据类型,可以扩展浏览器的功能;

(8)脚本:通过程序或脚本语言,可以动态地改变场景;

(9)网络:可以用网络上的资源组成一个单一的X3D场景;可以通过超链接对象连接到其他场景或网络上的其他资源;

(10)物理模拟:人性化动画;地理化数据集;分布交互模拟(Distributed Interactive Simulation-DIS)协议整合。

(四)Java 3D

Java 3D用其自己定义的场景图和观察模式等技术构造了3D的上层结构,实现了在Java平台使用三维技术。Java 3D API是Sun定义的用于实现3D显示的接口。3D技术是底层的显示技术,Java 3D提供了基于Java的上层接口。Java 3D把OpenGL和DirectX这些底层技术包装在Java接口中。这种全新的设计使3D技术变得不再繁琐并且可以加入到J2SE、J2EE的整套架构,这些特性保证了Java 3D技术强大的扩展性。Java 3D建立在Java2(Java1.2)基础之上,Java语言的简单性使Java 3D的推广有了可能。Java 3D是在OpenGL的基础上发展起来的,可以说是Java语言在三维图形领域的扩展,其实质是一组API即应用程序接口。利用Java 3D所提供的API就可以编写出一些诸如三维动画、远程三维教学软件、三维辅助设计分析和模拟软件,以及三维游戏等。它实现了以下三维功能:

(1)生成简单或复杂的形体(也可以调用现有的三维形体);

(2)使形体具有颜色、透明效果、贴图;

(3)在三维环境中生成灯光、移动灯光;

(4)具有行为的处理判断能力(键盘、鼠标、定时等);

(5)生成雾、背景、声音;

(6)使形体变形、移动、生成三维动画;

(7)编写非常复杂的应用程序,用于各种领域如VR(虚拟现实)。

1.Java 3D的数据结构

Java 3D的数据结构和OpenGL的数据结构一样,采用的是场景图的数据结构,但Java 3D根据Java语言的特点。Java 3D的场景图是DAG(Directed-acyclic Graph),其特点是具有方向的不对称性。Java 3D的场景图由Java 3D的运行环境直接转变成具有三维显示效果的显示内存数据,从而在计算机上显示出三维效果,显示内存中不断接收Java 3D的运行最新结果,从而产生三维动画。

2.、Java 3D(API)中的类

Java 3D是根据OpenGL的三维图形库及VRML的基础上开发出来的一个API,里面包含了几乎所有编写Java交互式三维应用程序所需的最基本的类(类方法)、接口。主要存放在程序包Javax.media.j3d中,这些是Java 3D的核心类。另外,还有提供一个有助于快速编程的应用类型的包(Utility包)com.sun.j3d.utils(可或缺,主要是能大大地提高程序的编写效率)。除了核心类和Utility包之外,还有:

(1)Java.awt(主要是定义一个显示用的窗口);

(2)Javax.vecmath(主要是处理定义的矢量计算所用的类,今后核心类);

(3)Java 3D的类根据作用可分为Node、NodeComponent,其中Node又分为Group及Leaf两个子类。

(五)IDL

1.IDL简介

IDL(Interactive Data Language)是美国RSI公司(Research System Inc)的产品,它集可视、交互分析、大型商业开发为一体,为用户提供了完善、灵活、有效的开发环境。IDL的主要特性包括:

(1)高级图像处理、交互式二维和三维图形技术、面向对象的编程方式、OpenGL图形加速、跨平台图形用户界面工具包、可连接ODBC兼容数据库及多种程序连接工具等。

(2)IDL是完全面向矩阵的,因此具有处理较大规模数据的能力。IDL可以读取或输出有格式或无格式的数据类型,支持通用文本及图像数据,并且支持在NASA,TPT,NOAA等机构中大量使用的HDF,CDF及netCDF等科学数据格式及医学扫描设备的标准格式DICOM格式。IDL还支持字符、字节、16位整型、长整型、浮点、双精度、复数等多种数据类型。能够处理大于2Gb的数据文件。IDL采用OpenGL技术,支持OpenGL软件或硬件加速,可加速交互式的2D及3D数据分析、图像处理及可视化。可以实现曲面的旋转和飞行;用多光源进行阴影或照明处理;可观察体(Volume)内部复杂的细节;一旦创建对象后,可从各个不同的视角对对象进行可视分析。

(3)IDL具有图像处理软件包,例如感兴趣区(ROI)分析及一整套图像分析工具、地图投影及转换软件包,宜于GIS的开发。

(4)IDL带有数学分析和统计软件包,提供科学计算模型。可进行曲线和曲面拟合分析、多维网格化和插值、线性和非线性系统等分析。

(5)用IDL DataMiner可快速访问、查询并管理与ODBC兼容的数据库,支持Oracle,Informix,Sybase,MS SQL等数据库。可以创建、删除、查询表格,执行任意的SQL命令。

(6)IDL可以通过ActiveX控件将IDL应用开发集成到与COM兼容的环境中。用Vi-sual Basic,Visual C++等访问IDL,还可以通过动态连接库方式从IDL调用C,Fortran程序或从其他语言调用IDL。

(7)用IDL GUIBuilder可以开发跨平台的用户图形界面(GUI),用户可以拖放式建立图形用户界面GUI,灵活、快速地产生应用程序的界面。

(8)IDL为用户提供了一些可视数据分析的解决方案,早在1982年NASA的火星飞越航空器的开发就使用了IDL软件。

2.IDL的编程方式

IDL有两种编程方式,一是利用IDL平台的GUIBuilder进行编程,这种方式的特点是所见即所得,使用IDL自身所具有的控件进行编程和界面设置,但使用灵活性不够;另一种是利用IDL平台的集成开发环境的组件编程技术,这种方式的特点是较为灵活,而且功能较强,可以随着编程者的意愿进行设置。另外在IDL中有批处理文件语句,即在命令行中直接输入命令语句来进行数据的读入和输出,以及进行属性设置和处理。此外,IDL提供IDLDRAW WIDGET控件,可进行基于COM技术的开发。

3.IDL的应用领域

由于其强大的功能和独特的特点,IDL语言可以应用地球科学(包括气象、水文、海洋、土壤、地质、地下水等)、医学影像、图像处理、GIS系统、软件开发、大学教学、实验室、测试技术、天文、航空航天、信号处理、防御工程、数学统计及分析、环境工程等很多领域,IDL语言都可以得到广泛的应用。目前应用IDL语言,已经开发出了ENVI,IMAGIS,RiverTools,医学等成熟产品。具体的应用实例也非常多,如在2000年澳大利亚悉尼奥运会综合预报系统、美国国家环境卫星数据和信息服务中心的厄尔尼诺现象分析等工作中得到了成功的应用。

北京市勘察设计研究院应用IDL语言,已开发了真三维地质分析系统AutoDig,能够直接对简单的地质数据,或其他带层次性的数据实现科学的、完整的三维建模;同时也提供真三维显示功能,不仅能对三维体实现任意的旋转、放大、缩小,而且也能实现交互式的真三维切割功能。

(六)小结

三维图形技术是随着计算机软硬件技术的发展而发展变化的,其鼻祖是SGI公司推出的OpenGL三维图形库。OpenGL是业界最为流行也是支持最广泛的一个底层3D技术,几乎所有的显卡厂商都在底层实现了对OpenGL的支持和优化。OpenGL同时也定义了一系列接口用于编程实现三维应用程序,但是这些接口使用C(C++)语言实现并且很复杂。掌握针对OpenGL的编程技术需要花费大量时间精力。

Java 3D是在OpenGL的基础上发展起来的,可以说是Java语言在三维图形领域的扩展,其实质是一组API即应用程序接口。

Direct3D是Microsoft公司推出的三维图形编程API,它主要应用于三维游戏的编程。众多优秀的三维游戏都是由这个接口实现的。与OpenGL一样,Direct3D的实现主要使用C++语言。

VRML2.0(VRML97)自1997年12月正式成为国际标准之后,在网络上得到了广泛的应用,这是一种比BASIC,JAVASCRIPT等还要简单的语言。现已发展为X3D。脚本化的语句可以编写三维动画片、三维游戏、计算机三维辅助教学。它最大的优势在于可以嵌在网页中显示。

美国RSI公司(Research System Inc)研制和开发的最新可视软件IDL(Interactive Data Language)交互式数据语言,是进行数据分析、可视化和跨平台应用开发的较佳选择,它集可视、交互分析、大型商业开发为一体,为用户提供了完善、灵活、有效的开发环境。三维技术的比较见表1-2。

表1-2 三维技术对比

㈢ Mastercam X2能使用三维图形直接编程吗

我用MastercamX 看你绘制的三维图是实体还是曲面 如果是曲面可以直接选取并编程 若是实体你是无法选中的 先把实体转换为曲面在编程 有些曲面加工模式是要指定切削范围的 所以必要时你还要绘制曲面曲线

㈣ 怎么用Visual C++6.0来实现对OpenGL三维图形的绘制

既然问这个问题,那么你首先应该已经学会使用opengl二维的图形绘制了吧?三维也只是多出一个z轴坐标而已.你以前设点要设2个坐标,那么三维则要设三个坐标.比如设一个点坐标PointA[] = { 0.5f, -sqrt(6.0f)/12, -sqrt(3.0f)/6},那么只要使用glVertex3fv(PointA)便可在此位置画出一个点,画了三个点后使用TRIANGLES便可成为一个面.下面的程序是画出一个旋转彩色四面体
#include<gl/glut.h>
#include<math.h>
#define ColoredVertex(c,v)do{glColor3fv(c);glVertex3fv(v);}while(0);
GLfloat angle=0.0f;
void myDisplay()
{
static int list=0;
if(list==0)
{
GLfloat
PointA[]={0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6},
PointB[]={-0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6},
PointC[]={0.0f,-sqrt(6.0f)/12,sqrt(3.0f)/3},
PointD[]={0.0f,sqrt(6.0f)/4,0};
GLfloat
ColorR[]={1,0,0},
ColorG[]={0,1,0},
ColorB[]={0,0,1},
ColorY[]={1,1,0};
list=glGenLists(1);
glNewList(list,GL_COMPILE);
glBegin(GL_TRIANGLES);
ColoredVertex(ColorR,PointA); //ABC
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorR,PointA); //ACD
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorY,PointD);
ColoredVertex(ColorR,PointA); //ABD;
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorY,PointD);
ColoredVertex(ColorG,PointB); //BCD
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorY,PointD);
glEnd();
glEndList();
glEnable(GL_DEPTH_TEST);
}
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,1,0.5,0);
glCallList(list);
glPopMatrix();
glutSwapBuffers();
}
void myIdle()
{
angle=angle+0.5;
if(angle>=360)
angle=0.0f;
myDisplay();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition(200, 200);
glutInitWindowSize(500, 500);
glutCreateWindow("旋转四面体");
glutDisplayFunc(&myDisplay);
glutIdleFunc(&myIdle);
glutMainLoop();
return 0;
}

㈤ 3D建模 和 编程 哪个更难

整体来说建模相对于编程要更简单一些,但因两者并不相同,所以无法进行详细对比。

编程的概念很广泛,但其本质都是为了解决人类的现实问题。通常的编程指的是给计算机编定程序,使计算机能够完成我们需要的指令,得到相应的结果。这种人与计算机之间的交流过程就叫做编程。
三维建模可以理解为在平面里显示三维图形。不像现实世界里,真实的三维空间,有真实的距离空间。计算机里只是看起来很像真实世界,因此在计算机显示的3d图形,便是让人眼看上就像真的一样。人眼有一个特性就是近大远小,便会形成立体感。计算机屏幕是平面二维的,之所以能欣赏到真如实物般的三维图像,是因显示在计算机屏幕上时色彩灰度的不同而使人眼产生视觉上的错觉,而将二维的计算机屏幕感知为三维图像。
感兴趣的点击此处,免费学习一下
如果您有学习建模的兴趣,建议您咨询广州中教在线教育科技有限公司。中教在线师资力量强大,拥有行业资深3D美术老师带你从入门到精通,课程内容设置经过1年以上市场调研,企业高层参与研发,符合企业真实岗位技术需要。教授技能同时,更教授工作标准、规范和项目流程!

㈥ Java三维几何图形编程,求过程

openGL??????

㈦ C++编程,三维图形变换,急!!!

就是数组操作,你先去看一下变换的基本原理,然后定义数组,进行加减乘除操作就可以了

㈧ 请问谁会这个图形的数控编程啊及三维图形

将俯视图底面朝上装夹,按照图形建立主视图XY坐标系

一、对于零件尺寸146X106程序
采用以下程序,对刀过程省略(Z定在),用直径60铣刀加刀具补偿30.2粗加工 再用直径6铣刀 加刀具补偿3mm精加工
G54G90G64
M3S800F800
G0X73Y92 G42T1
Z0
G1Z-6.015
Y38
G3X58Y53CR=15
G1X-58
G3X-73Y38CR=15
G1Y-38
G3X-58Y-38CR=15
G1X58
G3X73Y-58CR=10
G1Y0
G0Z50
G40
M5
M30
二、4个直径12通孔
先用6.7钻头钻通,然后用直径12扩孔刀加工成,直径12扩孔刀尺寸需要满足图纸公差,切零件加工时转速和进给率会影响零件尺寸。采用主程序调用子程序zk,程序如下:

主程序:
G55G90G64
M3S500G95F0.5
MCALL ZK
X58Y38

X-58Y38
X-58Y-38
X58Y-38
MCALL
M5
M30
子程序:
G0Z1
G1Z-25
G0Z20
M17

三、对于直径28通孔,给的刀具不合适,可以用直径6.7钻头钻通,然后用6mm铣刀,通过更改刀具轨迹半径逐渐加工。6mm铣刀精加工程序如下
G56G90G64G17
M3S800F800
G0X0Y0
Z2
G1Z-30
G1X=(28.021-6)/2
G3 I=AC(0) J=AC(0)
G0X0Y0
Z50
M5
M30

四、对于五瓣花的编程,采用旋转 ROT编程 子程序HB为一个花瓣轨迹,直径55尺寸最终加工,用直径6mm立铣刀加工,对于粗加工,需改大刀补即可,精加工刀补为3mm,精加工程序轨迹如下:
主程序:

G57G90G64
M3S800F800
HB
ROT Z=72
HB
ROT Z=144
HB
ROT Z=216
HB
ROT Z=288
HB
M5
M30
一个花瓣轨迹 子程序HB:
G0X0Y0
Z2
G41T1
G1Z-4.015
G1X13..665Y23.865
G2X11.957Y28.867 CR=4
G1X15.778Y38.093
G3X9.985Y48.993CR=8
G3X-9.985CR=50
G3X-15.778Y38.093CR=8
G1X-11.957Y28.867
G2X13.665Y23.865CR=4
G0Z50
M17

对于尺寸直径55的加工:
G54G90G64G17
M3S800F800
G0X0Y0
Z2
G1Z-4.015
G1X=(55-6)/2
G3 I=AC(0) J=AC(0)
G0X0Y0
Z50
M5
M30

㈨ AutoCAD的三维图都有哪些用途,能用于数控编程么

Autocad的好处就是能自由自在的在三维空间裏画任可线条,你只要在(Constrained - Orbit 和 New UCS --3point)的指令内运用得法,你就轻髬健立一个3D的架,然后以DXF档输到 Aphacam (我在越南通常是用Aphacam来编程)或Pro/E .然后做以3D架做纲面,把刀具路经投影到网面上这祥你加工时间可以快了很多,而且刀 路经容易控制,我在越南是5轴铣床(5aixs)的编程员,
因我是越籍广东人,所以要用中文打写是很困难,而且我是用繁体的,如你有兴趣想明白多一点请在线上以语音交谈

㈩ 用c或c++编一个画三维图形的程序

TurboC 立方体

#include <dos.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>

void DrawCube(int color);

int cx[9], cy[9];
int CubeCorners[9][4];
int CurX, CurY;
int Angle = 0;
int step = 2;
int Radius;
const double Pi = 3.14159265358979;

int main()
{
int GraphDriver;
int GraphMode;
int a, b;
GraphDriver = DETECT;
initgraph(&GraphDriver, &GraphMode, "");

Radius = 150;
CubeCorners[1][2] = 200 / 2;
CubeCorners[2][2] = 200 / 2;
CubeCorners[3][2] = -200 / 2;
CubeCorners[4][2] = -200 / 2;
CubeCorners[5][2] = 200 / 2;
CubeCorners[6][2] = 200 / 2;
CubeCorners[7][2] = -200 / 2;
CubeCorners[8][2] = -200 / 2;

DrawCube(12);

getch();
}

void DrawCube(int color)
{
int i;

for (i = 1; i <= 3; i += 2)
{
CubeCorners[i][3] = Radius * cos((Angle) * Pi / 180);
CubeCorners[i][1] = Radius * sin((Angle) * Pi / 180);
}
for (i = 2; i <= 4; i += 2)
{
CubeCorners[i][3] = Radius * cos((Angle + 2 * 45) * Pi / 180);
CubeCorners[i][1] = Radius * sin((Angle + 2 * 45) * Pi / 180);
}
for (i = 5; i <= 7; i += 2)
{
CubeCorners[i][3] = Radius * cos((Angle + 6 * 45) * Pi / 180);
CubeCorners[i][1] = Radius * sin((Angle + 6 * 45) * Pi / 180);
}

for (i = 6; i <= 8; i += 2)
{
CubeCorners[i][3] = Radius * cos((Angle + 4 * 45) * Pi / 180);
CubeCorners[i][1] = Radius * sin((Angle + 4 * 45) * Pi / 180);
}

for (i = 1; i <= 8; i++)
{
cx[i] = 300 + CubeCorners[i][1] + CubeCorners[i][3] / 8;
if (CubeCorners[i][2] > 0)
cy[i] = 200 + CubeCorners[i][2] + CubeCorners[i][3] / 8;
else if (CubeCorners[i][2] < 0)
cy[i] = 200 + CubeCorners[i][2] - CubeCorners[i][3] / 8;
else
cy[i] = 200 + CubeCorners[i][2];
}

setcolor(color);
moveto(cx[3], cy[3]);
lineto(cx[4], cy[4]);
lineto(cx[8], cy[8]);
lineto(cx[6], cy[6]);
lineto(cx[2], cy[2]);
lineto(cx[4], cy[4]);
moveto(cx[3], cy[3]);
lineto(cx[7], cy[7]);
lineto(cx[8], cy[8]);
moveto(cx[3], cy[3]);
lineto(cx[1], cy[1]);
lineto(cx[2], cy[2]);
moveto(cx[6], cy[6]);
lineto(cx[5], cy[5]);
lineto(cx[1], cy[1]);
moveto(cx[7], cy[7]);
lineto(cx[5], cy[5]);
}

热点内容
内置存储卡可以拆吗 发布:2025-05-18 04:16:35 浏览:336
编译原理课时设置 发布:2025-05-18 04:13:28 浏览:378
linux中进入ip地址服务器 发布:2025-05-18 04:11:21 浏览:613
java用什么软件写 发布:2025-05-18 03:56:19 浏览:32
linux配置vim编译c 发布:2025-05-18 03:55:07 浏览:107
砸百鬼脚本 发布:2025-05-18 03:53:34 浏览:945
安卓手机如何拍视频和苹果一样 发布:2025-05-18 03:40:47 浏览:742
为什么安卓手机连不上苹果7热点 发布:2025-05-18 03:40:13 浏览:803
网卡访问 发布:2025-05-18 03:35:04 浏览:511
接收和发送服务器地址 发布:2025-05-18 03:33:48 浏览:372