CamSpace Beta3测试视频国内首发

CamSpace-any game, any webcam!

任何游戏,任何摄像头,都可以拿来应用CamSpace.有了它,你的计算机马上变成一个带Wii功能的游戏机.你只需拿个纸片,或者洗头膏的瓶子,或者钱包,或者一支笔,或者你的手指等等,都可以拿来做控制器.一切太美妙了.用俺们的话说这真TM的变态!!

昨晚我收到内侧邀请后立刻进行了试玩.真疯狂,真变态.哈哈.媳妇操作,我录了一段用CamSpace操作GoogleEarth的视频.大家可以感受一下,这样廉价的Wii,是多么的牛.

我同时上传了视频到youtube,如果有人要转帖,请用youtube的链接.
http://www.youtube.com/watch?v=9xoSS5QiyX4

这怎么天天下雨呢??白天像黑天.哦.我又困了…

树成长的声音–祭奠永远过去的"魔岩三杰"

先说一个事情,SourceForge.net被国内的网通网络华丽的和谐掉了.真可惜.唉,下载软件都下载不到了.总他妈的瞎和谐,不办点有用的事!

又新发现,Rapidshare.com也被和谐了.我真服了!!网通!!!

天气真热,热的发烧啊!屋里就一个破风扇,开着还算舒服点,谁赠送我一台空调?今天我网站群里一个朋友说他给四川捐款,都捐穷了,你猜捐了多少钱?他月薪3000元,他捐了近3万!!佩服么?我很服.希望这些钱能顺利的到灾民手中,千万别被别人半道给和谐鸟.

张楚

<树成长的声音>演唱会开完了,可惜在上海,要是在我附近,我肯定要去看的.太喜欢张楚的歌了.很透彻的歌,看到现在张楚的容貌,我就会很感伤,老了,我也会老,我很快就会老.谁都会老,老很可怕.
窦唯的脑袋真圆,不过他的歌越来越难懂了,这是几年后的开口唱歌,原来的音乐,我实在听不懂.
何勇呢,胖了很多.他爸爸更精神了.这次演唱会也去了.当然是给钟鼓楼伴奏三弦.
张楚呢.好像还是那个样子.只是多了皱纹.我是否盼望张楚的新歌.

网上流传着何勇的一句话:张楚死了,何勇疯了,窦唯成仙了!

  

14年后,那个辉煌疯狂顶癫的1994重返上海大舞台。

窦唯:八年沉寂后开嗓,他也最终回归了心中的“佛”,进入了文学王朔式的个人宗教时代,继续坚持自我,也愈发挑战大众。“忘了俗世纷争,也忘了所有责任”,像串起大片零碎梦境碎片的歌词,哪怕透出怎样的主张,他依然是众多后辈顶礼膜拜的神龛上的圣像。

    何勇:八千人大声呼唤着他的名字,一遍一遍,在他出台之前,在他离场之后,一遍又一遍。似乎在这名字之后,人们更想喊出曾经流逝岁月的激情回演。94年的何勇,08年的何勇,不忍去破坏长存在心中的完美影像,不忍在十四年后揭开他坎坷跌宕人生的伤疤。于是,在台上台下共融的尖叫、欢呼、激昂不再却沉稳有力的簇拥声中,这群人期待偶像不老,也幻想着年岁不会过去。无论这世界有没有希望从“垃圾场”中被拯救,希冀通过十四年后的呼喊,以此证明曾奋力努力的痕迹。

    张楚:他依旧面容枯瘦,除了忧郁又孤独的影子还留在身上,唱着“姐姐”的张楚依旧让人心疼。被批评为缺乏“创新”的他唱了很多新歌,却越发彷徨:该被怀旧,还是依从被否定创作?漂泊无根、悲天悯人的行吟诗人张楚,向时代妥协了,却用音乐的根善始善终。  

   “魔岩三杰”的复出是一出悲喜人生的尾曲。无论谁成仙,谁死了谁疯了,中国摇滚所承载的关于“成长”的精神枷锁,在快餐文化下的精神批判,让这颗种子在恶劣的生长环境下被给予了太多的压迫、纵容和一切极端的对待。在凌晨2点回杭州的火车上,我一遍遍回想舞台上的他们,现实中的我们,忽然想到金基德的“春去秋来又一春”,一切都会过去,这不过是场生命的轮回。

MySQL数据库某些字段只能读不能改修复记录

论坛数据库已经涨到了130M多,很庞大了,还好当初明智,在Access数据库涨到100M的时候更换了论坛程序和数据库,不然可要糟糕了.

刚刚将论坛程序升级到了Discuz!最新版本,发现一些老帖子中实现的Ubb代码很难看,看着不爽.于是,开始了MySQL模糊替换之旅,这个旅程走的不太顺利,不过还是胜利到达了终点.

