{"id":349,"date":"2008-07-04T18:11:37","date_gmt":"2008-07-04T18:11:37","guid":{"rendered":""},"modified":"2013-02-27T12:23:06","modified_gmt":"2013-02-27T04:23:06","slug":"349","status":"publish","type":"post","link":"https:\/\/1vr.cn\/?p=349","title":{"rendered":"cortona\u7684html-javascript\u7684\u5916\u90e8\u7f16\u7a0b\u63a5\u53e3"},"content":{"rendered":"<p>Cortona\u8fd8\u662fContact,\u771f\u662f\u4e2a\u95ee\u9898\u3002BS Contact\u63d0\u4f9b\u7684javascript\u63a5\u53e3\u662f\u4ee5\u4f20\u9012\u5b57\u7b26\u4e32\u7684\u65b9\u5f0f\u5de5\u4f5c\u7684\uff0c\u7b80\u5355\u800c\u6709\u5f39\u6027\u3002\u4e0d\u8fc7\u5904\u7406\u5b57\u7b26\u4e32\u662f\u4e2a\u810f\u6d3b\u513f\u3002<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u800cCortona Automation provides full control over the VRML scene,everything is described in Cortona SDK.\u4e0d\u8fc7\u597d\u50cf\u6ca1\u4eba\u6709cortona sdk\u5b8c\u6574\u7248,\u4ef7\u683c\u662f:$749.95 USD,\u90fd\u6ca1\u94f6\u5b50\u554a\u3002\u6f14\u793a\u7248\u662f\u7528\u6765\u540a\u4eba\u80c3\u53e3\u7684\uff0c\u4fe1\u606f\u91cf\u592a\u5c11\u3002\u641c\u4e86\u4e00\u904d\u53c8\u4e00\u904d\uff0c\u6240\u5f97\u70b9\u6ef4\u4fe1\u606f\u6574\u7406\u5982\u4e0b\uff1a<\/p>\n<p>\u5728html\u4e2d\u5d4c\u5165cortona \u6d4f\u89c8\u5668<\/p>\n<p>&lt;OBJECT name=&#8221;objectName&#8221; id=&#8221;objectName&#8221; CLASSID=&#8221;CLSID:86A88967-7A20-11d2-8EDA-00600818EDB1&#8243; CODEBASE=&#8221;<a href=\"http:\/\/www.parallelgraphics.com\/bin\/cortvrml.cab\" target=\"_blank\" rel=\"external\">http:\/\/www.parallelgraphics.com\/bin\/cortvrml.cab<\/a>#Version=4,2,0,93&#8243; WIDTH=&#8221;400&#8243; HEIGHT=&#8221;300&#8243;&gt; <br \/>&lt;param name=&#8221;src&#8221; value=&#8221;your_wrl_file.wrl&#8221;&gt; <br \/>&lt;param name=&#8221;VRML_DASHBOARD&#8221; value=&#8221;TRUE&#8221;&gt; <br \/>&lt;param name=&#8221;WaitForAllResources&#8221; value=&#8221;TRUE&#8221;&gt; <br \/>&lt;param name=&#8221;ContextMenu&#8221; value=&#8221;TRUE&#8221;&gt; <br \/>&lt;param name=&#8221;RendererHints&#8221; value=&#8221;32&#8243;&gt; <br \/>&lt;param name=&#8221;RendererName&#8221; value=&#8221;DirectX Renderer&#8221;&gt; <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name=&#8221;LoadDroppedScene&#8221; value=&#8221;FALSE&#8221;&gt; <br \/>&lt;param name=&#8221;HeadLight&#8221; value=&#8221;FALSE&#8221;&gt; <br \/>&lt;\/object&gt; <\/p>\n<p>\u4ecehtml-javascript\u8bbf\u95eevrml\u573a\u666f<\/p>\n<p>\u3000\uff11\u3000\u6d4f\u89c8\u5668\u5bf9\u8c61\u53e5\u67c4\uff1aobjectName.Engine<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u8bbf\u95eeSFFloat:<\/p>\n<p>\u3000\u3000\u3000objectName.Engine.Nodes(&#8220;your_script_node&#8221;).Fields(&#8220;your_eventIn_field_name&#8221;) = someValue;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.g:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8220;radius&#8221;)=12\uff1b<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.Engine.Nodes.Item(&#8216;node&#8217;).Fields.Item(&#8216;set_bind&#8217;).Value = true;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u8bbf\u95eeSFVec3f:<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8216;fieldName&#8217;).x<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8216;fieldName&#8217;).y<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8216;fieldName&#8217;).z<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;\u8bbf\u95eeSFColor<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8216;fieldName&#8217;).Red<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8216;fieldName&#8217;).Green<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8216;fieldName&#8217;).Blue<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u5f80\u590d\u503c\u57df\u91cc\u6dfb\u52a0\u5355\u503c<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8216;fieldName&#8217;).Add(some_SFValue);<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;\u6e32\u67d3\u5668: objectName.RendererName<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8216;OpenGL Renderer&#8217; \u6216 &#8216;DirectX Renderer&#8217; <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u6839\u8282\u70b9\u96c6\u5408\uff1a<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectName.Engine.RootNodes<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectName.Engine.RootNodes(1).Fields(&#8220;rotation&#8221;).angle=3.14;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u6839\u8282\u70b9\u96c6\u5408\u7684Add\u65b9\u6cd5\uff1a<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectName.Engine.RootNodes.Add(objectName.Engine.CreateVrmlFromString(&#8220;Transform {translation 0 10 5 children[Shape {geometry Box {}}]}&#8221;));<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u6216\uff1a&nbsp;&nbsp;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newrootnode = objectName.Engine.CreateNodeFromString(&#8220;&#8230;&#8221;);<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.Engine.RootNodes.Add(newrootnode);<\/p>\n<p>10 \u8fd9\u4e2a\u5728VB\u91cc\u53ef\u7528\uff0cjavascript\u91cc\u5c31\u4e0d\u77e5\u9053\u4e86\u3002<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfield = engine.CreateField(&#8220;SFNode&#8221;) <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testnode = engine.Nodes.Item(&#8220;test&#8221;) <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfield.value = testnode<\/p>\n<p>11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u8bbf\u95eeSFOrientation<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8216;orientation&#8217;).x=0;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8216;orientation&#8217;).y=1;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8216;orientation&#8217;).z=0;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.Engine.Nodes(&#8216;nodeName&#8217;).Fields(&#8216;orientation&#8217;).angle=1.57;<\/p>\n<p>12 \u8bbf\u95ee\u590d\u503c\uff1a<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.Engine.Nodes(&#8220;myOrientationInterpolator&#8221;).Fields(&#8220;keyValue&#8221;).Y(0);<\/p>\n<p>&nbsp;&nbsp;javascript \u54cd\u5e94\u4e8b\u4ef6<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script for=&#8221;objectName&#8221; event=&#8221;OnSceneLoaded(Success)&#8221; language=&#8221;JavaScript&#8221;&gt;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;\/script&gt;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;script for=&#8221;objectName&#8221; event=&#8221;OnSceneUnLoaded()&#8221; language=&#8221;JavaScript&#8221;&gt;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.renderer.name<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.renderer.isReady<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.renderer.path<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName.renderer.version<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/script&gt;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.<\/p>\n<p>&lt;script for=&#8221;objectName&#8221; event=&#8221;OnSceneLoaded(bSuccess)&#8221; language=&#8221;javascript&#8221;&gt;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bSuccess)<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectName.Engine.Nodes(&#8220;MyTransform&#8221;).Fields(&#8220;translation&#8221;).Advise(myHandler,&#8217;my transform&#8217;);<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function myHandler(value,hint,timestamp){<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(hint==&#8217;my transform&#8217;) &#8230;<\/p>\n<p>&lt;\/script&gt;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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:<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName1.Engine.Nodes(&#8220;SomeNodeName&#8221;).Fields(&#8220;someEventOut&#8221;).Advise(someFunc<br \/>tion,&#8221;&#8221;);<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; When the event is fired, it runs this function, which can change something in the other Cortona control:<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function someFunction(value,hint,timestamp){<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectName2.Engine.Nodes(&#8220;SomeNodeName&#8221;).Fields(&#8220;someEventIn&#8221;).Value=value.Value;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Engine.nodes\uff0cEngine.rootNodes\u8fd8\u6709fields(&#8220;fieldName&#8221;)\u663e\u7136\u6709\u4e0d\u5c11\u65b9\u6cd5\uff0c\u54ea\u91cc\u53bb\u627e\u5462\uff1f<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cortona\u8fd8\u662fContact,\u771f\u662f\u4e2a\u95ee\u9898\u3002BS Contact\u63d0\u4f9b\u7684javascript\u63a5\u53e3\u662f\u4ee5\u4f20\u9012\u5b57\u7b26\u4e32 &hellip; <a href=\"https:\/\/1vr.cn\/?p=349\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">cortona\u7684html-javascript\u7684\u5916\u90e8\u7f16\u7a0b\u63a5\u53e3<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-349","post","type-post","status-publish","format-standard","hentry","without-featured-image"],"_links":{"self":[{"href":"https:\/\/1vr.cn\/index.php?rest_route=\/wp\/v2\/posts\/349","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/1vr.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/1vr.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/1vr.cn\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/1vr.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=349"}],"version-history":[{"count":1,"href":"https:\/\/1vr.cn\/index.php?rest_route=\/wp\/v2\/posts\/349\/revisions"}],"predecessor-version":[{"id":986,"href":"https:\/\/1vr.cn\/index.php?rest_route=\/wp\/v2\/posts\/349\/revisions\/986"}],"wp:attachment":[{"href":"https:\/\/1vr.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/1vr.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/1vr.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}