APP下载

一种三维模型制作3D立体图像的方法

2018-10-25李永成李孟宇

计算机时代 2018年9期
关键词:分色内存立体

李永成 李孟宇

摘 要: 为了解决三维模型转化为3D立体图像的问题,采用通过软件编程对图像进行滤色处理后再次合成的方法。该方法通过读取3DMax导出的3ds格式数据文件进行图像显示,对两个不同视角的图像抓屏,根据分色显示原理对抓取的图像进行滤色处理,合成符合分色3D立体要求的新图像,借助分色眼镜,可以观察到图像的3D立体效果。研究结果表明,用该方法无需借助第三方软件,使3D立体图像的制作更加灵活和快捷,并且图像具有较快的显示速度。

关键词: 分色法立体3D; 三维图像; 3ds格式; 图像处理

中图分类号:TP391.9 文献标志码:A 文章编号:1006-8228(2018)09-62-04

Abstract: In order to solve the problem of converting 3D model into a 3D stereoscopic image, this paper adopts a method of recomposing the image after performing color filter processing through software programming. This method displays images by reading 3DMax-derived 3ds format data files, captures two different views of the image, filters the captured images according to the separation display principle, and synthesizes new images which meet 3D stereoscopic requirements. With the help of color separation glasses, the 3D stereoscopic effect of the image can be observed. The result of the research shows that this method can make 3D stereoscopic images more flexible and faster without using third-party software, and the images have faster display speed.

Key words: color-separation stereoscopic 3D; 3D images; 3ds format; images processing

0 引言

无论是影视作品还是图像摄影作品,3D技术都得到广泛的应用,3D技术可以最大限度地还原实际现场,尤其是3D电影的出现,更是给人们的娱乐带来了一种全新的体验。3D显像的方法有很多,其中的分色法(色差式)制作的影像其3D效果虽然较差,需要佩戴分色眼镜,但因其制作方便,图像处理软件Photoshop[1-3]就可以方便地制作,而且眼镜的制作成本低廉,因此仍然得到较大的应用。

在一些软件开发中,如果依靠图像处理软件进行3D立体图像的制作,则往往因为缺少数据接口而难以实现,尤其是对于大量的图像需要处理的场合,依靠图像处理软件显然是不合适的,一种可行的方法是,设计自己的算法进行图像处理。对于3DMax制作的三维图形,屏幕上显示的实际是二维的图像,只是可以变换角度进行显示而已,并无3D立体效果,如何将三维图像转换成3D立体图像是本文研究的内容。

1 分色法3D成像原理[4]

3D成像技术主要有裸眼式和眼镜式。在眼镜式3D技术中,以色差式3D技术(Anaglyphic 3D)实现起来最简单,成像原理简单,使用的是滤色眼镜,这种技术利用了有色眼镜仅能通过相同颜色的光原理。

人们视觉上获得的立体感,来自于左眼和右眼所看到的物体角度的细微差异,因此,必须有两幅具有一定视差的图像分别传送到我们的两眼。

分色法就需要对图像的颜色进行处理。图像由像素组成,每一个像素的颜色由RGB值来表达。RGB值的R表示红色、G表示绿色、B表示蓝色,这三种颜色就是三原色,三原色中任何一种都不能用其余两种颜色合成。RGB值的取值范围为0~255,取值越低,其亮度就越低,因此红色的取值范围为(0~255,0,0)、青色(不含红色分量的颜色)的取值范围为(0,0~255,0~255),由于它们彼此不含有对方的颜色,对于红蓝3D而言,可以用仅有红色分量的一幅图(左眼视角,以下简称左图)和仅有绿色及蓝色分量的另一幅图(右眼视角,以下簡称右图)合成为一幅图,两幅图包含了一个画面的完整颜色信息。

俗称的红蓝眼镜实际就是红青眼镜。红色眼镜只能透过图像的红色,青色眼镜只能透过绿色和蓝色,视觉上产生的两幅图存在角度差,因此呈现给我们的是一幅立体图像,滤色原理和成像原理分别如图1和图2所示。

2 3D图像合成设计方案

设计目标是显示一幅三维图像的3D立体图像,使用红蓝眼镜观察3D立体图像。

开发平台:VC++ MFC及OpenGL函数库。

VC++是基于Windows的C++开发平台,其中的MFC类库封装了大部分的Windows API函数。OpenGL即开放性图形库(Open Graphic Library),是图形与硬件的接口,包含了图形变换、纹理映射及特殊效果处理等120多个函数,它允许开发者直接使用自己的模型数据,极大地节省了开发者的时间。

实现方案:使用3DMax软件建模,导出3ds格式的模型文件,在VC++ MFC编程环境下,读取3ds文件,使用OpenGL[6-9]函数库,根据3d文件数据重新恢复模型,产生两幅不同视口的三维图像并进行颜色处理,合成一幅红青图像。实现的原理流程如图3所示。