用官方提供的Tools.php管理员工具进行帖子中的字符串替换,漫长的等待后,提示处理结果为0,上Dz官方询问,才知道不支持模糊替换.后来尝试自己写工具进行替换,因为不会写PHP,只能用易语言进行这个操作,Ubb代码不是固定的,用到了2个正则表达式.
[IMGS]images/yyface/([sS]*?).gif[/IMGS]
[EM([sS]*?)]

思路是把数据库的Posts表记录用计次循环的方法读出来,然后进行正则匹配替换,如有修改则更新回表的原有字段中.过了一会程序写完了,但在实际操作时候遇到了问题,遇到了大量更新失败的字段.紧接着数据库那个表就会损坏掉.很奇怪的问题.因为数据库的读写应用我做的不多,仔细检查我的程序代码后确定不是代码问题,想会不会因为易语言的mysql支持库有bug.呵呵.后将仔细检查失败的字段.在phpmyadmin和SQLyog Enterprise中都无法进行修改操作,可以读出字段,但无法修改.提示数据库有错误,尝试修复.

开始在网上寻找解决办法,用了很多修复的办法都没有效果,包括Mysql自带的myisamchk.exe都不行.并非所有字段都有问题,只是某一部分会这样.很奇怪的问题.屡试屡败,搞的我都要放弃了.后来终于想到了一个办法.也就是这个办法解决了问题.此次人物终于完成.

用Phpmyadmin将需要修改的表导出为*.sql.用文本编辑器去编辑这个sql文件,修改自己不想要的部分.我用正则替换掉了我不需要的ubb代码.保存文件时候注意文件编码,否则会乱码.因为我的数据库比较大,这一个sql文件就有40多M,所以没办法用Phpmyadmin导入回去.起初用SQLyog Enterprise导出来的备份进行修改,然后用SQLyog Enterprise导入也不行,SQLyog Enterprise会假死.用Phpmyadmin导出sql文件,修改后用SQLyog Enterprise导入,就没问题了,看到数据一点点的被导入,心情愉悦啊.进行了更新记录测试,字段也没问题了.高兴啊.

恢复更新数据库到论坛,结束.今天还是阴天,不时的下着雨,不过有阳光的时候下着雨,在下面淋感觉很爽哦.

没落儿

上个月21号,去面试,无果,估计是俺水平太菜了.呜呼.

找工作中,有这方面资源的朋友帮忙啊.

回来和媳妇说去东家混饭,于是打电话,乘了2个多小时公交去蹭饭.嘿嘿.媳妇在车上坐着,我站在旁边,朦胧中听到后门出叫嚷,眼看一个女的回身扇向一个男的,男的随之蹲下捡眼镜,女的开始喊:耍什么流氓!!你说,你耍什么流氓,你以为我不知道啊….N句后车到了一站地,开门,男人灰溜溜下车,一句话没说.下车后向车后走去,方向选择还是瞒准确的.接着就听这女的靠在后车门口那根柱子那哭哭咧咧的说,我从来没扇过男人嘴巴子,这是第一次,除了我老公外也没其他男人碰过我,如此之类的…过了几站地,这女的下车,我得以看清这个女的装扮和容貌.

挺丑,第一感觉.老长的裙子几乎拖到脚踝,有点瘸.我很奇怪.那男的咋非礼这样地腻,应该不是被诬陷,因为那男的没回应任何语言.

后来我说,这男的有毛病,这女的,也不正常.2008,人也都不正常了,我说说而已.

到了东东他家,东东和他媳妇领我们去吃烤翅,去的是管记烤翅,真不错.4个人消灭掉40多串烤翅,哦耶.我的战斗力总是让他们出乎意料.哇咔咔.

吃完外面就下雨了,去东东家避了会雨,看了看游戏摇杆,那玩意看起来咋那么像小孩玩具呢,不了解的看一个人拿那玩意玩游戏,还挺幼稚的呢.哈哈.这段掐了,别看.

雨小了点我和媳妇就出来了,去找城铁,坐车到一个地铁站旁,四处观望一下,没看到,同时下车的还有一个美女,也在四处望,我一猜也是和我们一样找不到城铁的,我媳妇上前去问她地铁在哪,我说她也在找吧,不过那美女说她经常在这边做城铁,只是今天这个车站不是她坐的那站,所以一时转向了,说跟她走吧,应该就在前方.走了一段路,果然看到城铁入口.呵呵.谢谢美女.

我看到地铁IC卡背面换图案了,换成地铁路线图了.挺好.

路上,迎面走来两个女人,一个女的签名是两只小狗,拽着这个女人走,那狗挺可爱,像长江七号似的,我随口说”咦,这狗像长江七号!!”,所有人都哈哈大笑.我晕.

