3DSTATE for Visual basic.Net开发(七)

来源:互联网 发布:赋码软件 编辑:程序博客网 时间:2024/05/16 04:47

 3DSTATEfor Visual basic.Net开发

三峡大学土木水电学院3S实验室 肖泽云

注:转载请说明来源处!
高级篇:

五、Light and Shadows灯光和阴影

1、创建一个灯光源
用函数STATE_light_create来创建一个灯光源。
Dim CameraLocation() AsDouble = {0, 0, 100}
Dim SceneLight As UIntPtr = STATE_light_create("Light1", CameraLocation)
另外灯光的位置可以通过函数STATE_light_set_location来移动。
2、选择照亮的对象
如果选择照亮的对象是整个世界的话,用函数STATE_light_set_entity_to_light(SceneLight, 0)
如果选择照亮的是某个具体的对象的话,用函数STATE_light_set_entity_to_light(SceneLight, obj)
3、点亮灯光
建立了灯光源后,现在开始点亮灯光,用函数STATE_light_activate
STATE_light_activate(SceneLight, LIGHT_SET)
其中灯光操作有下列三个值:LIGHT_SET, LIGHT_ADD, 和LIGHT_SUBTRACT
注意:这些创建的光源是没有方向的,用函数STATE_light_set_type_of_light改变类型,用函数STATE_light_set_direction设置灯光的方向。此外,灯光的距离是有限的,用函数STATE_light_set_distance_reach设置灯光能达到的距离。若要整个世界照明,用函数STATE_light_set_entity_to_light来设置,这样会快些。默认的颜色为白色,即(255255255),用函数STATE_light_set_color改变光线的颜色。如:
Dim lightColor(2) AsByte
lightColor(0) = 100 : lightColor(1) = 100 : lightColor(2) = 100
STATE_light_set_color(SceneLight, lightColor)
4、灯光的类型
灯光类型的主要标志有下列:
1)灯光的方向,用函数STATE_light_set_direction设置;
2)灯光影响距离,用函数STATE_light_set_distance_reach设置;
设置灯光的类型用函数STATE_light_set_type_of_light(SceneLight, LIGHT_type)
其中light_type主要有两类:
LIGHT_DEFAULT:其值为LIGHT_EFFECTED_BY_DISTANCE_LINEAR, LIGHT_AMBIENT,LIGHT_DIFFUSE或LIGHT_SPECULAR
LIGHT_DEFAULT_POINTED_LIGHT:其值为LIGHT_DIRECTIONAL,LIGHT_EFFECTED_BY_DISTANCE_LINEAR,LIGHT_AMBIENT,LIGHT_DIFFUSE或 LIGHT_SPECULAR
默认的是LIGHT_DEFAULT。
5、光线的设置
光线包含三种属性:环境光、漫反射和反射。每一个光源都是这三种的统一。
(1)环境光
用函数STATE_light_set_ambient来设置。
STATE_light_set_ambient( my_light, 1) 默认的
STATE_light_set_ambient( my_light, 2.8)  强的环境光线
STATE_light_set_ambient( my_light, 0)   没有环境光
(2)漫反射
用函数STATE_light_set_diffuse( light_handle, value),其中Value的范围是0-10,默认值为1。
(3)反射
用函数STATE_light_set_specular( light_handle, value)来设置,其中Value的范围是0—10,默认值为1。
(4)反射光线
用函数STATE_light_set_specular_shining( light_handle, value),其中Value的范围是0—10,默认值为1。
eg:在Timer中添加键盘控制事件
If GetAsyncKeyState(Keys.D1) <> 0 Then
Dim lightloc(2) AsDouble
            STATE_light_get_location(SceneLight, lightloc)
            lightloc(0) += 100
            STATE_light_set_location(SceneLight, lightloc)
            STATE_light_activate(SceneLight, LIGHT_SET)
ElseIf GetAsyncKeyState(Keys.D2) <> 0 Then
Dim lightloc(2) AsDouble
            STATE_light_get_location(SceneLight, lightloc)
            lightloc(0) -= 100
            STATE_light_set_location(SceneLight, lightloc)
            STATE_light_activate(SceneLight, LIGHT_SET)
ElseIf GetAsyncKeyState(Keys.D3) <> 0 Then
Dim lightloc(2) AsDouble
            STATE_light_get_location(SceneLight, lightloc)
            lightloc(1) += 100
            STATE_light_set_location(SceneLight, lightloc)
            STATE_light_activate(SceneLight, LIGHT_SET)
ElseIf GetAsyncKeyState(Keys.D4) <> 0 Then
Dim lightloc(2) AsDouble
            STATE_light_get_location(SceneLight, lightloc)
            lightloc(1) -= 100
            STATE_light_set_location(SceneLight, lightloc)
            STATE_light_activate(SceneLight, LIGHT_SET)
ElseIf GetAsyncKeyState(Keys.D5) <> 0 Then
Dim lightloc(2) AsDouble
            STATE_light_get_location(SceneLight, lightloc)
            lightloc(2) += 100
            STATE_light_set_location(SceneLight, lightloc)
            STATE_light_activate(SceneLight, LIGHT_SET)
ElseIf GetAsyncKeyState(Keys.D6) <> 0 Then
Dim lightloc(2) AsDouble
            STATE_light_get_location(SceneLight, lightloc)
            lightloc(2) -= 100
            STATE_light_set_location(SceneLight, lightloc)
            STATE_light_activate(SceneLight, LIGHT_SET)
EndIf
注意:每次必须添加STATE_light_activate(SceneLight, LIGHT_SET),否则看不到光照效果。
6、材质属性
可以为不同的材质设置不同的灯光属性,其函数如下:
STATE_polygon_set_ambient
STATE_group_set_ambient
STATE_polygon_set_specular
STATE_group_set_specular
STATE_polygon_set_specular_shining
STATE_group_set_specular_shining
STATE_polygon_set_diffuse
STATE_group_set_diffuse
7、阴影
(1)创建阴影用函数STATE_engine_create_dynamic_shadow或STATE_engine_create_ shadow。其函数用法为:
STATE_engine_create_shadow(EntityReceivingShadow, EntityCreatingShadow, LightSource, bytSerialNumber)
其中EntityReceivingShadow为阴影照射的面,如地面等;EntityCreatingShadow为制造阴影的对象,如桌椅等;LightSource为光源的位置;bytSerialNumber为一从10255的序列值。
2)删除阴影用函数STATE_engine_delete_dynamic_shadows或STATE_polygon_delete_patches( room_handle,  ALL_PATCHES)
(3)用法及说明,如下:
Dim obj1 As UIntPtr = STATE_object_get_object_using_name("doorr")
Dim m_BasePolygon As UIntPtr = STATE_polygon_get_handle_using_name("Gnd_face0")
Dim obj2 As UIntPtr = STATE_object_get_object_using_name("Gnd")
Dim lightnewloction(2) AsDouble
STATE_light_get_location(SceneLight, lightnewloction)
STATE_engine_delete_dynamic_shadows()
STATE_engine_create_dynamic_shadow(m_BasePolygon, obj1, lightnewloction, 255)
STATE_group_set_patches_color(obj2, 0, 0, 0, ALL_PATCHES)
其中m_BasePolygon为对象obj2上的面,即地面的顶面。0, 0, 0表示阴影的颜色。由于要时刻有阴影,所以该程序需放在Timer里面,而且在调用前,必须打开灯光,即STATE_light_activate(SceneLight, LIGHT_SET)。