3 3DS文件的图像显示

3.1 3DMax建模

3Dmax[5]是Autodesk公司开发的基于PC系统的三维动画渲染和制作软件,使用该软件制作的三维模型,可以导出DWF或3ds格式的文件,文件包含建立模型的结构、位置、纹理等三维数据信息,方便与其他软件进行交互。本文使用的是3ds格式文件,

并且以位图文件进行贴图。以下是制作三维模型及导出3ds文件的主要流程。

⑴ 三维图形绘制。

⑵ 给模型制定材质或贴图。

⑶ 导出3ds格式的文件。

3.2 3ds文件的读取

3ds文件是基于“块”存储的,这些块描述了诸如场景,每个视口(Viewport)的状态、材质、网格对象等数据,主要涉及三个数据结构:多边形列表、三角形列表、定点集。

在VC++ MFC环境下读取3ds文件块可以使用以下步骤。

步骤1:定义数据块变量并分配空间。

步骤2:使用一个while循环,在循环体内读入子块。

步骤3:使用switch语句进行ID号判断及处理,如ID为MATERIAL则读取材质信息,ID为OBJECT则读取对象信息等。

步骤4:若当前字块字节数小于预定长度则结束while循环。

步骤5:释放当前块的内存空间。

3.3 三维图形的显示

在VC++6.0 MFC环境下,读取3ds文件,随后使用OPenGL库函数实现图像的显示,在此过程中还必须进行背景色、光源的设置,定义一个渲染函数进行图形的渲染,可以同时将多个3DS文件载入内存,并赋予不同的ID标识,根据ID标识设置各个三维模型放置的位置,可以分别对各模型进行灵活的平移、缩放、旋转等控制操作。

以下是一些常用OpenGL函数的功能。

⑴ glRotatef:旋转。

⑵ glTranslatef:平移。

⑶ glClearColor:清除颜色缓冲区。

⑷ glShadeModel:设置着色模式。

⑸ glMaterialfv:指定用于光照计算的当前材质属性。

4 3D立体图像合成

以上方法实现了三维图形的显示,显示的图形是基于三维建模数据的二维图像,本文使用两个不同角度的三维图像,图像抓取后进行颜色处理并重构成3D立体图像。

4.1 左右图像的抓取

设计一个“3D图像立体显示”菜单,选择该菜单时显示一幅从物体左前侧角度观察的图像,调用抓图函数捕捉图像,并保存为bmp[10-11]格式的位图(左图)文件,保存后,将图像自动向左旋转一个角度,再捕捉该图像,同样保存为bmp格式位图(右图)文件。图4是一个型号为Z35的铣床三维图像左右两个角度抓取的图像。以下是图像捕捉的实现步骤。

⑴ 建立一个屏幕设备环境句柄。

⑵ 建立一个与屏幕设备环境句柄兼容、与鼠标所在窗口区域等大的位图。

⑶ 把新位图选到内存设备描述表中。

⑷ 把屏幕设备描述表拷贝到内存设备描述表中。

⑸ 保存抓取的图像。

4.2 图像的颜色预处理

以上保存的图像文件为24色(真彩)BMP位图,包含了图像的RGB全部信息,BMP文件里面的字节数据有三个部分,分别是:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、位图数据Data Body阵列。

根据红蓝3D的成像原理,对图像进行滤色处理,使左图只有红色分量,右图只有绿、蓝两个分量。

左图滤色的伪代码:

//读入指定BMP文件进内存

readBmp("bmp文件名");

//获取每行字节数

lineByte←(bmpWidth*biBitCount/8+3)/4*4;

//遍历每像素的三个分量

bmpHeight←bmpHeight-1;

if biBitCount=24 then //24色图像

pitch←bmpWidth%4;

for i←0 to bmpHeight

do realPitch←i*pitch;

for j←0 to bmpWidth

//只显示紅色

do pBmpBuf1[((bmpHeight-i)*bmpWidth

+j)*3+1+realPitch] ←0;

pBmpBuf1[((bmpHeight-i)*bmpWidth

+j)*3+realPitch] ←0;

repeat

end if

代码中,pBmpBuf1指向一段只有R分量的内存段。以上代码的步骤说明如下。

⑴ readBmp函数将BMP文件读入内存。

⑵ 求出每行字节数lineByte。代码中的bmpWidth为是位图的宽度,也就是每行有多少个像素块,biBitCount是一个像素值所占的字节数,对于24色位图,此值为24。对于BMP文件,存储图像数据每行字节数为4的倍数,因此求lineByte时使用“/4*4”取整,对于不满足4的整数倍时用+3来处理。