晚上回来下载了Bigworld1.9中文试用版,1G多,安装后,说实话挺失望的,资源占用还是那么大,CPU风扇狂转,好像地面的贴图绘制提高了精度,其他呢,我看没什么变化,我想称之为1.8汉化版不足为过.哇哦.

闲来无事,弄了一下自己的网站,做了页面,很吃力,很感慨,我学做网页的时候,流行ASP,等我能凑活改ASP了吧,现在又流行PHP了,做网页,原本用Homepage做,我觉得最好的就是那个用笔画表格,后来也投奔了Dreamweaver,吃力的学会了表格做网页吧,现在又开始流行DIV+CSS了,不用表格了.变化真快.

经常在百度和谷歌上搜索虚拟现实之类的东西,很容易就被链接到86vr上,不小心就会这样,看到网址跳转后就狂按ESC,看着硬盘灯狂闪,那个心疼啊,心里默默咒骂86vr的收购者N遍,挺好的一个网站,被别人收购后,没落了.天天有马,真够可以的.悲哀.

外面又下雨了,很大的雨点,挺砸脑袋的.

javascript控制vrml场景:一个简单的三维动画

做了一个sun-earth-moon的动画.感觉效果不错.

没用vrml中的插值器.”vrml1.htm”中的javascript以setInterval()函数发出时钟信号,根据椭圆方程计算earth,moon的坐标后用setNodeEventIn()发送到wrl文件”vrml1.wrl”,用以设置earth和moon的translation域值.

计数变量i必须是全局变量.    

接口函数很简单,在VB 里也可以用.    

objectName.setNodeEventIn(String nodeName,String eventInName,String value);

javascript比想象的快多了。50帧/s也运行得很平稳。

这个动画需要安装bs Contact 6.2插件,然后在IE中观看.

/**********************************

vrml1.wrl:用matlab vr toolbox做的。

*********************************/

#VRML V2.0 utf8

#Created with V-Realm Builder v2.0
#Integrated Data Systems Inc.
#www.ids-net.com

DEF vp Viewpoint {
position 0 0 150
description "see"
}
DEF sun Transform{
translation 0 0 0
children Shape {
    appearance Appearance {
     material DEF Red_Plastic Material {
      ambientIntensity 0.1
      diffuseColor 1 0.0408163 0.0408163
      shininess 1
      specularColor 0.984314 0.984314 0.984314
     }

    }

    geometry DEF sunsph Sphere {
     radius 15
    }

}
}
DEF earth Transform {
translation 100.00 0 0
children Shape {
    appearance Appearance {
     material DEF orange_Plastic Material {
      ambientIntensity 0.1
      diffuseColor 0.9 0.55237 0.00733938
      specularColor 1 1 1
     }

    }

    geometry Sphere {
     radius 6
    }

}
}

DEF moon Transform {
translation 120.00 0 0
children Shape {
    appearance Appearance {
     material USE orange_Plastic
  

    }

    geometry Sphere {
     radius 2
    }

}
}

    DEF Axies Group {
children Transform {
    translation 0 0 0
    children [
        DEF xAxie Shape {
         appearance Appearance {
          material Material {
           diffuseColor 0 0 1
          }

         }

         geometry DEF lineX IndexedLineSet {
          coord DEF coord1 Coordinate {
           point [ -100 0 0,
               100 0 0,
               0 -100 0,
               0 100 0,
               0 0 -100,
               0 0 100 ]
          }

          coordIndex [ 0, 1, -1, 2, 3, -1, 4, 5,
              -1 ]
         }

        }

        DEF oPoint Shape {
         appearance Appearance {
          material Material {
           diffuseColor 1 0 0
          }

         }

         geometry Text {
          string "O"
          fontStyle DEF myFontStyle FontStyle {
           size 10
           style ""
          }

         }

        }

        Transform {
         translation 100 0 0
         children Shape {
          appearance Appearance {
           material Material {
            diffuseColor 1 1 0
           }

          }

          geometry Text {
           string "X"
           fontStyle USE myFontStyle
          }

         }
        }

        Transform {
         translation 0 100 0
         children Shape {
          appearance Appearance {
           material Material {
            diffuseColor 1 1 0
           }

          }

          geometry Text {
           string "Y"
           fontStyle USE myFontStyle
          }

         }
        }

        Transform {
         translation 0 0 100
         children Shape {
          appearance Appearance {
           material Material {
            diffuseColor 1 1 0
           }

          }

          geometry Text {
           string "Z"
           fontStyle USE myFontStyle
          }

         }
        }
    ]
}
}

