模拟3s效果


下载地址
http://forum.cgfinal.com/showthread.php?t=44966
global sss_obj = undefined <----------- 要加入3s效果的物体
global sss_light = undefined <----------- 灯光
global sss_map= undefined <----------- 自发光贴图
global o_distance = undefined <----------- 灯光和物体的距离
global flag_autoupdata = false <----------- 自动预览开关标志
global flag_AA = true <----------- 预览是否抗锯齿
global offset_prv = 0 <----------- 保存当前偏移距离
global str_mattype = undefined <----------- 保存所选物体材质类型(字符串)
定义预览面板
rollout DBC_Preview " Preview " width:280 height:380
(
bitmap preview_img "Bitmap" pos:[9,20] bitmap bitmap 50 50 color:black)
定义一个名为preview_img的bitmap 用于显示预览效果
pos:[9,20]位置 按左上角计算位置
bitmap bitmap 50 50 color:black)
宽高为 250 240 默认颜色为 黑色
button btn_Refresh "Refresh" pos:[9,310] width:250 height:24 定义Refresh按钮
定义Auto Refresh预览自动刷新 和Anti-Aliasing 抗锯齿 的复选框
checkbox chk_autoupdata "Auto Refresh" pos:[9,275] width:84 height:20
checkbox chk_AA "Anti-Aliasing" pos:[100,275] width:84 height:20 checked:true
当按下Refresh按钮时执行此段
on btn_Refresh pressed do
(
select sss_obj 选中sss物体
Updata_prv preview_img 更新预览图
)
自动更新和抗锯齿的开关控制
on chk_autoupdata changed state do
(
flag_autoupdata=chk_autoupdata.checked
if flag_autoupdata do
(
select sss_obj
Updata_prv preview_img
)
)
on chk_AA changed state do
(
flag_AA = chk_AA.checked
select sss_obj
Updata_prv preview_img
)
)
更新预览的 函数定义如下
fn Updata_prv Img =
( view=render outputwidth:250 outputheight:240 vfb: off renderType: #selection antiAliasing: flag_AA
Img.bitmap=view
渲染所选物体道之前定义的bitmap控件
)
------------------------------------------------------------------------------------------------------
参数设置面板
rollout DBC_main "Parameters" width:280 height:352
(
定义拾取灯光和 物体 的按钮
pickbutton pick_light "Pick Light" pos:[109,12] width:149 height:24 enabled:true message:"" filter:filter_light toolTip:"Pick a light"
pickbutton pick_obj "Pick Object" pos:[109,41] width:149 height:24 enabled:false message:"" filter:filter_mesh toolTip:"Pick a object"
颜色选择控件
colorPicker sss_color "color" pos:[9,11] width:83 height:53 enabled:false color color 255 255 255) fieldWidth:55
改变亮度 和偏移的两个spinner控件
spinner spn_level "Intesity" pos:[25,99] width:90 height:16 enabled:false range:[0,100,1] scale:0.1
spinner spn_offset "Offset" pos:[166,99] width:90 height:16 enabled:false range:[-999999,999999,0] type:#float scale:0.1
range:[0,100,1] 是spinner控件数值的范围 range:[最小值,最大值,默认值]
调节区域的滑动控件
slider sld_range "Range" pos:[9,139] width:262 height:44 enabled:false range:[50,100,100] ticks:1
上面几个enabled:false 是使其在开始处于灰色禁用状态 当拾取灯光后按钮 pick_obj 可用当拾取物体后其他都变为可用,这样防治混乱
一个文本 标签 用来显示百分比
label lab_Percentage "" pos:[215,139] width:48 height:18
Pick Light 按钮拾取灯光事件处理
on pick_light picked obj do
(
sss_light = obj 将拾取的灯光存入sss_light
pick_light.text = obj.name 按钮文字改为相应的灯光名称
pick_obj.enabled = true 启用Pick Object按钮
)
on pick_obj picked obj do
(
sss_obj = obj 将拾取的物体存入sss_obj
pick_obj.text = obj.name
... ...
sss_map= falloff () sss_map 设为falloff贴图
sss_map.direction = 3 Falloff Driction 为 Object
sss_map.type = 4 Falloff Type为 distance Blend
sss_map.node = sss_light Object为拾取的灯光
p_light=sss_light.pos
p_obj=sss_obj.pos
如果拾取 的物体 没有材质则为它加上标准材质
if sss_obj.material == undefined do
(
new_mat = StandardMaterial diffuse: (color 180 210 0)
sss_obj.material= new_mat
)
计算默认距离
sss_map.farDistance = (distance p_obj p_light)*2
o_distance = sss_map.farDistance
Standard材质和Raytrace不同处理,将自发光通道贴图设为sss_map
str_mattype = (sss_obj.material as string)
if (findstring str_mattype "Standard") !=undefined do
(
sss_obj.material.SelfIllumMap=sss_map
sss_obj.material.useSelfIllumColor = on
)
if (findstring str_mattype "Raytrace") !=undefined do
(
sss_obj.material.Luminositymap=sss_map
)
sss_map.color2 = sss_color.color=sss_obj.material.diffuse
sss_color.enabled=true
spn_level.enabled=true
spn_offset.enabled=true
sld_range.enabled=true
)
......
定义信息面板
rollout DBC_about "About ..."
(
.......
)
创建浮动面板
DBC_floater = newrolloutfloater "DBC Fast SSS 1.0" 280 600 100 100 <--主窗口三个面板
addrollout DBC_main DBC_floater
addrollout DBC_Preview DBC_floater
addrollout DBC_about DBC_floater rolledup:true
评论