用LDRAW和POV-RAY渲染出以假乱真的效果图

只要你的电脑足够快,用LDRAW和POV-RAY可以渲染出以假乱真的LEGO效果图,快来试试吧。

前提:你必须能熟练使用电脑,有一定的钻研精神,最好有尝试过LEGO的3D虚拟搭建。还有,有一定的英文阅读能力,因为这里面涉及的所有软件都是英文版的~而且要注意,不要使用中文路径、中文文件名、中文注释等等,因为英文软件不能很好的支持中文!

(2014-03 更新,不再需要单独下载POVRAY了。文中涉及到的安装包都可以从我的备份 http://pan.baidu.com/s/1dFx9uLj 下载)

(2015-03 更新,安装包升级到LDRAW_AIOI_2014-2了,新版本通常有更大的零件库和更强大的各式工具,建议尝试。新增了LDCAD软件,也可以用于编辑ldr/mpd文件,可以试试)

首先,从 ldraw.org 下载安装 LDRAW ALL-IN-ONE 2013.2注意要安装 LDVIEW、MLCAD、LGEO 和 POVRAY 3.7。运行povway 3.7,选择菜单Tools/EDIT master POVRAY.INI,打开povray.ini,增加三行(这里假设LDraw安装在C:\Program Files\LDraw,如果是64位Windows系统的话路径可能是C:\Program Files (x86)\LDraw):

Library_Path="C:\Program Files\LDraw\LGEO" 
Library_Path="C:\Program Files\LDraw\LGEO\lg" 
Library_Path="C:\Program Files\LDraw\LGEO\ar"

然后,下载LGEO的patch( https://dl.dropbox.com/u/5986419 … les/LGEO-Update.zip ),把zip里面的lg_*文件放进LGEO\lg目录(默认是C:\Program Files\LDraw\LGEO\lg目录,注意是部分覆盖),*.xml文件放进 LDView 目录覆盖老文件

再然后,网上下载 .ldr .mpd .dat 格式的LDRAW工程文件,或者自己用MLCAD之类的LEGO虚拟搭建软件创建 .ldr 格式文件,用LDVIEW可以打开观看。这里给一个例子:  http://bricksafe.com/files/ruf/fun/wtf01.ldr  。在LDVIEW里面观看模型的时候,用鼠标调整方位(按住左键旋转,右键放大缩小,中键平移),调整好方位后,执行 File/Export,点击对话框下面的option,option里面,Quality可以选择 Normal 或者 Include stud logos(这个就是每个小痘痘上的LEGO凸起都有),其他的都用默认值,导出保存成一个 .pov 文件。

再再然后,双击 .pov 文件打开,然后尝试run,如果报错(比较少见),那是LDVIEW生成的时候有BUG,多半是错别字,自己看代码改好。例如笔者就遇到一次 LDX_48_slash_5_dash_24rin10_dot_dat_in_part 错拼成 LDX_48_slash_5_dash_24ri10_dot_dat_in_part ,’ri’后漏写一个’n’字符。run如果成功就会生成一个bmp图片,效果可能不大好。如下:

现在到了关键时刻了,在 .pov 文件前部, 一大堆declare后面, Camera 定义前面,增加:

// Before Camera

#include "rad_def.inc"

global_settings {
 max_trace_level 10
 radiosity {
 Rad_Settings(Radiosity_Fast, on, off)
 }
}

light_source { // X, Y, Z
 <-1000, -1500, -1000>
 color rgb 0.5
 area_light 200, 200, 10, 10
 jitter
}

#declare LDXSkipLight1 = 1;
#declare LDXSkipLight2 = 1;
#declare LDXSkipLight3 = 1;

/*
// Fog
fog {
 distance LDXRadius*25 // 添加大雾,在街景里面比较有用
 color rgb 1
}
*/

// Lights
light_source {
 <0*LDXRadius,-1.5*LDXRadius,-1.5*LDXRadius> + LDXCenter
 color rgb 0.75
 area_light 200, 200, 10, 10
 jitter
}
light_source {
 <1.5*LDXRadius,-1*LDXRadius,0.866026*LDXRadius> + LDXCenter
 color rgb 0.75
 area_light 200, 200, 10, 10
 jitter
}
light_source { // Custom light 1: Above
 <0,-2*LDXRadius,0> + LDXCenter
 color rgb 0.5
 area_light 200, 200, 10, 10
 jitter
}
light_source { // Custom light 2: Side
 <2*LDXRadius,-0*LDXRadius,-2*LDXRadius> + LDXCenter
 color rgb 0.5
 area_light 200, 200, 10, 10
 jitter
}

// Floor
#if (LDXFloor != 0)
object {
 plane { LDXFloorAxis, LDXFloorLoc hollow }
 texture {
 pigment { color rgb 0.9 }
 finish { ambient 0 diffuse 0.9 reflection 0 }
 }
}
#end

#declare LDXFloor = 0;

现在,再run一次,看看效果。把渲染分辨率调整成1280×1024 AA0.3再run一次看看效果。如果需要自定义分辨率,选择菜单Tools/EDIT resolution INI file,增加自己想要的分辨率,保存然后重启povray。我最终出图的分辨率是1920×1440 AA0.3。

如果要更好的效果,把前面添加的代码里面的 Radiosity_Fast 改成 Radiosity_Final ,再在camera { } 里面增加景深效果:

focal_point (LDXCameraLookAt*15+LDXCameraLoc)/16 // 对焦点,这里我放在了镜头和中心点之间靠近中心点的位置
 aperture LDXRadius/20 // 景深大小
 blur_samples 25 // 采样数, 4 ~ 100 ,越大越慢但效果越好,出草图的时候可以设置成9,出最终图的时候设置成25以上

再run一次看看效果。看看题图的效果~

静物摄影最重要的技巧是光源、对焦和景深,上面的代码里面我放了四盏灯(light_source),有经验的朋友可以自己调整灯的位置和亮度,还可以把灯面积设置大一些以得到比较柔和的阴影。另外在POVRAY里面也可以自己调整对焦点和景深大小,camera { } 里面 focal_point 后面是对焦位置,这里有一个技巧,可以用MLCAD打开.ldr文件,选择你想对焦的零件,然后在零件列表里面看到这个零件的坐标,然后修改.pov文件,例如下面这个图,我的对焦点是离镜头最近的哪个红色2×4拐角梁,它的坐标是 <100,-300,-100> 则写成:

 focal_point <100,-300,-100> // 对焦点
 aperture LDXRadius/50 // 这里把光圈做小,为了远景的线条清晰一些
 blur_samples 25 // 采样数, 4 ~ 100

如果有多个.pov文件,可以用 queue 功能排队生成,睡觉,等结果。生成的如果是bmp文件,可以用photoshop、画板等工具,转成jpg或者png文件。

在前面EDIT master POVRAY.INI的时候如果加上一行 “ +fn16 ” 则会生成16bit位深的png文件,效果非常好,比8bit位深的bmp细节好很多,文件也小不少。



(以前做的幽灵马车,我的第一个MOC作品)


(极限攀爬车)


(上面是正在开发中的 海龟作图机器人,软件开发中~)

(2014-08-07 更新:下面的新脚本让阴影更平滑,只要粘贴到LDview生成的文件里的 ‘// Camera’ 一行的前面就行了,不用做其他改动了!)

// Before Camera
#declare light_multi = 0.8;
#declare light_floor = 0.7;

#if (version < 3.7) 
//global_settings{ assumed_gamma 1.0 } 
#end

#include "rad_def.inc"

global_settings {
 max_trace_level 10
 radiosity {
 Rad_Settings(Radiosity_Final, on, off)
 }
}

#declare LDXSkipLight1 = 1;
#declare LDXSkipLight2 = 1;
#declare LDXSkipLight3 = 1;

// Lights
light_source {
 <0*LDXRadius,-1.5*LDXRadius,-1.5*LDXRadius> + LDXCenter
 color rgb 0.75 * light_multi
 area_light 200, 200, 5, 5
 jitter
 circular 
 orient 
}
light_source {
 <1.5*LDXRadius,-1*LDXRadius,0.866026*LDXRadius> + LDXCenter
 color rgb 0.75 * light_multi
 area_light 200, 200, 5, 5
 jitter 
 circular 
 orient 
}
light_source { // Custom light 1: Above
 <0,-2*LDXRadius,0> + LDXCenter
 color rgb 0.5 * light_multi
 area_light 200, 200, 5, 5
 jitter 
 circular 
 orient 
}
light_source { // Custom light 2: Side
 <2*LDXRadius,-0*LDXRadius,-2*LDXRadius> + LDXCenter
 color rgb 0.5 * light_multi
 area_light 200, 200, 5, 5
 jitter 
 circular 
 orient 
}

#declare LDXBgR = 0; // Background Red
#declare LDXBgG = 0; // Background Green
#declare LDXBgB = 0; // Background Blue

// Floor
#if (LDXFloor != 0)
object {
 plane { LDXFloorAxis, LDXFloorLoc hollow }
 texture {
 pigment { color rgb light_floor }
 finish { ambient 0 diffuse 0.9 reflection 0 }
 }
}
#end

#declare LDXFloor = 0;

camera {
 #declare LDXCamAspect = image_width/image_height;
 location LDXCameraLoc
 sky LDXCameraSky
 right LDXCamAspect * < -1,0,0 >
 look_at LDXCameraLookAt

 angle 26.460249
 focal_point (LDXCameraLookAt*15+LDXCameraLoc)/16
 aperture LDXRadius/20
 blur_samples 25 // 4 ~ 100
}

#declare LDXSkipCamera = 1;

白色竞赛纪念版 老爷车:

(2015-03-05更新:LDView新技能——广角镜头和边界线)

在LDView的Edit/Preferences里,General页里有一个配置项叫Field of view,这个值就等同于镜头焦距,默认是30,越接近90越是广角,例如下图是值为60时的效果:

注意广角的时候需要适当缩小光圈并正确的对焦,不然很容易像上图一样,糊了。

下图是值为45时的效果:

广角是不是更有压迫感?需要注意的是后期修改.pov文件的时候,camera { … angle 26.460249 } 里面的angle值需要改成和生成文件里一致,比如上图的angle就不是26.460249而是57.822403。

另外在LDView里export出povray文件的时候,在对话框下面的option里面,可以打开Geometry的Edge Lines选项,这可以给模型增加边界线,下图是打开Edge Lines和Conditional Edge Lines选项,Edge line radius(线粗)为0.15的结果:

哪个更好看?

(2016-01-19更新:地板反射)

地板部分代码改成:

// Floor
#if (LDXFloor != 0)
object {
 plane { LDXFloorAxis, LDXFloorLoc hollow }
 texture {
 pigment { color rgb <1.0,0.8,0.6> }
 finish { ambient 0.0 diffuse 0.3 reflection {0.3} }
 }
}
#end

看看效果?