vrml1.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>move vrml</title>
<script>
        //CC3D.setNodeEventIn(String nodeName,String eventInName,String value);
           var i=0;
           var trans,x,z;
           var y=0;
           var num=600;
           var x1,y1,z1;
            /*      
           function test(){
              //var time=new Date();
              //var sec=time.getSeconds()+"";
              document.getElementById("disp").value=n;
              n=n+1;
           }
        */
           function setTrans(){
           x=100*Math.cos(2*Math.PI*i/num);
           z=60*Math.sin(2*Math.PI*i/num);
           trans=""+x+" "+y+" "+z+"";
           document.CC3D.setNodeEventIn("earth", "translation", trans);
        
           x1=60*Math.cos(2*Math.PI*i/num*5);
           y1=12*Math.sin(2*Math.PI*i/num*5);        
           x1=x+x1;
           y1=y+y1;
           z1=z;
           trans=""+x1+" "+y1+" "+z1+"";
           document.CC3D.setNodeEventIn("moon", "translation", trans);
           //document.CC3D.setNodeEventIn("vp", "position", "0 0 "+(i+50));
        
        
           i=i+1;
      }
            
        function move(){
             setInterval("setTrans();",20);
        }
</script>
</head>

<body>
<CENTER>
<OBJECT CLASSID="CLSID:4B6E3013-6E45-11D0-9309-0020AFE05CC8" NAME=CC3D ID=CC3D WIDTH=100% HEIGHT=90%>
<PARAM NAME="SRC" VALUE="vrml1.wrl">
<EMBED name=CC3D SRC="vrml1.wrl" TYPE="application/x-cc3d"
WIDTH=100% HEIGHT=90%>
</OBJECT>
</CENTER>

<input type=button id="move" value="move" onclick="move();">
<input    id="disp" value="disp">
</body>
</html>

cortona的html-javascript的外部编程接口

Cortona还是Contact,真是个问题。BS Contact提供的javascript接口是以传递字符串的方式工作的,简单而有弹性。不过处理字符串是个脏活儿。

            而Cortona Automation provides full control over the VRML scene,everything is described in Cortona SDK.不过好像没人有cortona sdk完整版,价格是:$749.95 USD,都没银子啊。演示版是用来吊人胃口的,信息量太少。搜了一遍又一遍,所得点滴信息整理如下:

在html中嵌入cortona 浏览器

<OBJECT name=”objectName” id=”objectName” CLASSID=”CLSID:86A88967-7A20-11d2-8EDA-00600818EDB1″ CODEBASE=”http://www.parallelgraphics.com/bin/cortvrml.cab#Version=4,2,0,93″ WIDTH=”400″ HEIGHT=”300″>
<param name=”src” value=”your_wrl_file.wrl”>
<param name=”VRML_DASHBOARD” value=”TRUE”>
<param name=”WaitForAllResources” value=”TRUE”>
<param name=”ContextMenu” value=”TRUE”>
<param name=”RendererHints” value=”32″>
<param name=”RendererName” value=”DirectX Renderer”>
              <param name=”LoadDroppedScene” value=”FALSE”>
<param name=”HeadLight” value=”FALSE”>
</object>

从html-javascript访问vrml场景

 1 浏览器对象句柄:objectName.Engine

           2            访问SFFloat:

   objectName.Engine.Nodes(“your_script_node”).Fields(“your_eventIn_field_name”) = someValue;

        e.g:
       objectName.Engine.Nodes(‘nodeName’).Fields(“radius”)=12;

       objectName.Engine.Nodes.Item(‘node’).Fields.Item(‘set_bind’).Value = true;

           3            访问SFVec3f:

                    objectName.Engine.Nodes(‘nodeName’).Fields(‘fieldName’).x

                    objectName.Engine.Nodes(‘nodeName’).Fields(‘fieldName’).y

                    objectName.Engine.Nodes(‘nodeName’).Fields(‘fieldName’).z

         4  访问SFColor

     objectName.Engine.Nodes(‘nodeName’).Fields(‘fieldName’).Red

                  objectName.Engine.Nodes(‘nodeName’).Fields(‘fieldName’).Green

                  objectName.Engine.Nodes(‘nodeName’).Fields(‘fieldName’).Blue

           6            往复值域里添加单值

                 objectName.Engine.Nodes(‘nodeName’).Fields(‘fieldName’).Add(some_SFValue);

           7    渲染器: objectName.RendererName

                   ‘OpenGL Renderer’ 或 ‘DirectX Renderer’

           8           根节点集合:

                  objectName.Engine.RootNodes

                  objectName.Engine.RootNodes(1).Fields(“rotation”).angle=3.14;

          9           根节点集合的Add方法:

                objectName.Engine.RootNodes.Add(objectName.Engine.CreateVrmlFromString(“Transform {translation 0 10 5 children[Shape {geometry Box {}}]}”));

               或:  

               newrootnode = objectName.Engine.CreateNodeFromString(“…”);

               objectName.Engine.RootNodes.Add(newrootnode);