⑶ 遍历位图数据,对于左图,只保留红色分量,绿色和蓝色分量设为0。

对于右图,处理方法和左图类似,只是保留绿色和蓝色分量,定义pBmpBuf2为指向一段只有GB分量的内存段。

4.3 左右图像的合成

上述代码已分别取得R分量及GB分量的图像数据,在合成一幅图像时,采用叠套的for循环遍历每个像素的RGB分量并将像素进行算术平均,保存到一个内存块中。

以下伪代码为将R分量平均值保存到内存块pBmpBufhc中:

for i←0 to bmpHeight

realPitch←i*pitch; //每行像素量

for j←0 to bmpWidth

pBmpBufhc[((bmpHeight-i)*bmpWidth+j)*3+2+realPitch]

←(pBmpBuf1[((bmpHeight-i)*bmpWidth+j+offsetW)

*3+2+realPitch]+pBmpBuf2[((bmpHeight-i)

*bmpWidth+j)*3+2+realPitch])/2;

end if;

end if;

保存图像的信息于pBmpBufhc后,将图像保存为位图文件,保存后的图像可以使用一般的图形编辑软件打开。下面介绍的3D立体图像的显示中需要用到此文件。

4.4 3D立体图像的显示

本文使用的图像显示方式为读取磁盘文件(前述中保存的文件)的方法,使用BitBlt函数显示图像。以下是具体步骤。

⑴ 使用MFC 的LoadImage函数装载位图。

⑵ 创建CDC对象。

⑶ 使用CreateCompatibleDC创建兼容设备。

⑷ 选择位图。

⑸ 使用BitBlt函数显示位图。

合成的图像可以在一个新的窗口显示,但在原窗口、原位置上显示效果更好,不过需要退出原三维显示状态,如果开启了定时器,则需要关闭,否则图像会出现严重的闪烁。合成的图像如图5所示,带上红蓝眼镜就可以观看到3D立体效果。(说明:为了论文的阅读效果,图5的背景色作了后期处理,改为了白色,左右图的背景色若为白色,则合成的图像背景色为RGB(127,127,127))。

5 结束语

基于三维数据模型显示的图像本身并不具备3D立体效果,使用本文介绍的方法可以得到分色3D立体效果的图像,该方法的图像滤色与合成部分同样适用于制作非基于三维数据的3D立体图像,而且全过程均可直接在内存中进行颜色处理,速度较快,可以制作3D立体动画。

使用本文的方法对三维模型的静态3D立体图像制作有效,对于三维动画图像,因为需要先显示非3D立体的图像再进行处理,所以不再适用。如何直接在内存中,对3ds模型的贴图文件进行动态的图像合成,实现三维动态图像显示的问题有待今后进一步研究,如果这个问题得到解决,在3D立体游戏、3D立体仿真软件开发等方面将有广泛的应用前景。

參考文献(References):

[1] 孙俊丽.基于新一代信息技术的photoshop图像处理课程开发与建设[J].办公自动化,2018.2:61-62

[2] 刘凤霞.基于photoshop图层混合计算公式的应用探究[J].电脑编程技巧与维护,2018.3:126-127,163

[3] 张晓琪.PhotoShop图层的应用技巧[J].电脑编程技巧与维护,2017.18:84-86

[4] 王少典.关于3D显示的研究与应用前景[J].信息记录材料,2018.3:91-93

[5] 冉秋.3DMAX三维虚拟基础下景观设计技术的分析[J].数字技术与应用,2017.1:153,157

[6] 袁观娜,李秋,张琰.基于OpenGL与3Dmax的虚拟现实动作仿真系统的研究[J].科技资讯,2016.4:1-2

[7] 许玉龙,张佩江,王忠义等.基于MFC和OpenGL的虚拟人体经络穴位模型实现方法[J].计算机与现代化,2018.3:6-12

[8] 张肇同.基于opengl的三维模型读取与动态观察[J].科技视界,2017.34:4-5

[9] 梁婧,姚红革.基于OpenGL的三维建模可视化软件开发[J].信息通信,2013.9:83-83

[10] 赵刘飞,赵敏华.VC中DIB位图程序设计的研究[J].工业控制计算机,2014.3:41-42,45

[11] 肖峰.VC++下的BMP格式图像和PNG格式图像的转换[J].赤峰学院学报:自然科学版,2016.3:17-18

猜你喜欢

分色内存立体
高质量双色车身分色材料性能研究
外部高速缓存与非易失内存结合的混合内存体系结构特性评测
念个立体咒
“春夏秋冬”的内存
时尚之季,真分色工艺
立体登陆
保险杠套色分色槽面向制造的结构设计规范
三种分色方法制作旋毛虫肌幼虫囊包染色标本的效果观察
炫酷立体卡
基于内存的地理信息访问技术