首页 > 技术文章 > Fancy3D引擎sample学习(A)

hlwangcong 2013-11-21 15:44 原文

1、ambientlight

_rd:uselight(light)

将light压入渲染设备的光栈。渲染设备会使用光栈中的所有元素来渲染。每个useLight应该对应一个popLight。多次压入颜色会呈现混合后的颜色。例如:绿+红=黄

 1 _dofile('cameracontrol.lua')
 2 teapot = _mf:createTeapot()
 3 _rd.camera.eye = _Vector3.new(30, 30, 30)
 4 
 5 ambient = _AmbientLight.new()
 6 ambient.color = _Color.Green
 7 _rd:useLight(ambient)
 8 
 9 specular = _SpecularLight.new()
10 specular.color = _Color.Red
11 _rd:useLight(specular)                          
12 
13 _app:onIdle(function(e)
14     _rd:drawAxis(30) 
15     teapot:drawMesh()
16 end)
View Code

2、analyze-scene

_debug:objectMonitor(类名,number)

会对一个类进行监视,出现一个二维坐标系

t = _Timer.new()

t:start(t, duration, callback) 

在duration时间内,执行完函数callback,并循环。

3、animation

_sys:addDownloader('local://dlsrc', 3000)  下载一个文件夹dlsrc

_sys:delFile('文件名')

_sys:copyFile('源文件', '目标文件') 貌似没有目标文件会自动生成

例:_sys:copyFile('res/act01.san', 'dlsrc/test.san')

PS:先建立骨骼文件,然后为骨骼添加动画,并渲染骨骼

 1 _sys:addPath('res')
 2 --_sys:addPath('dlsrc')
 3 _dofile('cameracontrol.lua')
 4 
 5 
 6 _sys:addDownloader('local://dlsrc',3000)
 7 _sys.asyncLoad = true
 8 
 9 if _sys:delFile('test.san') then
10     print("1~~!")
11 end
12 _sys:copyFile('res/atc01.san', 'dlsrc/test.san')
13 _sys:copyFile('res/atc01.san', 'test.san')
14 _Animation.new('test.san')
15 _gc()
16 if _sys:delFile('test.san') then
17     print("2~~!")
18 end
19 
20 skl = _Skeleton.new('girl.skl')
21 san = skl:addAnima('test.san')
22 san.speed = 2
23 san.loop = true
24 san:play()
25 
26 _app:onIdle(function(elapse)
27     skl:drawSkeleton()
28     _rd:drawAxis(50)
29 end)
30 
31 _sys:delFile('test.san')
View Code

 4、animation-combine

为骨骼文件添加一些动画,然后合并这些动画,最后play()

PS:如果不用动画san:play()这个方法,光渲染骨骼是不会有图形的。

san1:combine(san0)

san1:combine(san2)

san1:play()

播放顺序是san1-san0-san2

 1 _sys:addPath('res')
 2 _dofile('cameracontrol.lua')
 3 
 4 skl = _Skeleton.new('girl.skl')
 5 
 6 san0 = skl:addAnima('idle.san')
 7 san1 = skl:addAnima('san1.san')
 8 san2 = skl:addAnima('san2.san')
 9 
10 print( san0.duration )                        -- 输出动画的总持续时间
11 print( san1.duration )
12 print( san2.duration )
13 
14 san1:combine(san0)                            
15 san1:combine(san2)
16 san1:play()
17 print( san1.duration )
18 
19 _app:onIdle(function(e)
20     skl:drawSkeleton()
21 end)
View Code

 5、animation-holder

按1删除动画,按2交换两个动画对应的骨骼

addAnima('_Animation对象或者ska资源文件名')

那么就有两种方式来给骨骼加动画,一种new一个_Animation,然后初始化loop,play()等,最后skl:addAnima(san);另一种就是直接san = skl:addAnima('san1.san')

_Animation有一个属性 holder,可以更改持有该动画的骨骼。例如:san1.holder = skl2就把原来san1对应的骨骼skl1改成了skl2

PS:想删除一个动画直接赋值为nil就可以。

 1 _sys:addPath('res')
 2 _dofile('cameracontrol.lua')
 3 
 4 skl1 = _Skeleton.new('girl.skl')
 5 skl2 = _Skeleton.new('girl.skl')
 6 
 7 san1 = skl1:addAnima('idle.san')
 8 san1.loop = true
 9 san1:play()
10 
11 
12 -- san2 = _Animation.new('san1.san')
13 san2 = skl2:addAnima('san1.san')
14 san2.loop = true
15 san2:play()
16 -- skl2:addAnima(san2)
17 
18 mat1 = _Matrix3D.new():setTranslation(0, 30, 0)
19 mat2 = _Matrix3D.new():setTranslation(0, -30, 0)
20 
21 _app:onKeyDown(function(u)
22     if u == _System.Key1 then
23         skl1:delAnima(san1)
24         skl2:delAnima(san2)
25         san1 = nil
26         san2 = nil
27     elseif u == _System.Key2 then
28         if san1.holder == skl1 then
29             san1.holder = skl2
30             san2.holder = skl1
31         else
32             san1.holder = skl1
33             san2.holder = skl2
34         end
35     end
36 
37     local c1 = _debug:objectCount(_Animation.typeid)
38     _gc()
39     local c2 = _debug:objectCount(_Animation.typeid)
40     print('Animation : ' .. c1 .. ' -> ' .. c2 )
41 end)
42 
43 _app:onIdle(function(e)
44     _rd:drawAxis(50)
45     _rd:pushMatrix3D(mat1)
46         skl1:drawSkeleton()
47     _rd:popMatrix3D()
48 
49     _rd:pushMatrix3D(mat2)
50         skl2:drawSkeleton()
51     _rd:popMatrix3D()
52 end)                                                   -- holder 属性 是什么 返回_GraphicsEvent
View Code

 

推荐阅读