㈠ 由同一物体不同角度的图片经过复杂的算法就可以得到他的3d立体模型,这个算法具体是怎样处理数据的
3D芯片的处理对象是多边形表示的物体。用多边形表示物体有两个优点:首先是直接(尽管繁琐),
多边形表示的物体其表面的分段线性特征除轮廓外可以通过明暗处理(shading)技术消除;其次是仅存储多边形顶点的几何信息,
多边形内部每个象素的明暗颜色计算所需的信息由这些顶点信息插值而来,这正是易于用图形硬件支持的快速明暗处理技术。
支持多边形绘制的图形硬件同样也可以绘制由双三次曲面片表示的物体,通过对这种物体的表面进行三角剖分,
用逼近的三角形网格代替原物体的曲面表示就可以做到这一点。
当然,用多边形表示物体也有其缺点,如增加了纹理映射和阴影生成的难度,当需要详细表示复杂物体时所需的三角形数量将变得非常庞大。
将多边形表示的物体显示到计算机屏幕上,这一过程涉及物体在计算机内部的表示方式即物体的数据结构,
由物体组成的场景的组织结构,物体从场景到屏幕空间要经过的一系列变换,以及产生最终屏幕图象要经过的一系列光栅化处理。
这些方面都涉及到特定的处理算法,相应的算法又有许多不同的变种。
下面仅就3D芯片涉及的图形处理过程及相关算法做一简单分析介绍,这些是理解3D图形处理及图形硬件的基础。
㈡ 求数字水印国内外研究现状及发展趋势(含文献综述)
文章编号:1005 - 0523(2005) 02 - 0063 - 04
数字水印及其发展研究
石红芹,谢 昕
(华东交通大学信息工程学院,江西南昌330013)
摘要:首先对数字水印的特征进行了分析,阐述了数字水印技术的基本原理,对目前比较流行的水印算法进行了分类和详细地讨论,最后指出目前水印技术存在的局限并对其发展进行了展望.
关键词:版权保护;数字水印;水印算法
中图分类号:TP391 文献标识码:A
1 引 言
近年来,随着数字化技术的进步和Internet 的迅速发展,多媒体信息的交流达到了前所未有的深度和广度,其发布形式愈加丰富了. 网络发布的形式逐渐成为一种重要的形式,伴随而来的是多媒体数据的版权保护问题. 因此多媒体信息版权保护问题成了一项重要而紧迫的研究课题. 为了解决这一难题,近几年国际上提出了一种新的有效的数字信息产品版权保护和数据安全维护的技术一一数字水印技术. 数字水印技术通过在原始媒体数据中嵌入秘密信息———水印来证实该数据的所有权归属. 水印可以是代表所有权的文字、产品或所有ID、二维图像,视频或音频数据、随机序列等. 主要应用于:媒体所有权的认定. 即辨认所有权信息,媒体合法用户信息; 媒体的传播跟算法研究. 该子模块的研究为解决网络制造产品版权保护问题奠定了基础数字水印技术,又称数字签名技术,成为信息隐藏技术的一种重要研究分支,为实现有效的信息版权保护提供了一种重要的手段.
2 数字水印的基本原理
从图像处理的角度看,嵌入水印信号可以视为在强背景下迭加一个弱信号,只要迭加的水印信号强度低于人类视觉系统( Human Visual System ,HVS) 的对比度门限,HVS 就无法感到信号的存在.对比度门限受视觉系统的空间、时间和频率特性的影响. 因此通过对原始信号作一定的调整,有可能在不改变视觉效果的情况下嵌入一些信息,从数字通信的角度看,水印嵌入可理解为在一个宽带信道(载体图像) 上用扩频通信技术传输一个窄带信号(水印信号) . 尽管水印信号具有一定的能量,但分布到信道中任一频率上的能量是难以检测到的. 水印的译码(检测) 即是在有噪信道中弱信号的检测问题.
一般来说,为了使水印能有效地应用于版权保护中,水印必须满足如下特性:
1) 隐蔽性 水印在通常的视觉条件下应该是不可见的,水印的存在不会影响作品的视觉效果.
2) 鲁棒性 水印必须很难去掉(希望不可能去掉) ,当然在理论上任何水印都可以去掉,只要对水印的嵌入过程有足够的了解,但是如果对水印的嵌入只是部分了解的话,任何破坏或消除水印的企图都应导致载体严重的降质而不可用.
3) 抗窜改性 与抗毁坏的鲁棒性不同,抗窜改性是指水印一旦嵌入到载体中,攻击者就很难改变或伪造. 鲁棒性要求高的应用,通常也需要很强的抗窜改性. 在版权保护中,要达到好的抗窜改性是比较困难的.
4) 水印容量 嵌入的水印信息必须足以表示多媒体内容的创建者或所有者的标志信息,或是购买者的序列号. 这样在发生版权纠纷时,创建者或所有者的信息用于标示数据的版权所有者,而序列号用于标示违反协议而为盗版提供多媒体数据的用户.
5) 安全性 应确保嵌入信息的保密性和较低的误检测率. 水印可以是任何形式的数据,比如数值、文本、图像等. 所有的水印都包含一个水印嵌入系统和水印恢复系统. 水印的嵌入和提取过程分别
6) 低错误率 即使在不受攻击或者无信号失真的情况下,也要求不能检测到水印(漏检、false -negative) 以及不存在水印的情况下,检测到水印(虚检、false - positive) 的概率必须非常小.
3 数字水印算法
近几年来,数字水印技术研究取得了很大的进步,见诸于文献的水印算法很多,这里对一些典型的算法进行了分析.
3. 1 空间域算法
数字水印直接加载在原始数据上,还可以细分为如下几种方法[1~4 ] :
1) 最低有效位方法(LSB) 这是一种典型的空间域数据隐藏算法,L. F. Tumer 与R. G. Van Schyadel等先后利用此方法将特定的标记隐藏于数字音频和数字图像内. 该方法是利用原始数据的最低几位来隐藏信息(具体取多少位,以人的听觉或视觉系统无法察觉为原则) .LSB 方法的优点是有较大的信息隐藏量,但采用此方法实现的数字水印是很脆弱的,无法经受一些无损和有损的信息处理,而且如果确切地知道水印隐藏在几位LSB 中,数字水印很容易被擦除或绕过.
2) Patchwork 方法及纹理块映射编码方法
这两种方法都是Bender 等提出的. Patchwork 是一种基于统计的数字水印,其嵌入方法是任意选择N 对图像点,在增加一点亮度的同时,降低另一点的亮度值. 该算法的隐藏性较好,并且对有损的JPEG和滤波、压缩和扭转等操作具有抵抗能力,但仅适用于具有大量任意纹理区域的图像,而且不能完全自动完成.
3. 2 变换域算法
基于变换域的技术可以嵌入大量比特数据而不会导致可察觉的缺陷,往往采用类似扩频图像的技术来隐藏数字水印信息. 这类技术一般基于常用的图像变换,基于局部或是全部的变换,这些变换包括离散余弦变换(DCT) 、小波变换(WT) 、傅氏变换(FT 或FFT) 以及哈达马变换(Hadamard transform)等等. 其中基于分块的DCT 是最常用的变换之一,现在所采用的静止图像压缩标准JPEG也是基于分块DCT 的. 最早的基于分块DCT 的一种数字水印技术方案是由一个密钥随机地选择图像的一些分块,在频域的中频上稍稍改变一个三元组以隐藏二进制序列信息. 选择在中频分量编码是因为在高频编码易于被各种信号处理方法所破坏,而在低频编码则由于人的视觉对低频分量很敏感,对低频分量的改变易于被察觉. 该数字水印算法对有损压缩和低通滤波是稳健的. 另一种DCT 数字水印算法[5 ]是首先把图像分成8 ×8 的不重叠像素块,在经过分块DCT 变换后,即得到由DCT 系数组成的频率块,然后随机选取一些频率块,将水印信号嵌入到由密钥控制选择的一些DCT 系数中. 该算法是通过对选定的DCT 系数进行微小变换以满足特定的关系,以此来表示一个比特的信息. 在水印信息提取时,则选取相同的DCT 系数,并根据系数之间的关系抽取比特信息. 除了上述有代表性的变换域算法外,还有一些变换域数字水印方法,它们当中有相当一部分都是上述算法的改进及发展,这其中有代表性的算法是I. Podichuk 和ZengWenjun 提出的算法[6 ] . 他们的方法是基于静止图像的DCT 变换或小波变换,研究视觉模型模块返回数字水印应加载在何处及每处可承受的JND(Just Noticeable Difference ,恰好可察觉差别) 的量值(加载数字水印的强度上限) ,这种水印算法是自适应的.
3. 3 NEC 算法
该算法由NEC 实验室的Cox[5 ]等人提出,该算法在数字水印算法中占有重要地位,其实现方法是,首先以密钥为种子来产生伪随机序列,该序列具有高斯N(0 ,1) 分布,密钥一般由作者的标识码和图像的哈希值组成,其次对图像做DCT 变换,最后用伪随机高斯序列来调制(叠加) 该图像除直流分量外的1 000 个最大的DCT 系数. 该算法具有较强的鲁棒性、安全性、透明性等. 由于采用特殊的密钥,故可防止IBM 攻击,而且该算法还提出了增强水印鲁棒性和抗攻击算法的重要原则,即水印信号应该嵌入源数据中对人感觉最重要的部分,这种水
印信号由独立同分布随机实数序列构成,且该实数序列应具有高斯分布N(0 ,1) 的特征. 随后Podilchuk等利用人类视觉模型又对该算法进行了改进,从而提高了该算法的鲁棒性、透明性等.
3. 4 其他一些水印算法
1) 近年来,利用混沌映射模型实现数字水印、保密通信等成为混沌应用研究的热点. 特别是自从Cox 等借用通信技术中的扩频原理将水印信号嵌入到一些DCT 变换系数或者多层分解的小波变换系数以来,人们已经提出了一些混沌数字水印方法.水印的嵌入与检测是基于人类视觉系统(HVS) 的亮度掩蔽特性和纹理掩蔽特性,折衷水印的不可见性和鲁棒性之间的矛盾. 结果表明:该方法嵌入的水印具有不可见性和鲁棒性,并且这种基于密钥的混沌水印方法更好的抗破译性能.
2) 目前比较流行的还有一种基于盲水印检测的DWT 算法,该算法首先对原始图像进行小波变换,根据人类具有的视觉掩蔽特性对低频分量进行一定的量化,同时可不影响视觉效果,并对作为水印的图像进行压缩和二值化处理,形成一维的二值序列,根据二值序列的值对上述量化后的原始信号的低频分量进行视觉阈值范围内允许的修改,从而实现水印的嵌入. 水印提取过程是对含有水印的图像进行小波变换,对低频分量同样进行量化处理,为了增大算法的安全性,可以对水印形成的二值0 ,1 序列在嵌入前进一步进行伪随机序列调制,相应的在水印提取过程需要增加用伪随机序列解调的步骤. 这样,不知道伪随机序列的攻击者即使推测出水印的嵌入规律,也无法提取水印. 大大增加了水印系统的透明性和鲁棒性.
4 水印技术的局限
目前水印技术的局限,为了对版权保护中使用水印的成功可能性进行评估,看能否满足实际应用需求,就需要对水印技术有更多了解. 下面介绍数字水印方案普遍存在的一些局限:
1) 不知道能够隐藏多少位. 尽管非常需要知道指定大小载体信息上可以隐藏多少比特的水印信息,但这个问题还没有得到圆满解决. 事实上,对给定尺寸的图像或者给定时间的音频,可以可靠隐藏信息量的上界,目前还不清楚. 对图像水印,只能说目前使用的算法可以隐藏几百比特位的水印信息.
2) 还没有真正健壮的盲图像水印算法. 对图像水印,鲁棒性还是个问题. 目前还没有能够在经过所有普通图像处理变换后,仍能幸免的盲水印算法. 尤其是能够抵抗几何处理的攻击,被认为是很难实现的目标.
3) 所有者能去除标记. 迄今为止提出的所有盲图像水印,实际上都是可逆的. 已知水印的准确内容、以及水印的嵌入和检测算法,则总能在没有严重损坏资料的前提下,使水印不可读取. 目前还不清楚这个缺点在将来还是否存在;同时在设计版权保护系统时,必须考虑如下问题:一旦水印内容已知,则有可能去除水印或者部分水印.
此外,迄今为止提出的水印算法,其可逆性使人们提出极大的疑问,即设计能够抗篡改的健壮公开水印技术是否可能? 事实上,如果允许任何人读取水印,则任何人只要知道水印嵌入算法,就可以消除水印.
5 结 论
随着电子商务的加速发展和网络用户的直线增长,媒体的安全要求将更加迫切,作为版权保护和安全认证的数字水印技术具有极大的商业潜力,作为一门学科交叉的新兴的应用技术,它的研究涉及了不同学科研究领域的思想和理论,如数字信号处理、图像处理、信息论、通信理论、密码学、计算机科学及网络、算法设计等技术,以及公共策略和法律等问题,是近几年来国际学术界才兴起的一个前沿研究领域,得到了迅速的发展. 但数字水印技术仍然是一个未成熟的研究领域,还有很多问题需要解决,其理论基础依然薄弱. 随着一些先进的信号处理技术和密码设计思想的引进,必将日趋成熟且得到更为广泛的发展应用.
参考文献:
[1 ] Eepa Kunr. Dimitrios hatzinakos. Digital watermarking fortelltale tamper proofing and authentication [J ] . Proceeding of the IEEE. 1999 , 87(7) :1167~1180.
[2 ] 张春田,苏育挺. 信息产品的版权保护技术———数字水印[J ] . 电信科学,1998 ,14(12) :15~17.
[3 ] Bender W, Gruhl D. Techniques for data hiding[J ] . IBM sys2tem journal ,1996 ,35(3~4) :313~336.
[4 ] Cox I J , Killian J ,Leighton F T. Secure spread spectrum wa2termarking for multimedia[J ] . IEEE transactions on image pro2cessing ,1997 ,6(12) :1673~1687.
[5 ] Zhao J , Koch E. Embedding robust labels into images forright protection[A] . In : Proceedings of the knowright’95conference on intellectual property rights and new technologies[C] . Vienna , Austria , 1995. 241~251.
[6 ] Podilchud C I , Zeng W. Image - adaptive watermarking usingvisual model [J ] . IEEE journal on special areas in communica2tions ,1998 ,16(4) :525~539.
㈢ 3d里catmull rom什么意思
抗锯齿中的瑞丽模式
㈣ R600内部的这5个ALU与传统GPU的ALU有所不同,它们是各自独立能够处理任意组合的1D/2D
小号,自己去看了下资料,懂了,大家可以参考下:目录:
第一章:第二代及以后的GPU工作流程简介
第二章:DirectX8和DirectX9 GPU的传统流水线
第三章:顶点和像素操作指令
第四章:传统GPU指令的执行
第五章:统一渲染架构
第六章:G80和R600的统一渲染架构实现
第七章:G80与R600效能对比
第八章:尴尬的中端--Geforce8600简析
前面4章 我将先简要介绍下DirectX8/9显卡的核心----图形处理单元GPU的工作流程和指令处理情况
从第5章开始讨论统一渲染架构、新一代DirectX10 GPU的特性,G80/Geforce8800与R600/RadeonHD2900XT的架构具体实现及其区别。最后将会对中端最受关注的Geforce8600进行相应的简单分析。
第一章:第二代及以后的GPU工作流程简介
简单(而不一定绝对科学)的说:GPU主要完成对3D图形的处理--图形的生成渲染。
GPU的图形(处理)流水线完成如下的工作:(并不一定是按照如下顺序)
顶点处理:这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系,建立起3D图形的骨架。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Vertex Shader(定点着色器)完成。
光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。
纹理帖图:顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping)工作完成对多变形表面的帖图,通俗的说,就是将多边形的表面贴上相应的图片,从而生成“真实”的图形。TMU(Texture mapping unit)即是用来完成此项工作。
像素处理:这阶段(在对每个像素进行光栅化处理期间)GPU完成对像素的计算和处理,从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader(像素着色器)完成。
最终输出:由ROP(光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区。
总结:GPU的工作通俗的来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出。
第二章:DirectX8和DirectX9 GPU的传统流水线
前面的工作流程其实已经说明了问题。本章来总结一下,承前启后。
传统的GPU功能部件我们不妨将其分为顶点单元和像素流水线两部分。
顶点单元由数个硬件实现的Vertex Shader组成。
传统的像素流水线由几组PSU(Pixel Shader Unit)+TMU+ROP组成。
于是,传统的GPU由顶点单元生成多边形,并由像素流水线负责像素渲染和输出。
对于像素流水线需要做的说明是:虽然传统的流水线被认为=1PSU+1TMU+1ROP,但这个比例不是恒定的,例如在RadeonX1000(不包括X1800)系列中被广为称道的3:1黄金架构,PSU:TMU:ROP的数量为3:1:1。一块典型的X1900显卡具有48个PSU,16个TMU和16个ROP。之所以采用这种设计方法,主要考虑到在当今的游戏中,像素指令数要远远大于纹理指令的数量。ATI凭借这个优秀的架构,成功击败了Geforce7,在DX9后期取得了3D效能上的领先。
总结:传统的GPU由顶点单元生成多边形,像素流水线渲染像素并输出,一条像素流水线包含PSU,TMU,和ROP(有的资料中不包含ROP),比例通常为1:1:1,但不固定。
第三章:顶点和像素操作指令
GPU通过执行相应的指令来完成对顶点和像素的操作。
熟悉OpenGL或Direct3D编程的人应该知道,像素通常使用RGB三原色和alpha值共4个通道(属性)来描述。而对于顶点,也通常使用XYZ和W 4个通道(属性)来描述。因而,通常执行一条顶点和像素指令需要完成4次计算,我们这里成这种指令为4D矢量指令(4维)。当然,并不是所有的指令都是4D指令,在实际处理中,还会出现大量的1D标量指令以及2D,3D指令。
总结:由于定点和像素通常用4元组表示属性,因而顶点和像素操作通常是4D矢量操作,但也存在标量操作。
第四章:传统GPU指令的执行
传统的GPU基于SIMD的架构。SIMD即Single Instruction Multiple Data,单指令多数据。
其实这很好理解,传统的VS和PS中的ALU(算术逻辑单元,通常每个VS或PS中都会有一个ALU,但这不是一定的,例如G70和R5XX有两个)都能够在一个周期内(即同时)完成对矢量4个通道的运算。比如执行一条4D指令,PS或VS中的ALU对指令对应定点和像素的4个属性数据都进行了相应的计算。这便是SIMD的由来。这种ALU我们暂且称它为4D ALU。
需要注意的是,4D SIMD架构虽然很适合处理4D指令,但遇到1D指令的时候效率便会降为原来的1/4。此时ALU 3/4的资源都被闲置。为了提高PS VS执行1D 2D 3D指令时的资源利用率,DirectX9时代的GPU通常采用1D+3D或2D+2D ALU。这便是Co-issue技术。这种ALU对4D指令的计算时仍然效能与传统的ALU相同,但当遇到1D 2D 3D指令时效率则会高不少,例如如下指令:
ADD R0.xyz , R0,R1 //此指令是将R0,R1矢量的x,y,z值相加 结果赋值给R0
ADD R3.x , R2,R3 //此指令是将R2 R3矢量的w值相加 结果赋值给R3
对于传统的4D ALU,显然需要两个周期才能完成,第一个周期ALU利用率75% ,第二个周期利用率25%。而对于1D+3D的ALU,这两条指令可以融合为一条4D指令,因而只需要一个周期便可以完成,ALU利用率100%。
但当然,即使采用co-issue,ALU利用率也不可能总达到100%,这涉及到指令并行的相关性等问题,而且,更直观的,上述两条指令显然不能被2D+2D ALU一周期完成,而且同样,两条2D指令也不能被1D+3D ALU一周期完成。传统GPU在对非4D指令的处理显然不是很灵活。
总结:传统的GPU中定点和像素处理分别由VS和PS来完成,每个VS PS单元中通常有一个4D ALU,可以在一个周期完成4D矢量操作,但这种ALU对1D 2D 3D操作效率低下,为了弥补,DX9显卡中ALU常被设置为1D+3D 2D+2D等形式。
第五章:统一渲染架构
相对于DirectX 9来说,最新的DirectX 10最大的改进在于提出了统一渲染架构,即Unified Shader。
传统的显卡GPU一直采用分离式架构,顶点处理和像素处理分别由Vertex Shader和Pixel Shader来完成,于是,当GPU核心设计完成时,PS和VS的数量便确定下来了。但是不同的游戏对于两者处理量需求是不同的,这种固定比例的PS VS设计显然不够灵活,为了解决这个问题,DirectX10规范中提出了了统一渲染架构。
不论是顶点数据还是像素数据,他们在计算上都有很多共同点,例如通常情况下,他们都是4D矢量,而且在ALU中的计算都是没有分别的浮点运算。这些为统一渲染的实现提供了可能。
在统一渲染架构中,PS单元和VS单元都被通用的US单元所取代,nVidia的实现中称其为streaming processer,即流处理器,这种US单元既可以处理顶点数据,又可以处理像素数据,因而GPU可以根据实际处理需求进行灵活的分配,这样便有效避免了传统分离式架构中VS和PS工作量不均的情况。
总结:统一渲染架构使用US(通常为SP)单元取代了传统的固定数目的VS和PS单元,US既可以完成顶点操作,又可以完成像素操作,因而可以根据游戏需要灵活分配,从而提高了资源利用率。
第六章:G80和R600的统一渲染架构实现
以下我们着重讨论G80和R600的统一着色单元而不考虑纹理单元,ROP等因素。
G80 GPU中安排了16组共128个统一标量着色器,被叫做stream processors,后面我们将其简称为SP。每个SP都包含有一个全功能的1D ALU。该ALU可以在一周期内完成乘加操作(MADD)。
也许有人已经注意到了,在前面传统GPU中VS和PS的ALU都是4D的,但在这里,每个SP中的ALU都是1D标量ALU。没错,这就是很多资料中提及的MIMD(多指令多数据)架构,G80走的是彻底的标量化路线,将ALU拆分为了最基本的1D 标量ALU,并实现了128个1D标量SP,于是,传统GPU中一个周期完成的4D矢量操作,在这种标量SP中需4个周期才能完成,或者说,1个4D操作需要4个SP并行处理完成。
这种实现的最大好处是灵活,不论是1D,2D,3D,4D指令,G80得便宜其全部将其拆成1D指令来处理。指令其实与矢量运算拆分一样。
例如一个4D矢量指令 ADD R0.xyzw , R0,R1 R0与R1矢量相加,结果赋R0
G80的编译器会将其拆分为4个1D标量运算指令并将其分派给4个SP:
ADD R0.x , R0,R1
ADD R0.y , R0,R1
ADD R0.z , R0,R1
ADD R0.w, R0,R1
综上:G80的架构可以用128X1D来描述。
R600的实现方式则与G80有很大的不同,它仍然采用SIMD架构。
在R600的核心里,共设计了4组共64个流处理器,但每个处理器中拥有1个5D ALU,其实更加准确地说,应该是5个1D ALU。因为每个流处理器中的ALU可以任意以1+1+1+1+1或1+4或2+3等方式搭配(以往的GPU往往只能是1D+3D或2D+2D)。ATI将这些ALU称作streaming processing unit,因而,ATI宣称R600拥有320个SPU。
我们考虑R600的每个流处理器,它每个周期只能执行一条指令,但是流处理器中却拥有5个1D ALU。ATI为了提高ALU利用率,采用了VLIW体系(Very Large Instruction Word)设计。将多个短指令合并成为一组长的指令交给流处理器去执行。例如,R600可以5条1D指令合并为一组5DVLIW指令。
对于下述指令:
ADD R0.xyz , R0,R1 //3D
ADD R4.x , R4,R5 //1D
ADD R2.x , R2,R3 //1D
R600也可以将其集成为一条VL
㈤ 3ds max和虚拟现实技术
摘要:3D Studio MAX 是Autodesk公司的子公司Kinetix推出的一种优秀的三维动画造型软件,它广泛用于游戏、广告、建筑等领域,是目前PC上最流行的三维动画造型软件。虚拟现实技术是计算机技术发展到一定阶段的产物,它使计算机适应人而不是人适应计算机,它的发展应用日益广泛、普及。本文拟就3DS MAX 在虚拟现实系统构建过程中的应用做一介绍。
1.虚拟现实简介
虚拟现实(VR)是一种由计算机和电子技术创造的新世界,是一个看似真实的模拟环境,通过多种传感设备用户可根据自身的感觉,使用人的自然技能对虚拟世界的物体进行考察或操作,参与其中的事件;同时提供视觉、听觉、触觉等多通道的信息,用户通过视、听、摸等直观而又自然的实时感知,并使参与者沉浸于模拟环境中。VR的三个最突出的特征,即它的3“I”特性:交互性(interactivity)、沉浸感(Illusion of Immersion)、想象( imagination)。
虚拟现实技术是在众多相关技术如计算机图形学、仿真技术、多媒体技术、传感器技术、人工智能的基础上发展起来的。虚拟现实技术在最近十年里获得了极大的发展,这主要归因于计算机软、硬件条件的飞速发展,以及虚拟现实专用设备价格的下降和性能的提高。目前虚拟现实技术已经获得了广泛的应用,而且日益普及,不仅在诸如NASA的大型工程得到应用,也出现在一些游戏中,在一些高档的PC机上甚至可以构建自己的个人PCVRS(个人虚拟现实系统)。
设计一个虚拟现实系统除了硬件条件一般个人无法定制外,能够充分发挥个人能动性的就只能是在系统软的方面下功夫了。设计一个VR系统,首要的问题是创造一个虚拟环境,这个虚拟环境包括三维模型、三维声音等,在这些要素中,因为在人的感觉中,视觉摄取的信息量最大,反应亦最为灵敏,所以创造一个逼真而又合理的模型,并且能够实时动态地显示是最重要的。虚拟现实系统构建的很大一部分工作也是建造逼真合适的三维模型。
2.3D Studio MAX 简介
3D Studio MAX是Kinetix公司推出的一套强大的三维建模软件,由于它是基于Win NT 或Win98平台的,方便易学,又因其相对低廉的价格优势,所以成为目前个人PC上最为流行的三维建模软件。其3.0版本的推出,更是巩固了它在个人PC平台上的地位。它的3.0版本相较以前的版本有了明显的改进,具体表现在以下几个方面:
⑴ 工作流模式使得工作组的协调更容易,效率更高。3D Studio MAX R3引入了工作流模式,在具体的实现上从外部参考体系(XRef)、示意视图(Schematic View)的引入以及现在3D MAX 可以使用其他程序从外部加以控制,而不必激活它的工作界面。
⑵ 易用性的改进。操作界面的改进是Release 3.0版本的最显着的变化,除了外观的变化之外,R3.0版本还增加了诸如用户自定义界面、宏记录、插件代码、变换Gizmo、轨迹条等功能。
⑶ 渲染的改进。Autodesk公司在收购了以渲染和视频技术闻名的Discreet Logic公司,吸收了该公司的先进技术,3D MAX R3 对其渲染器几乎做了重新设计,不仅增加了渲染的速度,而且提高了画面渲染的质量。
⑷ 建模技术的增强。建模技术的增强是3D Studio MAX最重要、最突出的改进,这也是在虚拟现实系统构建中应用它的一个有力的原因。主要的改进包括:
① 细分曲面技术(Subdivision Surface) 。3DS MAX 包含了细分曲面技术,细分曲面技术是1998年以来业界最流行的建模技术,大有赶超NURBS技术之势,它可以使模型建立更容易,而且效果更好。
② 柔性选择。此项技术可以“部分地”选择顶点,从而在变换顶点时获得光滑、柔和的效果,这对建立复杂物体的模型时非常有用。
③ 曲面工具和改进的NURBS技术。使用曲面工具可以产生很复杂的“面片”模型,这亦是一种重要的建模方法,Release 3.0版本中的NURBS技术不但速度加快,而且增加了一系列方便、易用的功能。
⑸ 对游戏的更好支持。3D Studio MAX R3大大增强了对游戏的支持,而且这些特性也可以用于其他场合。
① 增加了角色动画功能。Release 3.0版本内置了制作角色动画的功能,可以方便制作人物或动物的动作、柔软物体的效果以及变形效果。
② 顶点信息以及加强的贴图坐标功能。现在可以对顶点着色,并增加了顶点的通道,增强了UVW Unwarp的功能,并增加了World XYZ贴图坐标。
此外,3D Studio MAX R3也显着增强了动画功能。
3. 3DS MAX 在VR系统构建过程中的应用
如前所述,VR系统要求实时动态逼真地模拟环境,考虑到硬件的限制和虚拟现实系统的实时性的要求,VR系统的建模与以造型为主的动画建模方法有着显着的不同,VR的建模大都采用模型分割、纹理映射等技术。目前VR中的虚拟场景的构造主要有以下途径:基于模型的方法和IBR(基于图像的绘制)方法两种。这两种方法都可以在3DS MAX中加以实现和验证,下面具体展开加以说明。
3. 1 基于模型的构造方法。3DS MAX的几何建模方法主要有多边形(Polygon)建模、非均匀有理B样条曲线建模(NURBS)、细分曲面技术建模(Subdivision Surface)。通常建立一个模型可以分别通过几种方法得到,但有优劣、繁简之分。
⑴ 多边形建模。多边形建模技术是最早采用的一种建模技术,它的思想很简单,就是用小平面来模拟曲面,从而制作出各种形状的三维物体,小平面可以是三角形、矩形或其他多边形但实际中多是三角形或矩形。使用多边形建模可以通过直接创建基本的几何体,再根据要求采用修改器调整物体形状或通过使用放样、曲面片造型、组合物体来制作虚拟现实作品。多边形建模的主要优点是简单、方便和快速但它难于生成光滑的曲面,故而多边形建模技术适合于构造具有规则形状的物体,如大部分的人造物体,同时可根据虚拟现实系统的要求,仅仅通过调整所建立模型的参数就可以获得不同分辨率的模型,以适应虚拟场景实时显示的需要。
⑵ NURBS建模。NURBS是Non-Uniform Rational B-Splines(非均匀有理B样条曲线)的缩写,它纯粹是计算机图形学的一个数学概念。NURBS建模技术是最近4年来三维动画最主要的建模方法之一,特别适合于创建光滑的、复杂的模型,而且在应用的广泛性和模型的细节逼真性方面具有其他技术无可比拟的优势。但由于NURBS建模必须使用曲面片作为其基本的建模单元,所以它也有以下局限性:NURBS曲面只有有限的几种拓扑结构,导致它很难制作拓扑结构很复杂的物体(例如带空洞的物体);NURBS曲面片的基本结构是网格状的,若模型比较复杂,会导致控制点急剧增加而难于控制;构造复杂模型时经常需要裁剪曲面,但大量裁剪容易导致计算错误;NURBS技术很难构造“带有分枝的”物体
⑶ 细分曲面技术。细分曲面技术是1998年才引入的三维建模方法,它解决了NURBS技术在建立曲面时面临的困难,它使用任意多面体作为控制网格,然后自动根据控制网格来生成平滑的曲面。细分曲面技术的网格可以是任意形状,因而可以很容易地构造出各种拓扑结构,并始终保持整个曲面的光滑性。细分曲面技术的另一个重要特点是“细分”,就是只在物体的局部增加细节,而不必增加整个物体的复杂程度,同时还能维持增加了细节的物体的光滑性。但由于细分曲面技术是一种刚出现不久的技术,3D Studio MAX R3对它的支持还显得稚嫩,还不能完成一些十分复杂的模型创作。
有了以上3DS MAX几种建模方法的认识,就可以在为虚拟现实系统制作相应模型前,根据虚拟现实系统的要求选取合适的建模途径,多快好省地完成虚拟现实的作品的制作。
在虚拟现实作品制作的时候应当遵循一个原则:在能够保证视觉效果的前提下,尽量采用比较简单的模型,而且若能够用参数化方法构建的对象尽量用参数化方法构建,同时,在模型创作过程中,对模型进行分割,分别建模,以利于在虚拟现实系统中进行操作和考察。
对于复杂对象的运动或原理演示,我们可以预先将对象的运动和说明做成动画存为avi文件,然后等待VR系统合适的触发事件,播放该avi文件即可。
3.2 基于图像的绘制 (IBR),传统图形绘制技术均是面向景物几何而设计的,因而绘制过程涉及到复杂的建模、消隐和光亮度计算。尽管通过可见性预计算技术及场景几何简化技术可大大减少需处理景物的面片数目,但对高度复杂的场景,现有的计算机硬件仍无法实时绘制简化后的场景几何。因而我们面临的一个重要问题是如何在具有普通计算能力的计算机上实现真实感图形的实时绘制。IBR技术就是为实现这一目标而设计的一种全新的图形绘制方式。该技术基于一些预先生成的图像(或环境映照)来生成不同视点的场景画面,与传统绘制技术相比,它有着鲜明的特点:
⑴ 图形绘制独立于场景复杂性,仅与所要生成画面的分辨率有关。
⑵ 预先存储的图像(或环境映照)既可以是计算机合成的,亦可以是实际拍摄的画面,而且两者可以混合使用。
⑶ 该绘制技术对计算资源的要求不高,因而可以在普通工作站和个人计算机上实现复杂场景的实时显示。
由于每一帧场景画面都只描述了给定视点沿某一特定视线方向观察场景的结果,并不是从图像中恢复几何或光学景象模型,为了摆脱单帧画面视域的局限性,我们可在一给定视点处拍摄或通过计算得到其沿所有方向的图像,并将它们拼接成一张全景图像。为使用户能在场景中漫游,我们需要建立场景在不同位置处的全景图,继而通过视图插值或变形来获得临近视点的对应的视图。IBR技术是新兴的研究领域,它将改变人们对计算机图形学的传统认识,从而使计算机图形学获得更加广泛的应用。
3DS MAX在IBR中的应用是自然的,3DS MAX的出色的纹理贴图,强大的贴图控制能力,各种空间扭曲和变形,都提供了对图像和环境映照的容易的处理途径。例如,在各种IBR的应用中,全景图的生成是经常需要解决的问题,这方面,利用3DS MAX可以根据所需的全景图类型先生成对应的基板,比如,柱面全景图就先生成一个圆柱,然后控制各个方向的条状图像沿着圆柱面进行贴图即可。而且可以将图像拼接的过程编制成Script文件做成插件嵌入3DS MAX环境中,可以容易地生成全景图并且预先观察在虚拟现实系统中漫游的效果,这通过在Video Post设置摄像机的运动轨迹即可。事实上,目前已经有一些全景图生成和校正的插件。
在用3DS MAX为VR系统创作好模型后,结合VR系统的要求,看是否需要采用诸如LOD(Level of Detail)模型,如果需要可利用MAX 自带的LOD插件直接生成对象的LOD模型,最后根据VR系统的编辑环境将模型输出为编辑环境所能接收的文件类型,如VRML97或DXF 等格式的文件。
以上主要介绍了3DS MAX制作VR作品,下面再简单介绍一些3DS MAX 的另外的应用。
在VR系统中经常需要有视差和景深的立体视图,这可以通过在3DS MAX中设置双摄像机来模拟人的双眼来渲染立体视图对,这个需要调整双摄像机的相对位置,然后分别渲染不同的摄像机视图即可得到立体视图对,具体实现过程可参见文献〖2〗。
3DS MAX 是用C++语言和Open GL编写的应用软件,而且它提供的MAX SDK也是采用C++编写的代码,我们可以很容易地用C++和Open GL结合MAX SDK实现我们的图形学算法,再把我们的算法作为插件嵌入3DS MAX环境中,而不用考虑物体模型的生成和处理的复杂代码,利用3DS MAX的渲染计时器可以方便地检验我们所编算法的效率和效果。
参考文献
1. 曾芬芳主编.虚拟现实技术.上海交通大学出版社, 1997年第一版.
2. 黄心渊编着.虚拟现实技术与应用.科学出版社,1999年第一版.
3. Heung-Yeung Shum and Li-Wee He . Rendering with Concentric Mosaics.SIGGRAPH’99.
4. 张昀、徐自亮. 3D Studio MAX R3(上册).清华大学出版社,1999年第一版.
4. 3D Studio MAX R3 技术文档. Kinetix Company.
5. 鲍虎军,彭群生.浙江大学CAD&CG国家重点实验室.基于图像的图形绘制技术. 1998 第36期 技术专题版专题报道.
㈥ OPENGL是什么
OpenGL三维图形标准是由AT&T公司UNIX软件实验室、IBM
、DEC、SUN、HP、Microsoft和SGI等多家公司在GL图形库标准的基础
上联合推出的开放式图形库,它使在微机上实现三维真实
感图形的生成与显示成为可能。由于OpenGL是开放的图形标
准,用户原先在UNIX下开发的OpenGL图形软件很容易移植到微
机上的WindowsNT/95上。笔者在VisualC++4.1(以下简称VC)集
成环境下,开发了基于OpenGL的三维真实感图形应用程序,现
介绍如下。
微机上的OpenGL开发环境
基于OpenGL标准开发的应用程序必须运行于32位Windows
平台下,如WindowsNT或Windows95环境;而且运行时还需有动态
链接库OpenGL32.DLL、Glu32.DLL,这两个文件在安装WindowsNT时已
自动装载到C:\WINNT\SYSTEM32目录下(这里假定用户将WindowsNT
安装在C盘上);而对于使用Windows95平台的用户,则需手工将
两个动态库复制到Windows95目录的SYSTEM子目录中。安装了
WindowsNT/95和VC4.1后,用户就具备了基于OpenGL开发三维图
形软件的基本条件。
OpenGL程序设计的基本步骤
1.OpenGL在WindowsNT下的运行机制
OpenGL工作在客户机/服务器模式下,当客户方(即基
于OpenGL标准开发的应用程序)向服务器(OpenGL核心机制)发出
命令时,由服务器负责解释这些命令。通常情况下,客户方
和服务器是运行在同一台微机上的。由于OpenGL的运行机制
是客户机/服务器模式,这使得用户能够十分方便地在网
络环境下使用OpenGL,OpenGL在WindowsNT上的这种实现方式通常
称为网络透明性。
OpenGL的图形库函数封装在动态链接库OpenGL32.DLL中,
客户机中的所有OpenGL函数调用,都被传送到服务器上,由
WinSrv.DLL实现功能,再将经过处理的指令发送到Win32设备驱
动接口(DDI),从而实现在计算机屏幕上产生图像。
若使用OpenGL图形加速卡,则上述机制中将添加两个
驱动器:OpenGL可装载客户模块(OpenGLICD)将安装在客户端;硬
件指定DDI将安装在服务器端,与WinDDI同一级别。
2.OpenGL的库函数
开发基于OpenGL的应用程序,必须先了解OpenGL的库函
数。OpenGL函数命令方式十分有规律,每个库函数均有前缀gl
、glu、aux,分别表示该函数属于OpenGL基本库、实用库或辅助
库。WindowsNT下的OpenGL包含了100多个核心函数,均以gl作为前
缀,同时还支持另外四类函数:
OpenGL实用库函数:43个,以glu作为前缀;
OpenGL辅助库函数:31个,以aux作为前缀;
Windows专用库函数(WGL):6个,以wgl作为前缀;
Win32API函数(WGL):5个,无前缀。
OpenGL的115个核心函数提供了最基本的功能,可以实
现三维建模、建立光照模型、反走样、纹理映射等;OpenGL实
用库函数在核心函数的上一层,这类函数提供了简单的调
用方法,其实质是调用核心函数,目的是减轻开发者的编程
工作量;OpenGL辅助库函数是一些特殊的函数,可以供初学者
熟悉OpenGL的编程机制,然而使用辅助库函数的应用程序只
能在Win32环境中使用,可移植性较差,所以开发者应尽量避
免使用辅助库函数;Windows专用库函数(WGL)主要针对WindowsNT
/95环境的OpenGL函数调用;Win32API函数用于处理像素存储格
式、双缓存等函数调用。
3.VC环境下基于OpenGL的编程步骤
下面介绍在VC环境中建立基于Opeetting菜单选项,在Link栏的Lib输入域中
添加openg132.lib、glu32.lib,若需使用OpenGL的辅助库函数,则还
需添加glaux.lib。
(3)选择View/ClassWizard菜单选项,打开MFC对话框,在
ClassName栏中选择CMyTestView类,进行以下操作:
选择WM_CREATE消息,鼠标单击EditCode,将OpenGL初始化代码
添加到OnCreate()函数中:
/*定义像素存储格式*/
PIXELFORMATDESCRIPTORpfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,0,0,0,0,0,0
32,
0,0,
PFD_MAIN_PLANE,
0,
0,0,0,
}
CCLientdc(this);
intpixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd);
BOOLsuccess=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);
m_hRC=wglCreateContext(dc.m_hDC);
选择WM_DESTORY消息,在OnDestory()中添加以下代码:
wglDeleteContext(m_hRC);
在MyTestView.cpp中,将以下代码添加到PreCreateWindows()函数中:
cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
OpenGL只对WS_CLIPCHILDREN|WS_CLIPSIBLINGS类型窗口有效;
在MyTestView.cpp中,将以下代码添加到OnDraw()函数中:
wglMakeCurrent(pDC->m_hDC,m_hRC);
DrawScene();//用户自定义函数,用于绘制三维场景;
wglMakeCurrent(pDC->m_hDC,NULL);
在MyTestView.cpp中,添加成员函数DrawScene():
voidCMyTestView::DrawScene()
{/*绘制三维场景*/}
(4)在MyTestView.h中包含以下头文件并添加类成员说明:
#include
#include
#include
在CTestView类中的protected:段中添加成员变量声明:
HGLRCm_hRC;
同时添加成员函数声明:
DrawScene();
这样,一个基于OpenGL标准的程序框架已经构造好,用
户只需在DrawScene()函数中添加程序代码即可。
建立三维实体模型
三维实体建模是整个图形学的基础,要生成高逼真
度的图像,首先要生成高质量的三维实体模型。
OpenGL中提供了十几个生成三维实体模型的辅助库函
数,这些函数均以aux作为函数名的前缀。简单的模型,如球
体、立方体、圆柱等可以使用这些辅助函数来实现,如
auxWireSphere(GLdoubleradius)(绘制一半径为radius的网状球体)。
但是这些函数难以满足建立复杂三维实体的需要,所以用
户可以通过其它建模工具(如3DS等)来辅助建立三维实体模
型数据库。笔者在三维实体的建模过程中采用3DS提供的2D
Shape、3DLofter和3DEditor进行模型的编辑,最后通过将模型数
据以DXF文件格式输出存储供应用程序使用。
真实感图形的绘制
1.定义光照模型和材质
(1)光源。OpenGL提供了一系列建立光照模型的库函
数,使用户可以十分方便地在三维场景中建立所需的光照
模型。OpenGL中的光照模型由环境光(AmbientLight)、漫射光
(DiffuseLight)、镜面反射光(SpecularLight)等组成,同时还可设
置光线衰减因子来模拟真实的光源效果。
例如,定义一个黄色光源如下:
GlfloatLight_position[]={1.0,1.0,1.0,0.0,};
GlfloatLight_diffuse[]={1.0,1.0,0.0,1.0,};
glLightfv(GL_LIGHT0,GL_POSTTION,light_position);//定义光源位置
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//定义光源漫射光
光源必须经过启动后才会影响三维场景中的实体,可以通过以下指令使光源有效:<
glEnable(LIGHTING);//启动光照模型;
glEnable(GL_LIGHT0);//使光源GL_LIGHT0有效;
OpenGL中一共可以定义GL_LIGHT0~GL_LIGHT7八个光源。
(2)材质。OpenGL中的材质是指构成三维实体的材料在
光照模型中对于红、绿、蓝三原色的反射率。与光源的定义
类似,材质的定义分为环境、漫射、镜面反射成分,另外还
有镜面高光指数、辐射成分等。通过对三维实体的材质定义
可以大大提高应用程序所绘制的三维场景的逼真程度。例
如:
/*设置材质的反射成分*/
GLfloatmat_ambient[]={0.8,0.8,0.8,1.0};
GLfloatmat_diffuse[]={0.8,0.0,0.8,1.0};/*紫色*/
GLfloatmat_specular[]={1.0,0.0,1.0,1.0};/*镜面高光亮紫色*/
GLfloatmat_shiness[]={100.0};/*高光指数*/
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);/*定义环境光反射率*/
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);/*定义漫射光反射率*/
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);/*定义镜面光反射率*/
glMaterialfv(GL_FRONT,GL_SHINESS,mat_shiness);/*定义高光指数*/
(3)材质RGB值与光源RGB值的关系。OpenGL中材质的颜色
与光照模型中光源的颜色含义略有不同。对于光源,R、G、B
值表示三原色在光源中所占有的比率;而对于材质定义,R、
G、B的值表示具有这种材质属性的物体对于三原色的反射
比率,场景中物体所呈现的颜色与光照模型、材质定义都相
关。例如,若定义的光源颜色是(Lr,Lg,Lb)=(1.0,1.0,1.0)(白光),
物体的材质颜色定义为(Mr,Mg,Mb)=(0.0,0.0,0.8),则最终到达人
眼的物体颜色应当是(Lr*Mr,Lg*Mg,Lb*Mb)=(0.0,0.0,0.8)(蓝色)。
2.读取三维模型数据
为了绘制三维实体,我们首先必须将预先生成的三
维实体模型从三维实体模型库中读出。下图描述了读取三
维实体模型的流程。
3.三维实体绘制
由于3DS的DXF文件中对于三维实体的描述是采用三角
形面片逼近的方法,而在OpenGL函数库中,提供了绘制三角形
面片的方法,所以为三维实体的绘制提供了方便。以下提供
了绘制三角形面片的方法:
glBegin(TRANGLES);//定义三角形绘制开始
glVertexf((GLfloat)x1,(GLfloat)y1,(GLfloat)z1);//第一个顶点
glVertexf((GLfloat)x2,(GLfloat)y2,(GLfloat)z2);//第二个顶点
glVertexf((GLfloat)x3,(GLfloat)y3,(GLfloat)z3);//第三个顶点
glEnd();//绘制结束
为了提高三维实时动画的显示速度,我们利用了
OpenGL库中的显示列表(DisplayList)的功能,将三维场景中的实
体分别定义为单独的显示列表,预先生成三维实体。在图形
显示时,只需调用所需的显示列表即可显示相应的三维实
体,而不需要重新计算实体在场景中的坐标,避免了大量的
浮点运算。在调用显示列表前所作的旋转、平移、光照、材
质的设定都将影响显示列表中的三维实体的显示效果。具
体实现算法如下:
for(ObjectNo=0;ObjectNo<实体个数;ObjectNo++)
{
glNewList(ObjectNo,GL_COMPILE);//创建第ObjectNo个实体的显示列表
for(Fac
OpenGL是近几年发展起来的一个性能卓越的三维图形标准,它是在SGI等多家
世界闻名的计算机公司的倡导下,以SGI的GL三维图形库为基础制定的一个通
用共享的开放式三维图形标准。目前,包括Microsoft、SGI、IBM、DEC、SUN、
HP等大公司都采用了OpenGL做为三维图形标准,许多软件厂商也纷纷以OpenGL
为基础开发出自己的产品,其中比较着名的产品包括动画制作软件Soft Image
和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软
件ProEngineer、GIS软ARC/INFO等等。值得一提的是,随着Microsoft公司在
Windows NT和最新的Windows 95中提供了OpenGL标准及OpenGL三维图形加速卡
(如北京黎明电子技术公司的AGC-3D系列三维图形加速卡)的推出,OpenGL将
在微机中有广泛地应用,同时也为广大用户提供了在微机上使用以前只能在高
性能图形工作站上运行的各种软件的机会。
OpenGL实际上是一个开放的三维图形软件包,它独立于窗口系统和操作系统,
以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以
与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算
法的正确性和可靠性;OpenGL使用简便,效率高。它具有七大功能:
1) 建模 OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提
供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面
(如Bezier、Nurbs等曲线或曲面)绘制函数。
2) 变换 OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、
旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透
视投影两种变换。其变换方法与机器人运动学中的坐标变换方法完全一
致,有利于减少算法的运行时间,提高三维图形的显示速度。
3) 颜色模式设置 OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。
4) 光照和材质设置 OpenGL光有辐射光(Emitted Light)、环境光
(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。
材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光
的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
5) 纹理映射(Texture Mapping) 利用OpenGL纹理映射功能可以十分逼真
地表达物体表面细节。
6) 位图显示和图象增强 图象功能除了基本的拷贝和像素读写外,还提供
融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。
以上三条可是被仿真物更具真实感,增强图形显示的效果。
7) 双缓存(Double Buffering)动画 双缓存即前台缓存和后台缓存,简而言
之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。
此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等
特殊效果。从而实现了消隐算法。
㈦ 请问纹理映射在3dsmax如何操作
3dmax是这样的使用过程
建立模型 模型被建立的时候是没有材质和贴图的 只是一个颜色
赋予材质 材质包括程序纹理和贴图 noise等属于程序纹理 是一些算法生成的二维或三维数据 贴图就是图片了。这些信息赋予模型后 可以改变模型的外观 通过不同的方法 实现不同的效果。
然后再打灯打摄像机渲染出图做后期等等。
㈧ 什么是GIS 的三维结构
此类GIS应用软件通常多建立在OpenGL平台之上,本系统也不例外。在实现其他特殊功能之前,必须首先正确配置、安装好OpenGL环境,然后才能进行各种实用功能的开发。下面将对OpenGL做一个简短的介绍,并开始OpenGL应用程序框架的搭建工作。
OpenGL概述
OpenGL是一种到图形硬件的软件接口。从本质上说,它是一个完全可移植并且速度很快的3D图形和建模库。通过使用OpenGL,可以创建视觉质量接近射线跟踪程序的精致漂亮的3D图形。但是它在执行速度上要比射线跟踪程序快好几个数量级。OpenGL使用的是由Silicon Graphcs(SGI)公司精心开发的优化算法,这家公司在计算机图形和动画领域是公认的业界领袖。开发者可以利用OpenGL提供的150多个图形函数轻松建立三维模型并进行三维实时交互。这些函数并不要求开发者将三维物体模型的数据写成固定的数据格式,这样一 来开发者就不仅可以直接使用自己的数据,而且还可以利用其他格式的数据源,能在很大程度上缩短软件的开发周期。
OpenGL不仅可对整个三维模型进行渲染并绘制出逼真的三维景象,而且还可以进行三维交互、动作模拟等处理。其提供的基本功能具体包含以下几方面的内容:
(1)模型绘制。在OpenGL中通过对点、线和多边形等基本形体的绘制可以构造出非常复杂的三维模型。OpenGL经常通过使用模型的多边形及其顶点来描述三维模型。
(2)模型观察。在建立了三维模型后,可以通过OpenGL的描述来观察此模型。此观察过程是通过一系列的坐标变换来实现的。这种变换使得观察者能够在视点位置得到与之相适应的三维模型场景。投影变换的类型对模型的观察有很大的影响,在不同投影变换下得到的三维模型场景也是不同的。在模型观察过程的最后还要对场景进行裁剪和缩放,以决定整个三维模型场景在屏幕上的显示。
(3)颜色模式的指定。在OpenGL中可以指定模型的颜色模式(RGBA模式和颜色表模式)。除此之外,还可以通过选择模型的着色方式(平面着色和光滑着色)来对整个三维场景进行着色处理。
(4)光照效果。为使OpenGL绘制的三维模型更加逼真还必须增加光照效果。目前OpenGL仅提供了对辐射光、环境光、镜面光和漫反射光的管理方法,另外还可以指定模型表面的反射特性。
(5)图象效果增强。在增强三维场景图象效果方面,OpenGL也提供了一系列相关函数。这些函数通过反走样、混合和雾化等处理来增强图象效果。其中,反走样用于改善图象中线形图形的锯齿使其更平滑;混合用于处理模型的半透明效果;雾化使场景图象从视点到远处逐渐褪色,使其更接近现实情况。
(6)位图和图象处理。OpenGL提供有专门进行位图和图象处理的函数。
(7)纹理映射。真实物体的表面普遍存在纹理,如果建立的三维模型场景缺少此细节将显得不够真实,为更逼真地表现三维场景,OpenGL提供了纹理映射的功能。OpenGL提供的纹理映射函数可以很方便地把纹理图象贴到场景多边形上。
(8)双缓存技术。OpenGL提供的双缓存技术主要用于实时动画,为获得平滑的动画效果,需要先在内存中生成下一帧图象,然后再将其从内存拷贝到屏幕。
(9)人机交互。OpenGL提供了方便的三维图形人机交互接口,通过此接口用户可以选择修改三维景观中的物体。
OpenGL应用程序框架的建立
首先建立一个单文档应用程序,并将需要用到的头文件和导入库添加到工程,以便能够顺利通过编译。在VC++中,OpenGL的头文件一般是存放在系统头文件目录的子目录GL中,所以在指定包含的时候要指定一下相对路径:
#include <gl\gl.h> // OpenGL32库的头文件
#include <gl\glu.h> // GLu32库的头文件
#include <gl\glaux.h> // GLaux库的头文件
这里的gl.h是基本头文件,glu.h是应用头文件,大多数应用程序都需要同时包含这两个头文件,glaux.h是辅助头文件,只在需要使用的情况下包含。接下来调出"Project Settings"对话框并在"Link"选项页中添加glu32.lib、glaux.lib和OpenGL win32实现的标准导入库opengl32.lib到工程。
接下来初始化OpenGL,这也是本文最重要的部分。先大致讲一下基本步骤:首先获取需要在上面绘图的设备环境(DC)并为该设备环境设置像素格式,然后创建基于该设备环境的OpenGL设备。最后,初始化OpenGL绘制场景及状态设置。前三步的实现过程在SetOpenGLInterface()函数中实现:
PIXELFORMATDESCRIPTOR pfd = {
// 初始化象素存储格式
sizeof(PIXELFORMATDESCRIPTOR), // pfd的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 支持窗口
PFD_SUPPORT_OPENGL | // 支持OpenGL
PFD_DOUBLEBUFFER, // 支持双缓存
PFD_TYPE_RGBA, // RGBA类型
24, // 24位色深度
0, 0, 0, 0, 0, 0, // 各颜色位(忽略)
0, // 无alpha缓存
0, // 忽略转换位
0, // 无累计位
0, 0, 0, 0,
32, // 32位深度缓存
0, // 无模版缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主绘制层
0, // 保留
0, 0, 0 // 忽略的层掩模
};
m_pDC = GetDC(); // 得到设备环境句柄
int iFormat = ChoosePixelFormat(m_pDC->m_hDC, &pfd); // 设置象素格式
SetPixelFormat(m_pDC->m_hDC, iFormat, &pfd);
m_hGlrc = wglCreateContext(m_pDC->m_hDC); // 创建渲染上下文
wglMakeCurrent(m_pDC->m_hDC, m_hGlrc); // 设置一个线程的当前绘图描述表
这里首先对描述像素存储格式的PIXELFORMATDESCRIPTOR结构变量进行了填充,在得到设备环境句柄后调用ChoosePixelFormat()和SetPixelFormat()函数以返回并设置最佳匹配的像素格式。最后调用wglCreateContext()创建一个渲染上下文RC并将其作为参数通过wglMakeCurrent()来建立一个当前的绘图描述表,并在绘制完毕后(通常在WM_DESTORY消息发出后执行)将其释放:
ReleaseDC(m_pDC); // 释放DC
if (m_hGlrc != NULL) // 释放RC
wglDeleteContext(m_hGlrc);
经过上面的处理OpenGL就已经初始化完毕了,但为了达到逼真的视觉效果还有必要进一步设置一下场景,这在InitOpenGL()函数中完成。具体的工作包括对光源的各种定义:
GLfloat light_position[] = {0.0, 0.0, 1.0, 0.0}; // 定义光源的位置坐标
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
GLfloat light_ambient[] = {0.0, 0.0, 0.0, 1.0}; // 定义环境反射光
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0}; // 定义漫反射光
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0}; // 定义镜面反射光
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
GLfloat light_model_ambient[] = {0.4f, 0.4f, 0.4f, 1.0f}; // 定义光模型参数
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_model_ambient);
GLfloat local_view[] = {0.0};
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
以及各项相关功能的使能设置:
glEnable(GL_LIGHTING); // GL_LIGHTING有效
glEnable(GL_LIGHT0); // GL_LIGHT0有效
glEnable(GL_DEPTH_TEST); // 允许深度比较
glDepthFunc(GL_LESS); // 激活深度比较
glClearColor(0.1f, 0.1f, 0.5f, 0.0f); // 设置蓝色背景
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); // 权衡图像质量与绘制速度
通常,SetOpenGLInterface()和InitOpenGL()在WM_CREATE消息发出后即被执行,以确保在程序启动之初完成对OpenGL的环境设置。在视图初始化更新完毕后,还要进行最后的处理--进行视口的定义,下面给出的这段InitViewPort()函数实现代码将完成此功能:
CRect rect; // 得到绘图客户区的大小
GetClientRect(rect);
glMatrixMode(GL_PROJECTION); // 设置投影模式
glLoadIdentity(); // 装载单位矩阵
if (m_nViewMode == 0) // 建立一个透视投影矩阵
gluPerspective(90.0, rect.Width() / rect.Height(), 1.0, 10000.0);
if (m_nViewMode == 1) // 建立一个正射投影矩阵
glOrtho(-0.5 * 10000.0, 0.5 * 10000.0, -0.5 * 10000.0, 0.5 * 10000.0, 1.0, 10000.0); glViewport(0, 0, rect.Width(), rect.Height()); // 重定视口
glMatrixMode(GL_MODELVIEW); // 确定当前矩阵模式
glLoadIdentity(); // 装载单位矩阵
这里完成的主要工作有对投影模式的设置与对投影矩阵的建立以及对视口的重定等。其中,控制变量m_nViewMode的取值决定了投影模式(透视投影还是正射投影),并根据不同的投影模式调用函数gluPerspective()或glOrtho()建立相应的投影矩阵。函数gluPerspective()用于创建一个对称透视视景体,第一个参数定义了视野在X-Z平面的角度,取值范围为[0.0, 180.0];第二个参数是投影平面宽度与高度的比率;后两个参数分别为远近裁剪面沿Z负轴到视点的距离,总为正值。glOrtho()用于创建一个平行视景体(实际是创建一个正射投影矩阵,并以此矩阵乘以当前矩阵)。其近裁剪、远裁剪平面均为矩形,近裁剪矩形左下角点和右上角点的三维空间坐标分别为(left,bottom,-near)和(right,top,-near);远裁剪平面的相应空间坐标分别为(left,bottom,-far)和(right,top,-far)。这里所有的near、far值同时为正或同时为负。若未进行其他变换,正射投影的方向将平行于Z轴、视点朝向Z负轴。
视口确定之后就可以着手对场景的绘制了。这主要在ReDraw()中完成,并在OnSize()、OnDraw()等需要重绘的地方被调用。由于这部分不属于OpenGL框架搭建的内容,因此该函数的实现将在后续的文章中进行详细介绍,这里不再赘述
㈨ opengl和d3d选哪个更好
各有各的优势,做游戏现在D3D的较多,其他图形工业图形处理,虚拟现实用openGL的多点,还有用OSG的
OpenGL的发展历程:
OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽强大但其移植性不好,于是SGI公司在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL是“开放性图形程序接口”。
1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。
1995年OpenGL的1.1版本面市,该版本较1.0性能提高许多,并加入了一些新的功能。包括提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。
1997年,Windows 95下3D游戏的大量涌现,游戏开发公司迫切需要一个功能强大、兼容性好的3D图形接口,而当时微软公司自己的3D图形接口DirectX 3.0功能却是很糟糕。因而以制作《雷神之锤》等经典3D射击游戏而着名的id公司同其它一些游戏开发公司一同强烈要求微软在Windows 95中加入对OpenGL的支持。微软公司最终在Windows 95的OSR2版和后来的Windows 版本中加入了对OpenGL的支持。这样,不但许多支持OpenGL的电脑3D游戏得到广泛应用,而且许多在3D图形设计软件也可以运用支持OpenGL标准的3D加速卡,大大提高其3D图形的处理速度。
2003年的7月28日,SGI和ARB公布了OpenGL 1.5。OpenGL 1.5中包括OpenGL ARB的正式扩展规格绘制语言“OpenGL Shading Language”。OpenGL 1.5的新功包括:顶点Buffer Object、Shadow功能、隐蔽查询、非乘方纹理等。
2004年8月,OpenGL2.0版本发布~OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3Dlabs。opengl2.0支持OpenGL Shading Language、新的shader扩展特性以及其他多项增强特性。
OpenGL是做什么用的:
上世纪90年代,OpenGL可谓大名鼎鼎,那时微软的DirectX刚刚出现,功能远不能与OpenGL相比,OpenGL实际上是一种3D程序接口(即我们常说的3D API),这个接口由近二百五十个不同的函数调用组成,用来从简单的图元绘制复杂的三维景象。它是3D加速卡硬件和3D图形应用程序之间一座非常重要的沟通桥梁。也可以说,OpenGL是一个功能强大,调用方便的底层3D图形库。
OpenGL是个与.硬件无关的软件接口,可以在不同的平台如Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。
OpenGL特点及功能:
OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。它具有七大功能:
1.建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。
2.变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投 影两种变换。其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。
3.颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。
4.光照和材质设置:OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
5:纹理映射(Texture Mapping)。利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。
6:位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果。
7:双缓存动画(Double Buffering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。
此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等特殊效果。从而实现了消隐算法。
OpenGL现状:
近年来,依靠着微软的研发实力和Windows在操作系统市场的统治地位,DirectX在3D游戏API上占据了绝对的优势。而曾经红极一时的OpenGL则显得停滞不前。目前我们熟悉的OpenGL游戏可能只剩下了id出品的《Quake》和《Doom》系列可以勉强支撑。OpenGL的未来究竟如何?OpenGL仍然是唯一能够取代微软对3D图形技术的完全控制的API,目前,OpenGL也仍是唯一的跨平台3D解决方案,它仍然具有一定的生命力,游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用Open GL。因此,硬件开发商正在设法加强对它的支持。
目前,随着DirectX的不断发展和完善,OpenGL的优势逐渐丧失,未来的OpenGL发展前景迷茫。OpenGL与DirectX代表着绘图世界分裂的两大门派,这种情况有时会阻碍发展,有时却又有利于与发展。毕竟有竞争才会有发展。如同处理器市场我们不希望AMD倒掉,也不希望INTEL一家独大一样~我们都不希望在3D领域中仅仅剩下一个霸主。希望OpenGL一路走好。。。。。。
另:2007年8月8日,圣迭戈Siggraph BOF展会上 OpenGL Architecture Review Board(OpenGL架构评估委员会)正式宣布了OpenGL 3。以前被称之为OpenGL Longs Peak,OpenGL 3则是官方名称。OpenGL 3规范将在下一次8月底召开的OpenGL ARB会议上最后定案,由Khronos Group进行为期30天的评估后在9月底正式公开。最新的OpenGL Shading Language也伴随OpenGL 3公开展示。
d3d
要讲Direct3D不能不讲DirectX, DirectX是微软开发并发布的多媒体开发软件包,其中有一部分叫做DirectDraw是图形绘演API,提供对图形的强大的访问处理能力,而在DirectDraw中集成了一些三维图形相关的功能,叫做Direct3D。
D3D和OPENGL本质虽然一样,Direct3D (D3D)是微软为提高3D 游戏在Win 95/98中的显示性能而开发的显示程序,目前已经升级到9.0版本,而且支持XP等微软最新的操作系统,它提供了丰富的3D功能库,是游戏广泛采用的标准。
Direct 3D是基于微软的通用对象模式COM(Common Object Mode)的3D图形API。它是由微软(Microsoft)一手树立的3D API规范,微软公司拥有该库版权,它所有的语法定义包含在微软提供的程序开发组件的帮助文件、源代码中。Direct3D是微软公司DirectX SDK集成开发包中的重要部分,适合多媒体、娱乐、即时3D动画等广泛和实用的3D图形计算。自1996年发布以来,Direct3D以其良好的硬件兼容性和友好的编程方式很快得到了广泛的认可,现在几乎所有的具有3D图形加速的主流显示卡都对Direct3D提供良好的支持。但它也有缺陷,由于是以COM接口形式提供的,所以较为复杂,稳定性差,所以D3D是一个十分繁琐的工具,尽管Microsoft已经尽可能地简化了,但是为了实现一个效果,你还是不得不做许多的工作,其中就包括对各种复杂的结构的赋值;这些赋值很重要,它直接关系到程序的最终效果。另外,目前只在Windows平台上可用。