10 这个在VB里可用,javascript里就不知道了。

                myfield = engine.CreateField(“SFNode”)
                testnode = engine.Nodes.Item(“test”)
                myfield.value = testnode

11         访问SFOrientation

               objectName.Engine.Nodes(‘nodeName’).Fields(‘orientation’).x=0;
               objectName.Engine.Nodes(‘nodeName’).Fields(‘orientation’).y=1;
               objectName.Engine.Nodes(‘nodeName’).Fields(‘orientation’).z=0;
               objectName.Engine.Nodes(‘nodeName’).Fields(‘orientation’).angle=1.57;

12 访问复值:

             objectName.Engine.Nodes(“myOrientationInterpolator”).Fields(“keyValue”).Y(0);

  javascript 响应事件

             <script for=”objectName” event=”OnSceneLoaded(Success)” language=”JavaScript”>

             </script>
            <script for=”objectName” event=”OnSceneUnLoaded()” language=”JavaScript”>
                   objectName.renderer.name
                   objectName.renderer.isReady
                   objectName.renderer.path
                   objectName.renderer.version

            </script>

            Advise works in the following way: you must create a javascript function with three parameters and then call Advise on any exposedField or eventOut with this function. When an event is generated, cortona calls this function, passing the event value, current timestamp and the hint value specified on the Advise call.

