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

本文介绍使用3DSTATEforVB.NET进行灯光和阴影的创建与控制方法,包括灯光源的创建、位置调整、类型设置以及材质属性的配置,并详细讲解了阴影的创建与删除过程。

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)。
<!--v:3.2-->

【EI复现】基于主从博弈的新型城镇配电系统产消者竞价策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于主从博弈理论的新型城镇配电系统中产消者竞价策略的研究,结合IEEE33节点系统,利用Matlab进行仿真代码实现。该研究聚焦于电力市场环境下产消者(既生产又消费电能的主体)之间的博弈行为建模,通过构建主从博弈模型优化竞价策略,提升配电系统运行效率与经济性。文中详细阐述了模型构建思路、优化算法设计及Matlab代码实现过程,旨在复现高水平期刊(EI收录)研究成果,适用于电力系统优化、能源互联网及需求响应等领域。; 适合人群:具备电力系统基础知识和一定Matlab编程能力的研究生、科研人员及从事能源系统优化工作的工程技术人员;尤其适合致力于电力市场博弈、分布式能源调度等方向的研究者。; 使用场景及目标:① 掌握主从博弈在电力系统产消者竞价中的建模方法;② 学习Matlab在电力系统优化仿真中的实际应用技巧;③ 复现EI级别论文成果,支撑学术研究或项目开发;④ 深入理解配电系统中分布式能源参与市场交易的决策机制。; 阅读建议:建议读者结合IEEE33节点标准系统数据,逐步调试Matlab代码,理解博弈模型的变量设置、目标函数构建与求解流程;同时可扩展研究不同市场机制或引入不确定性因素以增强模型实用性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值