摘 该文介绍三维立体画原理制作方法出C语言编写源程序
助Pbrushexe读者设计欣赏式样三维立体画
目前市面正流行式样立体画特点外表般图案相似双眼紧盯着注视片刻恍惚间眼前便出现画中画——立体
笔者第次种画便发明者创意倾倒
利众皆知双眼视差原理竟张面纸制造出奇幻
立体画身发明者灵感画面创作者出心裁外原理神秘处
计算机程序实现说易反掌
笔者晚时间便微机BASIC语言实现简单形体——面圆饼立体画
然该程序具完善功提高制作速度应该编译语言(C语言)编写
文中出源程序助Windows中BMP图形文件家制作意形态立体画
立体画原理 立体电影知道双眼分接收视角拍摄图时便会产生立体感
眼长期观察惯造成
立体电影原理相立体摄影风景片早已出现
图1中出种立体片示意图
左右片分双眼角度观察棱锥体时左右眼图(图2)
左眼棱锥顶端右错动图右眼棱锥顶端左错动图
果张硬卡片隔开两张片(图3)@@09A04000GIF图1@@ @@09A04001GIF图2@@ @@09A04002GIF图3双眼分两张画会立体棱锥体
种立体片观察方法测绘学中早已采
目前三维立体画形式相
样张画面呈现立体呢首先分析样立体画中出立体形体
前面说知道眼立体感双眼必须视差双眼图应该差异
立体画时恍惚程
程中双眼视中心发生错动(图4)
样@@09A04003GIF图4左眼画面偏左右眼画面偏右
@@偏左偏右容相图1左右片双眼会感立体形体
否图1左右片分做偏左偏右简单重叠立体画呢 显然行
够合成立体画偏左偏右满足定条件
果图5中表现棱锥体表面图案话 @@09A04004GIF图5素a素a应该具相颜色视角观察@@实体点
素b素b素c素c情况相
两幅画分作偏左图偏右图部分重叠成画面时新画面种关系应该表现aabbcc(图6)
时应该注意张合成 @@09A04005GIF图6画面点a偏右图点a偏左图点b
@@张画面相坐标点素种颜色产生新素关系ab
外点a偏左图点a偏右图点cac
类推点b点c类似情况
出现新关系表示式ccaabb
构成立体画面素必须满足条件等颜色素链
立体画点属某条等颜色素链
立体画图案呈现出某种程度水周期性原
意立体形状构造出相应种等素链规律充填图案立体画
正前面述种等素链条件约束然意构造出种形体立体画立体形体表面图案完全意愿
二制作立体画计算机程序 双眼水性等素链水方分布垂直方关
程序中素行处理程相互独立
制作立体画程序结构图图7
@@09A04006GIF图7 制作立体画程序结构图结构图中关键建立等@@素链
具体处理
立体形体点首先求出该点偏左图偏右图坐标
图1中棱锥顶点例实际X坐标中心点双眼位置正方顶点偏左图右位移偏右图左位移位移值显然高度关该点坐标越高位移值越
abc等点位移
求出点偏左图偏右图坐标算出合成图(图6)应坐标 建立等素关系aa
立体形体水剖面全部点处理合成图条等素链关系然形成
外出现高点遮盖低点情况等素链构造应该低点高点逐层进行高点等素关系代低点等素关系
程序结构图中首先没形体存背景面构造等素链’原
面出根结构图C语言编写源程序
程序中坐标点应结构型数包含前素素两指针
前素指针指该坐标点作偏右图点偏左图应点坐标
素指针指该坐标点作偏左图点偏右图应点坐标
程序中立体形体水剖面高低坐标数原始图案素材输出立体画文件格式采Windows31 Pbrush产生BMP图形文件格式
图幅求640×40016种颜色方式
中立体形体点高低坐标图形文件中颜色值表示该图形文件图形带颜色等高线图安全相
通常情况16色BMP文件中颜色值序黑色暗红色暗绿色暗黄色暗蓝色暗紫色暗青色暗灰色灰色明红色明绿色明黄色明蓝色明紫色明青色白色
程序采简单图案充填方案条链素点皆采该链第素颜色
程序中常数EYESPACE表示偏左图偏右图间偏差BODOT表明链首尾指针标志
该程序寄生Windows 31中Pbrush软件
助构筑立体形体(立体形体水剖面高低坐标数文件图8)设计原始图案(图9)
程序运行逐行输入处理两文件中图形然输出立体画结果文件(图10)
Pbrush观赏立体画resultbmp
然设计出令赏心悦目立体画必须立体形体图案素材选择搭配做天衣缝独具匠心
@@09A04007GIF图8@@ @@09A04008GIF图9@@ @@09A04009GIF图10程序清单@@ *from 1995419to 1995518*include #define COMPRESSION 0 #define SIZEOFBITMAPFILEHEADER 14 #define SIZEOFBITMAPINFOHEADER 40 #define SIZEOFRGBQUAD 4 #define PIXELDATEOFFSET 14 40 4*16 *SIZEOFBITMAPFILEHEADER SIZEOFBITMAPINFOHEADER BITSPERPIXEL *NUMCOLOR* #define NUMCOLOR 16 #define NUMLINE 400 #define WIDTH 640 #define BITSPERPIXEL 4 #define PIXELPERBYTE 2 *8BITSPERPIXEL* #define BYTEPERLINE 320 *((WIDTH*BITSPERPIXEL1)32 1)*4 * #define NODOT WIDTH 1 #define EYESPACE 128 struct{ unsignde char color unsigned int prix unsigned int nxtx }dot[WIDTH] main() { struct tagBITMAPFILEHEADER{ unsigned char bfType1bfType2 * always equal toBM* unsigned long int bfSize *size of file * unsigned int bfReserved1bfReserved2 * set to zero * unsiged long int bfoffits *byte offset from BITMAPFILEHEADER to bitmap p ixel data in the file * }BITMAPFILEHEADER struct tagBITMAPINFOHEADER{ unsigned long int biSize* size of BITMAPINFOHEADER * biWidth* width in pixels biHeight* height in pixels * unsigned int biPlanes * always 1 * biBitCount * color bits per pixel must be 148 or 24 * unsigned long int biCompression *BIRGBBIRLE 8 or 4* biSizeImage *total bytes in image * biXPelsPerMeter* 0or opth res * biYPelsPerMeter* 0or opth res * biClrUsed * normally 0can set a lower no colors than biBitCount * biClrImportant * normally 0 * }BITMAPINFOHEADER struct tagRGBQUAD{ unsigned char rgbBlue * blue intensity0255 * rgbGreen * green intensity0255 * rgbRed * red intensity0255 * rgbReserved * reservedset to Zero * }RGBQUAD[NUMCOLOR] char *fnlayerlayerbmp char *fnorgoriginbmp char *fnresultresultbmp FILE *flayer*fOrigin *fResult unsigned char tmpbyte1tmpbyte2 unsigned int lineibyteipixelx unsigned int layer int leftxrightxtmpx unsigned long int curoffset unsigned char h[WIDTH]orgcolor[WIDTH] puts(WINTRICK) puts(by Li Jisong ) if( (fLayerfopen(fnlayerrb) )NULL) { fread(&BITMAPFILEHEADERSIZEOFBITMAPFILEHADER1fLayer) fread(&BITMAPINFOHEADERSIZEOFBITMAPINFOHEADER1fLayer) if( BITMAPFILEHEADERbfType1B && BITMAPFILEHEADERbfType2M && BITMAPINFOHEADERbiWidthWIDTH && BITMAPINFOHEADERbiHeightNUM LINE && BITMAPINFOHEADERbiBitCountBITSPERPIXEL && BITMAPINFOHEADERbiCompressionCOMPRESSION) fread(RGBQUADSIZEOFRGBQUADNUMCOLORfLayer) else{ fclose(fLayer) printf(File s is not fit for this program\nfnlayer) getch() exit(1) } } else{ printf(File s does not exist\nfnlayer) getch() exit(2) } if( (fOriginfopen(fnorgrb))NULL) { fread(& BITMAPFILEHEADERSIZEOFBITMAPFILEHEADER1fOrigin) fread(& BITMAPINFOHEADERSIZEOFBITMAPINFOHEADER1fOrigin) if( BITMAPFILEHEADERbfType1B && BITMAPFILEHEADERbfType2M && BITMAPINFOHEADERbiWidthWIDTH && BITMAPINFOHDADERbiHeightNUMLINE && BITMAPINFOHEADERbiBitCountBITSPERPIXEL && BITMAPINFOHEADERbiCompressionCOMPRESSION) fread(RGBQUADSIZEOFRGBQUADNUMCOLORfOrigin) else { fclose(fOrigin) printf(File s is not fit for this program\nfnorg) getch() exit(3) } } else { printf(File s does not exist\nfnorg) getch() exit(4) } if( (fResultfopen(fnresultwb))NULL){ fwrite(&BITMAPFILEHEADERSIZEOFBITMAPFILEHEADER1fResult) fwrite(& BITMAPINFOHIADERSIZEOFBITMAPINFOHEADER1fResult) fwrite(RGBQUADSIZEOFRGBQUADNUMCOLORfResult) } else { printf(File s open error\nfnresult) getch() exit(5) } for(line0line
>(BITSPERPIXEL1)) orgcolor[x](unsigned char) (tmpbyte2<<(BITSPERPIXEL*ipixel)) ((unsigned char)0x80>>(BITSPERPIXEL1)) } }} for(x0x0)dot[x]prixxEYESPACE } for(layer1layer0)&&(rigntx参考文献 孙志辉王萃寒王茜实Windows 31详解北京电子工业出版社1994
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档