<script for=”objectName” event=”OnSceneLoaded(bSuccess)” language=”javascript”>
            if(bSuccess)
            objectName.Engine.Nodes(“MyTransform”).Fields(“translation”).Advise(myHandler,’my transform’);
            function myHandler(value,hint,timestamp){
            if(hint==’my transform’) …

</script>

           First you must create a javascript function in the HTML page and call Advise() for some eventOut or exposedField in the VRML scene, setting this function as the event handler:

           objectName1.Engine.Nodes(“SomeNodeName”).Fields(“someEventOut”).Advise(someFunc
tion,””);

           When the event is fired, it runs this function, which can change something in the other Cortona control:

           function someFunction(value,hint,timestamp){

                 objectName2.Engine.Nodes(“SomeNodeName”).Fields(“someEventIn”).Value=value.Value;
           }

           Engine.nodes,Engine.rootNodes还有fields(“fieldName”)显然有不少方法,哪里去找呢?

JAVAScript-EAI

BlaxxunContact(3.07以上版本)为JavaScript和VBScript提供一种应用起来非常简单的外部脚本接口,它允许你从已经命名的节点当中读写任意一个域值。以字符串形式输入的值被自动的转换成适当的类型。并且,VBScript(in Internet Explorer)与 JavaScript(in Netscape)的方法能够被VRML Script内部的Script节点调用。

浏览器句柄(

JS调用支持
以下是可用于通过JavaScript访问的blaxxun3D接口
setNodeEventIn
(String nodeName,
String eventInName,
String value) 设置已命名的节点的指定事件入口值,其value会自动转换成该事件入口的类型
getNodeEventOut
(String nodeName,
String eventOutName) 返回一个事件出口的值,并把该值转换成字符串格式
OnNextViewpoint( )
(仅用于IE浏览器!) 激活视点堆栈当中的下一个视点
setNextViewpoint( )
(仅用于Netscape浏览器!) 与上面的函数功能相同,但是只能用于Netscape浏览器

在VRML当中访问
可以在VRML文件当中访问HTML当中任何一个JavaScript函数。把下面的这个调用方法应用于Anchor节点,或者用Script节点当中的Browser . loadURL方法来指定相应的函数方法。

“javascript:myJSFunction();”

如果指定的方法是定义在一个HTML文档的其他框架当中,则目标必须用Anchor节点的parameters域或者在Browser . loadURL方法的第二个参数。请参考以下例子:

Example 1: Calling a JS-Function by an Anchor
DEF anchor1 Anchor{  JavaScript
url”javascript:externalFunction();”
parameter[“target=_self”]  
children[ #some geometry   ]
}
Example 2: Calling a JS-Function from a Script
Script{  
field MFString param [“target=someFrame”, “”]  
eventIn SFTime touch  
url”vrmlscript:  
function touch()  
{
       Browser.loadURL(‘javascript:externalFunction()’, param);  
}  

}

为了能够影响3D场景,你需要获得一个VRML浏览器的句柄。可以利用定义在embed标签当中的名称来访问插件,各自的ID定义在Objedt标签内。这些参量的详细资料请参考”Embedding blaxxunContact”

blaxxun Contact 3D (release 3.07 or higher) supports an easy-to-use external scripting interface for Javascript and VBScript. It allows to read and write any fields values of named nodes. String input values are converted automatically to the appropriate field types. Additionally VBScript (in Internet Explorer) and Javascript (in Netscape) methods can be called from internal VRMLScript script nodes.

General syntax

void Browser.setNodeEventIn( String nodeName, String eventInName, String value)

set the value for the specified eventIn converting value to the type of the eventIn
String Browser.getNodeEventOut( String nodeName, String eventOutName)
returns the value of the eventOut converted to a string
callback from internal script nodes:
Netscape Javascript: OnEvent ( String, par1, String par2, String timestamp )
Internet Explorer VBscript: <Contact3D_ID>_OnEvent ( String, par1, String par2, String timestamp )
the method OnEvent can be called from VRMLScript using the Browser.loadURL() method with 2 parameters (see example)
HTML Page contents for using the Script EAI with Microsoft and Netscape Browsers

1. Embed the VRML browser and give it a name:

<OBJECT CLASSID=”CLSID:4B6E3013-6E45-11D0-9309-0020AFE05CC8″ ID= CC3D WIDTH=100% HEIGHT=50%>

<PARAM NAME=”SRC” VALUE=”sample.wrl”>

<EMBED name= CC3D SRC=”sample.wrl” TYPE= “application/x-cc3d” WIDTH=100% HEIGHT=50%>

</OBJECT>

2. Sending an event to VRML from JavaScript:

You can send events to VRML from JavaScript using setNodeEventIn, as
shown below.    It requires, as parameters, the VRML target node, the field
that will be changed, and the value that will be sent.    The parameters can
be set as strings, and will be automatically converted to the correct
type.

function sendEvent(node, field, value)
{
document.Contact 3D.setNodeEventIn(node, field, value)
}

In the example the sendText function, shown below, uses sendEvent to send
an event to the ChangeString node in the VRML, and will change the
field set_string for that node using value.

function sendText(value)
{
sendEvent(‘ChangeString’, ‘set_string’, value);
}
3. Calling JavaScript from VRML:
Here when the touchTime event occurs, set_string is called in the
script node.    The Script method OnEvent() will be called with the specified parameters.
Of course par1 and par2 can be replaced at runtime by actual parameters.

    DEF RotationScript Script {
        field MFString newurl [ “OnEvent( par1, par2 )” ]
        field MFString param [ “” “” ]
        eventIn    SFTime       clicked
        eventIn    SFTime     set_string
        eventOut SFRotation rotation_changed
        url “vrmlscript:
            function clicked (value, time) {
              angle = Math.random()*6.283;
              rotation_changed = new SFRotation(0,1,0,angle);
            }
            function set_string (value, time) {
              Browser.loadURL(newurl,param);
            }
        “
    }

ROUTE RotSensor.touchTime TO RotationScript.set_string
and the HTML definition:
<SCRIPT language=Javascript>
function OnEvent(par1, par2, time)
{ document.sform.sfield.value = par1 + par2 + time; }
</SCRIPT>
4. Use VBScript to activate the OnEvent method with Internet Explorer:
Internet Explorer doesn’t allow to call Javascript directly from a C program. Therefore VBScript has to be used to pass the call to Javascript. The name of the sub is <objectid>_OnEvent.

<scriptlanguage=
VBScript>
<!–    sub CC3D_OnEvent(par1, par2, time)
OnEvent par1, par2, time
end sub
!–>
</script>
Examples

Please check the blaxxun Client SDK.

VRML动画编程的基础知识

1. Transform节点

作用:
建立局部坐标系,对形体进行坐标变换,从而使形体发生移动、旋转、比例变化

常用的字段:

rotation 提供旋转的角度
(四个数字,头三个数和原点构造旋转轴,第四个数给出旋转角度,右手逆时针为正方向)
scale 提供比例放大的系数
translation 提供平移的数值

children 提供坐标变换的对象,可以是形体或另一个局部坐标系

利用Transform的translation字段,书中的EX2_01.WRL经过下面的简单变化,使形体由中间移到左边

#VRML V2.0 utf8
Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}
Background{skyColor 1 1 1}
#程序结束
2. Group节点作用: 无坐标变换功能的Transform节点,因而可以用Transform替代
常用的字段:

children 提供Group的组成部分
3. DEF和USE 作用: 用于给节点语句命名,从而重复使用,DEF和USE缩短程序的好方法
4. Anchor节点作用: 使多个VRML产生链接

常用的字段:

url 提供链接的文件名
description 提供链接文件的说明

parameter 提供链接的方式(开新窗口或覆盖旧的)

children 产生链接的载体(鼠标应点击的对象)

5. Billboard节点作用: 产生广告牌效果
常用的字段:

axisOfRotation 旋转轴,(三个常用的数值:0 1 0、1 0 0、0 0 0)
children (产生广告牌效应的形体或文字)

6. Viewpoint节点作用: 确定观察位置
常用的字段:

orientation 提供观察角度
position 提供观察位置

7. Background节点作用: 设置显示背景,也可以在背景上设置图片,最多可贴六张图片
常用的字段:

skyColor 设置背景为白色

8. Fog节点
作用:使形体产生雾化效果

常用字段:

color 设置雾的颜色
visibilityRange 给出雾的影响范围
(当形体离观察点的距离大于此值时,形体的颜色与雾相同)

9. NavigationInfo节点作用: 设定程序运行方式,主要有:ANY、WALK、EXAMINE、FLY、NONE

二. VRML动画编程初步 1. 问题:如何使一个立方体动起来?

步骤1: 编写一个立方体,设定背景为白色,程序通过Transform节点,改变了形体的原始位置

#VRML V2.0 utf8
Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}
Background{skyColor 1 1 1}
#程序结束
步骤2: 定义一个时间周期TS,用的是一个时间传感器节点TimeSensor
里面给出周期数值字段cycleInterval,通过loop字段指定是否循环

#VRML V2.0 utf8
Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}

