3DVRI 网站地图
首页
新闻
下载
演示
资源
屏保
画廊
论坛
销售
关于
教程
3DVRI 新闻&更新
火热推出火星3DVRI虚拟现实内容创作系统1063版
推出最新的NeoBook的三维虚拟插件
第二版场景编辑器即将推出
3DVRI最新演示 [下载]

 

联系我们
3DVRI OSG浙江技术支持中心
0579-82100757
3DVRI 销售电话:
029-88217026
13319222637
联系人:谢先生
Email:webmaster@3dvri.com
友情链接

OpenSceneGraph网站

DELTA3D官方网站
OpenGL网站

 

 

 

3DVRI 教程

[3DVRI新闻]  [3DVRI软件介绍]  [3DVRI软件新特性]  [3DVRI技术介绍]  [3DVRI软件研发流程

 [3DVRI虚拟现实技术介绍]  [3DVRI行业应用]  [3DVRI SDK开发手册 ]   [教程]   [常见问题解答]

2006-07-16  
3DVRI虚拟场景的光源开关交互控制功能实现教程

      前不久,在论坛上我发了一个有关如何实现灯的开关问题的办法:

      http://bbs.hxsd.com.cn/post/view?bid=28&id=8147448&tpg=1&ppg=1&sty=1&age=30#8147448

      现在把制作过程及思路作详细说明。

      实现灯的开关需要做到:

      ● 光源的显示和隐藏
      ● 阴影光照效果的控制
      ● 按钮开关的运动效果动画

      光源的显示和隐藏

      对于光源的显示和隐藏,最好的方法就是控制光源内在的属性如亮度,衰减程度等等。然而这些在场景编辑器(操作栏-->修改-->灯光面板)中提供的功能目前还没有在Neobook插件中提供命令和方法。那么我们需要另辟蹊径了。就是通过使用移动光源的办法!当不需要光源的时候,可以把它移到地面以下等影响不到场景的地方!把光源移到地面以下很简单,把Z坐标加一个负号即可。

      从max中获得光源的位置坐标,看下图:

      我们要控制光源Omni01的开关,max场景中的Omni02是背景灯(试想如果没有Omni02的话,关掉了Omni01,世界将漆黑一片!)

      阴影光照效果的控制

      我们可以采用烘培贴图的方法表现光照效果,用来区分光源关闭的情况。其中一个简便办法是制作出有光照和无光照两套模型使用Switch来控制交替显示它们。

      无光照max截图:

      有光照max截图:

      按钮开关的运动效果动画。

      按钮关:

       按钮开:

      按钮开关的动画实现比较简单,在max中可以做一个按钮的旋转关键帧动画,那么只需控制播放开始时间和结束时间即可。

      在3DVRI for Neobook 插件中提供了命令:

      设置TRANSFORM物体的ANIMATEPATH的开始时间和结束时间 "Box03" "0" "0.5" "[Return_Var]"

       上面命令的意思是播放物体Box03的动画从0秒到0.5秒,0.5秒是动画帧数转换为时间的数值。

      显然播放动画从0秒到0.5秒是正向播放开灯按钮开关动画, 那么播放动画从0.5秒到0秒就是反向播放关灯按钮开关动画了。

      下面看一下详细的代码情况。

      1. 对于开关灯要有一个全局变量控制。

      在 书籍-->书籍属性-->动作-->启动 中可以看到变量声明。

      DefineVar "[Status]" "Integer" "" "Global" "0"

      2. 页面属性-->操作 的代码如下:

      初始化VR窗口 "Rectangle1" "[Return_Var]"
      装入VR场景 "[PubDir]102.ive" "[Return_Var]"
      设置当前视图为给出序号相机 "0" "[Return_Var]"
自由旋转相机显示VR场景 "[Return_Var]"

      .注释:在3DVRI 1083版本中,与以前版本不同的是:
      .注释漫游控制默认是关闭的,必须使用下面命令打开
      打开漫游 "[Return_Var]"

      .注释:场景载入之初,灯是开的
      取得给出名称需要进行后续操作的Transform节点的地址指针 "Omni01" "[FastOutputLongOne]" "[Return_Var]"
      设置给出地址指针的Transform节点的平移(Translate)信息 "[FastOutputLongOne]" "1.6" "-10" "163" "[Return_Var]"

      .注释:场景载入之初,灯是开的,所以要显示 烘培过有光照效果的物体
      设置给出名称switch开关物体指给出序号的单个子节点成开状态 "OSG_Switch01" "1" "[Return_Var]"

      .注释:设置灯的开关按钮物体的初始状态
      设置TRANSFORM物体的循环状态 "Box03" "0" "[Return_Var]"
      设置TRANSFORM物体播放状态 "Box03" "1" "[Return_Var]"

      .注释:开关按钮物体关联鼠标操作
      物体关联鼠标形状 "Box03" "6" "[Return_Var]"
      物体关联子程序 "Box03" "1" "SubBox03" "[Return_Var]"
      设置鼠标位置的物体的检测功能状态 "1" "[Return_Var]"

      3. 子程序SubBox03的代码:

      在 书籍-->书籍属性-->动作-->子程序 或者 书籍-->子程序-->SubBox03 中可以看到子程序SubBox03。
:SubBox03
      .注释:因为要控制灯光的位置,所以先取得光源Omni01的“地址“
      取得给出名称需要进行后续操作的Transform节点的地址指针 "Omni01" "[FastOutputLongOne]" "[Return_Var]"

      .注释:点击开关物体后,执行子程序到这里,就要设置按钮物体播放状态为开始播放
      设置TRANSFORM物体播放状态 "Box03" "0" "[Return_Var]"

       If "[Status]" "=" "1"
            .注释:实现按钮开灯操作。
            设置TRANSFORM物体的ANIMATEPATH的开始时间和结束时间 "Box03" "0.5" "0" "[Return_Var]"

            .注释:输入光源位置:在max中光源的合适位置
            设置给出地址指针的Transform节点的平移(Translate)信息 "[FastOutputLongOne]" "1.6" "-10" "163" "[Return_Var]"

            .注释:显示影子
            设置给出名称switch开关物体指给出序号的单个子节点成开状态 "OSG_Switch01" "1" "[Return_Var]"
            SetVar "[Notice]" "灯开了!"
            SetVar "[Status]" "0"

       Else
            .注释:实现按钮关灯操作。
            设置TRANSFORM物体的ANIMATEPATH的开始时间和结束时间 "Box03" "0" "0.5" "[Return_Var]"

            .注释:把光源移走,移到光线在场景中不起作用的地方,如地面以下
            设置给出地址指针的Transform节点的平移(Translate)信息 "[FastOutputLongOne]" "-1.6" "-10" "-100" "[Return_Var]"

            .注释:关掉影子
            设置给出名称switch开关物体指给出序号的单个子节点成开状态 "OSG_Switch01" "0" "[Return_Var]"
            SetVar "[Notice]" "灯关了!"

            SetVar "[Status]" "1"
      
EndIf
Return

      相关max文件,IVE文件和Neobook工程文件下载:
      完成。