#下面四行是增加的部分
DEF TS TimeSensor {
cycleInterval 10
loop TRUE
}

Background{skyColor 1 1 1}

步骤3: 利用PositionInterpolator节点,定义形体的运动轨迹,用DEF命名为PI
意思是在十秒钟内,形体由(-5 0 0)移到(5 0 0),再回到(-5 0 0)

#VRML V2.0 utf8
Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}

DEF TS TimeSensor {
cycleInterval 10
loop TRUE
}

#下面四行是增加的内容
DEF PI PositionInterpolator {
key [0 0.5 1]
keyValue [-5 0 0 , 5 0 0]
}

Background{skyColor 1 1 1}

步骤4: 利用DEF给立方体所在的局部坐标系命名为T

#VRML V2.0 utf8
#下面一行是改变的内容,只加了头几个字符
DEF T Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}

DEF TS TimeSensor {
cycleInterval 10
loop TRUE
}

DEF PI PositionInterpolator {
key [0 0.5 1]
keyValue [-5 0 0 , 5 0 0]
}

Background{skyColor 1 1 1}

步骤5: 通过两条ROUTE语句,使形体动起来

ROUTE TS.fraction_changed TO PI.set_fraction
(时间的变化传到位置内插器)
ROUTE PI.value_changed TO T.translation
(位置内插器将特定时间的位置数值传给形体所在的局部坐标系)

下面是最终的程序:

#VRML V2.0 utf8
DEF T Transform{
translation -5 0 0
children Shape{
geometry Box{}
appearance Appearance{material Material{diffuseColor 1 0 0}}
}
}

DEF TS TimeSensor {
cycleInterval 10
loop TRUE
}

DEF PI PositionInterpolator {
key [0 0.5 1]
keyValue [-5 0 0 , 5 0 0 -5 0 0]
}

#下面两行是增加的内容
ROUTE TS.fraction_changed TO PI.set_fraction
ROUTE PI.value_changed TO T.translation

Background{skyColor 1 1 1}

点击这里可运行上面的程序(ex2_02.wrl)

点击这里可阅读上面的程序(ex2_02.wrl)
2. 路由语句(P40)作用: VRML动画及交互作用的桥梁

内容: ROUTE 事件出 TO 事件进

编写步骤:

对于发出事件的传感器节点(如TimeSensor)和接收事件的节点
(如内插器节点),编写具体的内容,并用DEF命名
对于接收事件的其它节点(如定义局部坐标系的TransformGroup)
也用DEF命名,并根据具体需要,将收到的事件进传给具体参数,
从而产生动画效果

注意1:同一行ROUTE语句的事件进(eventIn)和事件出(eventOut)的类型必须相同

注意2:上面介绍的两个ROUTE语句:

ROUTE TS.fraction_changed TO PI.set_fraction
ROUTE PI.value_changed TO T.translation
也可以写成:
ROUTE TS.fraction_changed TO PI.set_fraction
ROUTE PI.value_changed TO T.translation

也就是说:_changed (用于事件出)、set_ (用于事件进)可写可不写,不影响程序的运行
三. 用于VRML动画编程的内插器节点语句

用于VRML动画编程的内插器节点名称最后均为Interpolator
1. 利用ColorInterpolator产生颜色的动态变化

步骤1: 给需要变化颜色的形体材值Material命名

… DEF COLORA Material{diffuseColor 1 0 0} …

步骤2: 定义一个TimeSensor,确定变化周期及循环方式

DEF TS TimeSensor{…}

步骤3: 定义一个ColorInterpolator节点,给出颜色变化的具体方式

DEF CI ColorInterpolator {
key [ ….]
keyValue [ ….]
}

步骤4: 给出两个ROUTE语句:

一个将TimeSensor的变化传给ColorInterpolator
一个将ColorInterpolator的变化传给Material

点击这里可运行书中P54页的EX6_01.WRL(一个不断改变颜色的圆柱)

点击这里可阅读书中P54页的EX6_01.WL(一个不断改变颜色的圆柱)
2. 利用CoordinateInterpolator使形体产生动态变形 作用:可用来动态改变形体的坐标,主要用在下面节点上:

IndexedFaceSet、IndexedLineSet、PointSet、Extrusion

步骤1: 给一个Coordinate节点命名,作为相应形体coord字段的具体内容

… DEF AAA Coordinate{point […]} …

步骤2: 定义一个TimeSensor,确定变化周期及循环方式

DEF TS TimeSensor{…}

步骤3: 定义一个CoordinateInterpolator节点,给出坐标变化的具体方式

DEF CI CoordinateInterpolator {
key [ ….]
keyValue [ ….]
}

步骤4: 给出两个ROUTE语句:

一个将TimeSensor的变化传给CoordinateInterpolator
一个将CoordinateInterpolator的变化传给Coordinate

点击这里可运行书中P55页的EX6_02.WRL(不断变形的长方体)
点击这里可阅读书中P55页的EX6_02.WRL(不断变形的长方体)

点击这里可运行书中P55页的EX6_03.WRL(可变形的拉伸体,需要点击一下)

点击这里可阅读书中P55页的EX6_03.WRL(可变形的拉伸体,需要点击一下)

点击这里可运行书中P54页的EX6_04.WRL(跳动着的点和线)

点击这里可阅读书中P54页的EX6_04.WRL(跳动着的点和线)

3. 利用OrientationInterpolator动态改变观察方向,或这改变形体的方向

作用: 可用来动态改变Viewpoint节点的方向(ex5_02.wrl)
或用来动态改变形体的方向,使形体旋转(ex6_05.wrl)

步骤1: 给需要变化方向的Viewpoint节点命名,或者给需要旋转形体所在的Transform节点命名

DEF AAA Transform{…}
DEF AAA Viewpoint{…}

步骤2: 定义一个TimeSensor,确定变化周期及循环方式

DEF TS TimeSensor{…}

步骤3: 定义一个OrientationInterpolator节点,给出变化的具体方式

DEF OI orientationInterpolator {
key [ ….]
keyValue [ ….]
}

步骤4: 给出两个ROUTE语句:

一个将TimeSensor的变化传给OrientationInterpolator
一个将OrientationInterpolator的变化传给Transform或Viewpoint

点击这里可运行书中P44页的EX5_02.WRL(不断移动的圆柱)

点击这里可阅读书中P44页的EX5_02.WRL(不断移动的圆柱)

点击这里可运行书中P58页的EX6_05.WRL(三个转动形体)

点击这里可阅读书中P58页的EX6_05.WRL(三个转动形体)

4. 利用PositionInterpolator动态改变观察位置,或这改变形体的位置

作用:

可用来动态改变Viewpoint节点的位置(ex5_01.wrl)
或用来动态改变形体的位置,使形体动态移动(ex6_07.wrl)

怪异使用:可用来改变形体所在局部坐标系的scale字段(ex6_06)

步骤1:

给需要变化方向的Viewpoint节点命名
或者给需要动态移动形体所在的Transform节点命名

DEF AAA Transform{…}
DEF AAA Viewpoint{…}

步骤2: 定义一个TimeSensor,确定变化周期及循环方式

DEF TS TimeSensor{…}

步骤3: 定义一个PositionInterpolator节点,给出变化的具体方式

DEF PI PositionInterpolator {
key [ ….]
keyValue [ ….]
}

步骤4: 给出两个ROUTE语句:

一个将TimeSensor的变化传给PositionInterpolator
一个将PositionInterpolator的变化传给Transform或Viewpoint

5. 利用ScalarInterpolator动态改变透明程度、雾的影响范围

作用:

可用来动态改变Material节点的transparency字段,从而改变形体的透明效果(ex6_08.wrl)
或用来动态改变Fog节点visibilityRange字段,从而雾的影像范围(ex6_10.wrl)

步骤1: 给Material或Fog节点命名,Material通常是Appearance节点material字段的具体内容
DEF MMM Material{…}
DEF FFF Fog{…}

步骤2: 定义一个TimeSensor,确定变化周期及循环方式

DEF TS TimeSensor{…}

步骤3: 定义一个ScalarInterpolator节点,给出变化的具体方式

DEF SI ScalarInterpolator {
key [ ….]
keyValue [ ….]
}

步骤4:
给出两个ROUTE语句:

一个将TimeSensor的变化传给ScalarInterpolator
一个将ScalarInterpolator的变化传给Material的transparency字段,或Fog的visibilityRange字段