<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Immersive Environments</title>
	<atom:link href="http://bcchang.com/immersive_blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://bcchang.com/immersive_blog</link>
	<description>Art and Virtual Reality</description>
	<lastBuildDate>Sat, 24 Apr 2010 14:18:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>SAIC VR projects @ Indianapolis InterMedia Festival</title>
		<link>http://bcchang.com/immersive_blog/?p=772</link>
		<comments>http://bcchang.com/immersive_blog/?p=772#comments</comments>
		<pubDate>Sat, 24 Apr 2010 14:18:43 +0000</pubDate>
		<dc:creator>Ben Chang</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://bcchang.com/immersive_blog/?p=772</guid>
		<description><![CDATA[VR Environments by: Mark Baldridge, Ben Chang, Margaret Dolinsky, Kegan McGurk, Paul Schuette, Roger Wakeman at the Intermedia Festival of Telematic Arts, Indianapolis, Saturday April 24th Live Cam: http://vrt-cam-1.avl.iupui.edu/view/index.shtml (login: user=guest, pw=guest)]]></description>
			<content:encoded><![CDATA[<p><img src="http://bcchang.com/immersive_blog/wp-content/uploads/2010/04/screengrab4a.jpeg" /></p>
<p>VR Environments by:</p>
<p>Mark Baldridge, Ben Chang, Margaret Dolinsky, Kegan McGurk, Paul Schuette, Roger Wakeman</p>
<p>at the <a href="http://music.iupui.edu/intermedia/">Intermedia Festival of Telematic Arts</a>, Indianapolis, Saturday April 24th</p>
<p>Live Cam:</p>
<p>http://vrt-cam-1.avl.iupui.edu/view/index.shtml</p>
<p>(login: user=guest, pw=guest)</p></p>
]]></content:encoded>
			<wfw:commentRss>http://bcchang.com/immersive_blog/?feed=rss2&#038;p=772</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Joe LaViola on 3D interaction techniques</title>
		<link>http://bcchang.com/immersive_blog/?p=769</link>
		<comments>http://bcchang.com/immersive_blog/?p=769#comments</comments>
		<pubDate>Fri, 23 Apr 2010 21:46:45 +0000</pubDate>
		<dc:creator>Ben Chang</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://bcchang.com/immersive_blog/?p=769</guid>
		<description><![CDATA[VR researcher Joe LaViola talks about different paradigms for 3D interaction and how these interfaces, developed for the CAVE and other VR systems, can be applied to the new generation of 6DOF controllers http://www.gamasutra.com/view/feature/4331/from_research_to_games_.php]]></description>
			<content:encoded><![CDATA[<p>VR researcher Joe LaViola talks about different paradigms for 3D interaction and how these interfaces, developed for the CAVE and other VR systems, can be applied to the new generation of 6DOF controllers</p>
<p>http://www.gamasutra.com/view/feature/4331/from_research_to_games_.php</p>
]]></content:encoded>
			<wfw:commentRss>http://bcchang.com/immersive_blog/?feed=rss2&#038;p=769</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VRPN + Panda</title>
		<link>http://bcchang.com/immersive_blog/?p=767</link>
		<comments>http://bcchang.com/immersive_blog/?p=767#comments</comments>
		<pubDate>Fri, 16 Apr 2010 21:52:43 +0000</pubDate>
		<dc:creator>Ben Chang</dc:creator>
				<category><![CDATA[Panda]]></category>

		<guid isPermaLink="false">http://bcchang.com/immersive_blog/?p=767</guid>
		<description><![CDATA[import direct.directbase.DirectStart from pandac.PandaModules import * from direct.task import Task from direct.showbase import * import random import sys import math # vrpn_server -millisleep 1 -f vrpn_flock.cfg class World&#40;DirectObject.DirectObject&#41;: &#160; def __init__&#40;self&#41;: &#160; &#160; &#160; &#160; # Accept the Esc key to quit the game. &#160; &#160; self.accept&#40;&#34;escape&#34;, sys.exit&#41; &#160; &#160; self.vrpnclient = VrpnClient &#40;'localhost'&#41; &#160; [...]]]></description>
			<content:encoded><![CDATA[<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> Task<br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">import</span> <span class="kw3">random</span><br />
<span class="kw1">import</span> <span class="kw3">sys</span><br />
<span class="kw1">import</span> <span class="kw3">math</span></p>
<p><span class="co1"># vrpn_server -millisleep 1 -f vrpn_flock.cfg</span></p>
<p><span class="kw1">class</span> World<span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Accept the Esc key to quit the game.</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;escape&quot;</span>, <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">vrpnclient</span> = VrpnClient <span class="br0">&#40;</span><span class="st0">'localhost'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">tracker0</span> = TrackerNode<span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">vrpnclient</span>,<span class="st0">&quot;Tracker0&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; taskMgr.<span class="me1">add</span> <span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">wand</span>=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;zup-axis&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">wand</span>.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># this is a node in the scenegraph. &nbsp;you can attach stuff to it which will be visible.</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">myTrackedNode</span> = render.<span class="me1">attachNewNode</span><span class="br0">&#40;</span><span class="st0">'myTrackedNode'</span><span class="br0">&#41;</span> &nbsp;<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># this is the data node that gets the tracker info</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># it is NOT in the scenegraph, but in the mysterious data graph</span><br />
&nbsp; &nbsp; base.<span class="me1">dataRoot</span>.<span class="me1">node</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">addChild</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">tracker0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; t2n = Transform2SG<span class="br0">&#40;</span><span class="st0">'t2n'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">tracker0</span>.<span class="me1">addChild</span><span class="br0">&#40;</span>t2n<span class="br0">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; t2n.<span class="me1">setNode</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">myTrackedNode</span>.<span class="me1">node</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># i think this should work:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># cube=loader.loadModel(&quot;cube&quot;)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># cube.reparentTo(self.myTrackedNode)</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; base.<span class="me1">disableMouse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-100,30<span class="br0">&#41;</span><br />
&nbsp; &nbsp; camera.<span class="me1">lookAt</span><span class="br0">&#40;</span>0,0,0<span class="br0">&#41;</span></p>
<p>&nbsp; <span class="kw1">def</span> update <span class="br0">&#40;</span><span class="kw2">self</span>,t<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">vrpnclient</span>.<span class="me1">poll</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="co1">#camera.setPos(self.myTrackedNode.getPos())</span><br />
&nbsp; &nbsp; <span class="co1">#camera.setHpr (self.myTrackedNode.getHpr())</span></p>
<p>&nbsp; &nbsp; <span class="co1">#print self.myTrackedNode.getPos()*1000, self.myTrackedNode.getHpr()</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; p=<span class="kw2">self</span>.<span class="me1">myTrackedNode</span>.<span class="me1">getPos</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; p2 = <span class="kw2">int</span><span class="br0">&#40;</span>p.<span class="me1">getX</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">*</span>100<span class="br0">&#41;</span>, <span class="kw2">int</span> <span class="br0">&#40;</span>p.<span class="me1">getY</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">*</span> 100<span class="br0">&#41;</span>, <span class="kw2">int</span><span class="br0">&#40;</span>p.<span class="me1">getZ</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">*</span> 100<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> p2 &nbsp; &nbsp;</p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">wand</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>p<span class="sy0">*</span><span class="nu0">15</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="co1">#self.wand.setHpr(self.myTrackedNode.getHpr())</span></p>
<p>&nbsp; &nbsp; <span class="co1">#print self.wand.getPos()</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> Task.<span class="me1">cont</span></p>
<p>&nbsp;</p>
<p>w=World<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://bcchang.com/immersive_blog/?feed=rss2&#038;p=767</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Click and Drag</title>
		<link>http://bcchang.com/immersive_blog/?p=764</link>
		<comments>http://bcchang.com/immersive_blog/?p=764#comments</comments>
		<pubDate>Thu, 15 Apr 2010 20:56:37 +0000</pubDate>
		<dc:creator>Ben Chang</dc:creator>
				<category><![CDATA[Panda]]></category>

		<guid isPermaLink="false">http://bcchang.com/immersive_blog/?p=764</guid>
		<description><![CDATA[Drag.tar This example uses an updated MousePickingManager.py, so use the one in this archive. You can drag objects up and down, left and right. # Click and Drag from pandac.PandaModules import * from direct.task import * from direct.showbase import DirectObject import direct.directbase.DirectStart import random from MousePickingManager import * import sys class World &#40;DirectObject.DirectObject&#41;: &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://bcchang.com/immersive_blog/wp-content/uploads/2010/04/Drag.tar.gz'>Drag.tar</a></p>
<p>This example uses an updated MousePickingManager.py, so use the one in this archive.   You can drag objects up and down, left and right.  </p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># Click and Drag</span></p>
<p><span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">import</span> <span class="kw3">random</span><br />
<span class="kw1">from</span> MousePickingManager <span class="kw1">import</span> <span class="sy0">*</span></p>
<p><span class="kw1">import</span> <span class="kw3">sys</span></p>
<p><span class="kw1">class</span> World <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">loadmodels</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span> = MousePickingManager<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span> <span class="br0">&#40;</span><span class="st0">'escape'</span>,<span class="kw2">self</span>.<span class="me1">quit</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> loadmodels<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; light1Node=PointLight<span class="br0">&#40;</span><span class="st0">&quot;light1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; light1=camera.<span class="me1">attachNewNode</span><span class="br0">&#40;</span>light1Node<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span>light1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-10,3<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; camera.<span class="me1">lookAt</span><span class="br0">&#40;</span>0,0,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span> = Pawn<span class="br0">&#40;</span><span class="st0">&quot;red pawn&quot;</span>,<span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span>1,0,0,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">bluepawn</span> = Pawn<span class="br0">&#40;</span><span class="st0">&quot;blue pawn&quot;</span>,<span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">bluepawn</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span>0,0,1,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">bluepawn</span>.<span class="me1">obj</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>2,3,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; camera.<span class="me1">setH</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> task.<span class="me1">cont</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> quit <span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;bye bye&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">class</span> Pawn <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,name,world<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">name</span>=name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">world</span>=world</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; p=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;pawn&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setName</span><span class="br0">&#40;</span>name<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setTag</span><span class="br0">&#40;</span><span class="st0">&quot;mouseInteraction&quot;</span>,<span class="st0">&quot;1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setPythonTag</span><span class="br0">&#40;</span><span class="st0">&quot;pythonObject&quot;</span>,<span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>=p<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">dragging</span>=<span class="kw2">False</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseDown&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>,<span class="kw2">self</span>.<span class="me1">onClick</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseUp&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>,<span class="kw2">self</span>.<span class="me1">onRelease</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseUpOutside&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>,<span class="kw2">self</span>.<span class="me1">onRelease</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> onClick<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">dragging</span>=<span class="kw2">True</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">dragOffset</span>=<span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">getPos</span><span class="br0">&#40;</span><span class="br0">&#41;</span> - <span class="kw2">self</span>.<span class="me1">world</span>.<span class="me1">mousemanager</span>.<span class="me1">getLastPickPoint</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="kw2">self</span>.<span class="me1">dragOffset</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># store distance </span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> onRelease<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">dragging</span>=<span class="kw2">False</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">self</span>.<span class="me1">dragging</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p=<span class="kw2">self</span>.<span class="me1">world</span>.<span class="me1">mousemanager</span>.<span class="me1">getMousePositionOnXZPlane</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>p+<span class="kw2">self</span>.<span class="me1">dragOffset</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> task.<span class="me1">cont</span></p>
<p>w=World<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://bcchang.com/immersive_blog/?feed=rss2&#038;p=764</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://bcchang.com/immersive_blog/?p=759</link>
		<comments>http://bcchang.com/immersive_blog/?p=759#comments</comments>
		<pubDate>Thu, 15 Apr 2010 18:17:05 +0000</pubDate>
		<dc:creator>Ben Chang</dc:creator>
				<category><![CDATA[Panda]]></category>

		<guid isPermaLink="false">http://bcchang.com/immersive_blog/?p=759</guid>
		<description><![CDATA[Examples of using mouse events to interact with objects. ClickOnObject.tar # 1: Create a class to load a model, and prepare it for use with the MousePickingManager from pandac.PandaModules import * from direct.task import * from direct.showbase import DirectObject import direct.directbase.DirectStart import random from MousePickingManager import * import sys class World &#40;DirectObject.DirectObject&#41;: &#160; &#160; def [...]]]></description>
			<content:encoded><![CDATA[<p>Examples of using mouse events to interact with objects.<br />
<a href='http://bcchang.com/immersive_blog/wp-content/uploads/2010/04/ClickOnObject.tar.gz'>ClickOnObject.tar</a></p>
<p><span id="more-759"></span></p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># 1: Create a class to load a model, and prepare it for use with the MousePickingManager</span></p>
<p><span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">import</span> <span class="kw3">random</span><br />
<span class="kw1">from</span> MousePickingManager <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">import</span> <span class="kw3">sys</span></p>
<p><span class="kw1">class</span> World <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">loadmodels</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span> = MousePickingManager<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span> <span class="br0">&#40;</span><span class="st0">'escape'</span>,<span class="kw2">self</span>.<span class="me1">quit</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> loadmodels<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; light1Node=PointLight<span class="br0">&#40;</span><span class="st0">&quot;light1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; light1=camera.<span class="me1">attachNewNode</span><span class="br0">&#40;</span>light1Node<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span>light1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-10,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span> = Pawn<span class="br0">&#40;</span><span class="st0">&quot;red pawn&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span>1,0,0,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> quit <span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;bye bye&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">class</span> Pawn <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,name<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">name</span>=name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; p=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;pawn&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setName</span><span class="br0">&#40;</span>name<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>=p<br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
w=World<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># 1: Create a class to load a model, and prepare it for use with the MousePickingManager</span></p>
<p><span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">import</span> <span class="kw3">random</span><br />
<span class="kw1">from</span> MousePickingManager <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">import</span> <span class="kw3">sys</span></p>
<p><span class="kw1">class</span> World <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">loadmodels</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span> = MousePickingManager<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span> <span class="br0">&#40;</span><span class="st0">'escape'</span>,<span class="kw2">self</span>.<span class="me1">quit</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> loadmodels<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; light1Node=PointLight<span class="br0">&#40;</span><span class="st0">&quot;light1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; light1=camera.<span class="me1">attachNewNode</span><span class="br0">&#40;</span>light1Node<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span>light1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-10,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span> = Pawn<span class="br0">&#40;</span><span class="st0">&quot;red pawn&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span>1,0,0,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> quit <span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;bye bye&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">class</span> Pawn <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,name<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">name</span>=name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; p=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;pawn&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setName</span><span class="br0">&#40;</span>name<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># setTag() lets you add extra properties to a node. &nbsp;&quot;mouseInteraction&quot; is a flag for the MousePickingManager,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># telling it that this object can have mouse interactions applied to it.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setTag</span><span class="br0">&#40;</span><span class="st0">&quot;mouseInteraction&quot;</span>,<span class="st0">&quot;1&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># setPythonTag is like setTag, but it lets you connect a node to a python object.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># here we connect the model to the Python object that uses it. &nbsp;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># this is because the mouse interaction code can only tell what object you've clicked on, and needs this </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># information to connect to the event handlers.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setPythonTag</span><span class="br0">&#40;</span><span class="st0">&quot;pythonObject&quot;</span>,<span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># the mouse manager generates events with the name of the object appended, so this form of accept() will catch them correctly</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseEnter&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>, <span class="kw2">self</span>.<span class="me1">onMouseEnter</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>=p<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseEnter<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Mouse Enter&quot;</span>, <span class="kw2">self</span>.<span class="me1">name</span></p>
<p>w=World<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># 3: all mouse events</span></p>
<p><span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">import</span> <span class="kw3">random</span><br />
<span class="kw1">from</span> MousePickingManager <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">import</span> <span class="kw3">sys</span></p>
<p><span class="kw1">class</span> World <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">loadmodels</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span> = MousePickingManager<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span> <span class="br0">&#40;</span><span class="st0">'escape'</span>,<span class="kw2">self</span>.<span class="me1">quit</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> loadmodels<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; light1Node=PointLight<span class="br0">&#40;</span><span class="st0">&quot;light1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; light1=camera.<span class="me1">attachNewNode</span><span class="br0">&#40;</span>light1Node<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span>light1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-10,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span> = Pawn<span class="br0">&#40;</span><span class="st0">&quot;red pawn&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span>1,0,0,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> quit <span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;bye bye&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">class</span> Pawn <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,name<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">name</span>=name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; p=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;pawn&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setName</span><span class="br0">&#40;</span>name<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setTag</span><span class="br0">&#40;</span><span class="st0">&quot;mouseInteraction&quot;</span>,<span class="st0">&quot;1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setPythonTag</span><span class="br0">&#40;</span><span class="st0">&quot;pythonObject&quot;</span>,<span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseEnter&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>, <span class="kw2">self</span>.<span class="me1">onMouseEnter</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseLeave&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>, <span class="kw2">self</span>.<span class="me1">onMouseLeave</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseDown&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>, <span class="kw2">self</span>.<span class="me1">onMouseDown</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseUp&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>,<span class="kw2">self</span>.<span class="me1">onMouseUp</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseUpOutside&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>,<span class="kw2">self</span>.<span class="me1">onMouseUpOutside</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>=p<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseEnter<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Mouse Enter&quot;</span>, <span class="kw2">self</span>.<span class="me1">name</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseLeave<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Mouse Leave&quot;</span>, <span class="kw2">self</span>.<span class="me1">name</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseDown<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Mouse Down&quot;</span>, <span class="kw2">self</span>.<span class="me1">name</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseUp<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Mouse Up&quot;</span>, <span class="kw2">self</span>.<span class="me1">name</span> &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseUpOutside<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Mouse Up Outside&quot;</span>, <span class="kw2">self</span>.<span class="me1">name</span> &nbsp; &nbsp; &nbsp; &nbsp;<br />
w=World<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># 4: use the mouse events to change something about the object</span></p>
<p><span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">import</span> <span class="kw3">random</span><br />
<span class="kw1">from</span> MousePickingManager <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">import</span> <span class="kw3">sys</span></p>
<p><span class="kw1">class</span> World <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">loadmodels</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span> = MousePickingManager<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span> <span class="br0">&#40;</span><span class="st0">'escape'</span>,<span class="kw2">self</span>.<span class="me1">quit</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> loadmodels<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; light1Node=PointLight<span class="br0">&#40;</span><span class="st0">&quot;light1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; light1=camera.<span class="me1">attachNewNode</span><span class="br0">&#40;</span>light1Node<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span>light1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-10,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span> = Pawn<span class="br0">&#40;</span><span class="st0">&quot;red pawn&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span>1,0,0,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> quit <span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;bye bye&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">class</span> Pawn <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,name<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">name</span>=name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; p=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;pawn&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setName</span><span class="br0">&#40;</span>name<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setTag</span><span class="br0">&#40;</span><span class="st0">&quot;mouseInteraction&quot;</span>,<span class="st0">&quot;1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setPythonTag</span><span class="br0">&#40;</span><span class="st0">&quot;pythonObject&quot;</span>,<span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseEnter&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>, <span class="kw2">self</span>.<span class="me1">onMouseEnter</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseLeave&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>, <span class="kw2">self</span>.<span class="me1">onMouseLeave</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseDown&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>, <span class="kw2">self</span>.<span class="me1">onMouseDown</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseUp&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>,<span class="kw2">self</span>.<span class="me1">onMouseUp</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseUpOutside&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>,<span class="kw2">self</span>.<span class="me1">onMouseUpOutside</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>=p<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseEnter<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setScale</span><span class="br0">&#40;</span>1.1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseLeave<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setScale</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseDown<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setScale</span><span class="br0">&#40;</span>1.5<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseUp<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setScale</span><span class="br0">&#40;</span>1.1<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseUpOutside<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setScale</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
w=World<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># 5: changing color</span></p>
<p><span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">import</span> <span class="kw3">random</span><br />
<span class="kw1">from</span> MousePickingManager <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">import</span> <span class="kw3">sys</span></p>
<p><span class="kw1">class</span> World <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">loadmodels</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span> = MousePickingManager<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span> <span class="br0">&#40;</span><span class="st0">'escape'</span>,<span class="kw2">self</span>.<span class="me1">quit</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> loadmodels<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; light1Node=PointLight<span class="br0">&#40;</span><span class="st0">&quot;light1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; light1=camera.<span class="me1">attachNewNode</span><span class="br0">&#40;</span>light1Node<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span>light1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-10,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span> = Pawn<span class="br0">&#40;</span><span class="st0">&quot;red pawn&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># add properties for base color, rollover color, and click color</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># these will be part of Pawn, not part of Pawn.obj</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span>.<span class="me1">setBaseColor</span> <span class="br0">&#40;</span>.5,.4,.4<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span>.<span class="me1">setHighlightColor</span> <span class="br0">&#40;</span>1,0,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">redpawn</span>.<span class="me1">setSelectColor</span> <span class="br0">&#40;</span>1,.5,.5<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> quit <span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;bye bye&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">class</span> Pawn <span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,name<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">name</span>=name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; p=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;pawn&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setName</span><span class="br0">&#40;</span>name<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setTag</span><span class="br0">&#40;</span><span class="st0">&quot;mouseInteraction&quot;</span>,<span class="st0">&quot;1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; p.<span class="me1">setPythonTag</span><span class="br0">&#40;</span><span class="st0">&quot;pythonObject&quot;</span>,<span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseEnter&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>, <span class="kw2">self</span>.<span class="me1">onMouseEnter</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseLeave&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>, <span class="kw2">self</span>.<span class="me1">onMouseLeave</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseDown&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>, <span class="kw2">self</span>.<span class="me1">onMouseDown</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseUp&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>,<span class="kw2">self</span>.<span class="me1">onMouseUp</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseUpOutside&quot;</span>+<span class="kw2">self</span>.<span class="me1">name</span>,<span class="kw2">self</span>.<span class="me1">onMouseUpOutside</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>=p</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">setBaseColor</span><span class="br0">&#40;</span>1,1,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">highlightColor</span>=Vec4<span class="br0">&#40;</span>1,1,1,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">selectColor</span>=Vec4<span class="br0">&#40;</span>1,1,1,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> setBaseColor<span class="br0">&#40;</span><span class="kw2">self</span>,r,g,b<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">baseColor</span> = Vec4<span class="br0">&#40;</span>r,g,b,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">baseColor</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> setHighlightColor<span class="br0">&#40;</span><span class="kw2">self</span>,r,g,b<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">highlightColor</span> = Vec4<span class="br0">&#40;</span>r,g,b,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> setSelectColor<span class="br0">&#40;</span><span class="kw2">self</span>,r,g,b<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">selectColor</span> = Vec4<span class="br0">&#40;</span>r,g,b,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseEnter<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">highlightColor</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseLeave<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">baseColor</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseDown<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">selectColor</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseUp<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">highlightColor</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> onMouseUpOutside<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setColor</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">baseColor</span><span class="br0">&#41;</span><br />
w=World<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://bcchang.com/immersive_blog/?feed=rss2&#038;p=759</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tutorial &#8211; Projectiles and Collisions</title>
		<link>http://bcchang.com/immersive_blog/?p=741</link>
		<comments>http://bcchang.com/immersive_blog/?p=741#comments</comments>
		<pubDate>Tue, 13 Apr 2010 02:23:10 +0000</pubDate>
		<dc:creator>Ben Chang</dc:creator>
				<category><![CDATA[Panda]]></category>

		<guid isPermaLink="false">http://bcchang.com/immersive_blog/?p=741</guid>
		<description><![CDATA[This tutorial includes projectiles, simple fake physics, collisions, mouse interaction, and some handy vector math techniques to create a simple game. There are several steps: Create a projectile and animate it through code Set up interaction to aim and launch the projectile Create and animate targets to hurl projectiles at Set up collision detection so [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://bcchang.com/immersive_blog/wp-content/uploads/2010/04/shootinggame.jpg"><img class="aligncenter size-medium wp-image-742" title="projectile and colllision tutorial image" src="http://bcchang.com/immersive_blog/wp-content/uploads/2010/04/shootinggame-300x234.jpg" alt="projectile and colllision tutorial image" width="300" height="234" /></a></p>
<p>This tutorial includes projectiles, simple fake physics, collisions, mouse interaction, and some handy vector math techniques to create a simple game.</p>
<p>There are several steps:</p>
<ol>
<li>Create a projectile and animate it through code</li>
<li>Set up interaction to aim and launch the projectile</li>
<li>Create and animate targets to hurl projectiles at</li>
<li>Set up collision detection so you know when the target has been hit</li>
</ol>
<p>All the completed code, with models and Maya files, is included in this archive:</p>
<h3>
<a href='http://bcchang.com/immersive_blog/wp-content/uploads/2010/04/shootingGallery.tar.gz'>TUTORIAL FILES</a><br />
</h3>
<p><span id="more-741"></span></p>
<h2>Projectiles</h2>
<p>To animate a projectile, we'll use the same basic method as any other form of code-based animation:</p>
<ol>
<li>Create an update task</li>
<li>Store a variable with a velocity vector</li>
<li>Each time the update task runs, get the current position of the object using getPos()</li>
<li>Add the velocity vector to the current position to get the new position</li>
<li>Update the position of the object using setPos()</li>
</ol>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># -*- coding: utf-8 -*-</span></p>
<p><span class="co1"># Projectile example</span><br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">actor</span>.<span class="me1">Actor</span> <span class="kw1">import</span> Actor<br />
<span class="kw1">from</span> direct.<span class="me1">interval</span>.<span class="me1">ActorInterval</span> <span class="kw1">import</span> ActorInterval<br />
<span class="kw1">from</span> direct.<span class="me1">interval</span>.<span class="me1">IntervalGlobal</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span>.<span class="me1">DirectObject</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> MousePickingManager<br />
<span class="kw1">import</span> <span class="kw3">random</span></p>
<p><span class="kw1">class</span> Bullet:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="co1"># property for this class to store the current velocity &nbsp; &nbsp;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">velocity</span>=Vec3<span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1"># set up the update task to animate the bullet</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">updateTask</span> = taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;models/ball&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setScale</span><span class="br0">&#40;</span>.25<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1"># this variable is used to calculate the elapsed time between calls to the update function</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">lastTime</span>=0<br />
&nbsp; &nbsp; <br />
&nbsp; <span class="kw1">def</span> setVelocity <span class="br0">&#40;</span><span class="kw2">self</span>,v<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">velocity</span>=v<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; <span class="kw1">def</span> setPos<span class="br0">&#40;</span><span class="kw2">self</span>,v<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>v<span class="br0">&#41;</span><br />
&nbsp; <br />
&nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="co1"># how much time elapsed since the last update</span><br />
&nbsp; &nbsp; dt=task.<span class="me1">getElapsedTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-<span class="kw2">self</span>.<span class="me1">lastTime</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">lastTime</span>=task.<span class="me1">getElapsedTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="co1"># multiply the elapsed time X the velocity</span><br />
&nbsp; &nbsp; delta = <span class="kw2">self</span>.<span class="me1">velocity</span> <span class="sy0">*</span> dt</p>
<p>&nbsp; &nbsp; <span class="co1"># add the amount of change onto the current position</span><br />
&nbsp; &nbsp; newPos = <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">getPos</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + delta</p>
<p>&nbsp; &nbsp; <span class="co1"># update the position of the object</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>newPos<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> task.<span class="me1">cont</span></p>
<p>&nbsp; &nbsp; <br />
<span class="kw1">class</span> World<span class="br0">&#40;</span>DirectObject<span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; base.<span class="me1">disableMouse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; terrain=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;models/terrain&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; terrain.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; terrain.<span class="me1">setScale</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">3</span>,<span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; light1=render.<span class="me1">attachNewNode</span><span class="br0">&#40;</span>PointLight<span class="br0">&#40;</span><span class="st0">&quot;light1&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; light1.<span class="me1">setPos</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">20</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span>light1<span class="br0">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">1</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; base.<span class="me1">setBackgroundColor</span><span class="br0">&#40;</span>.3,.3,<span class="nu0">7</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1"># create a bullet</span><br />
&nbsp; &nbsp; bullet=Bullet<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1"># give it an initial velocity</span><br />
&nbsp; &nbsp; v = Vec3<span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">5</span>,<span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; bullet.<span class="me1">setVelocity</span><span class="br0">&#40;</span>v<span class="br0">&#41;</span></p>
<p>w=World<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<p>This example uses two classes: one for the World, and one for the Bullet.  This lets you create multiple bullets, just by creating more instances of the class, which we'll do a little later.  </p>
<p>The core of the bullet code is this:</p>
<div class="codesnip-container" >newPos = self.obj.getPos() + delta</div>
<p>where <b>delta</b> is the amount of change.  But the way we calculate delta deserves some explanation.  Notice the additional code before that point, dealing with time?  This is important, but to understand why, let's look at a much simpler way we might try to write the same function:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="co1"># add the amount of change onto the current position</span><br />
&nbsp; &nbsp; newPos = <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">getPos</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + <span class="kw2">self</span>.<span class="me1">velocity</span></p>
<p>&nbsp; &nbsp; <span class="co1"># update the position of the object</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>newPos<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> task.<span class="me1">cont</span></div>
</div>
<p>Much simpler, right?  In the example, the velocity vector is set to (0,5,1), which is 5 units forward along the Y axis and 1 unit up along the Z axis.  Thinking just about the Y axis, this means the bullet moves 5 units forward every time the update() function is called.  This will work, although it will be way to fast, such that the bullet disappears into space immediately.  Try setting the velocity to something smaller:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;">v = Vec3<span class="br0">&#40;</span><span class="nu0">0</span>,.1,.01<span class="br0">&#41;</span><br />
&nbsp; &nbsp; bullet.<span class="me1">setVelocity</span><span class="br0">&#40;</span>v<span class="br0">&#41;</span></div>
</div>
<p>and that'll slow it down so you can see it.  So this works fine - why do we need all that stuff with the timing variables?</p>
<p>The reason is that using the timing variables lets you describe velocity in terms of actual relationships between distance and time.  Also, without using timing variables, you have no way of knowing how quickly the update() task is really getting called - sometimes it'll be really fast, other times, as your scene gets heavier, it might get called less often, causing the motion of the projectile to slow down.  Using timing variables solves this problem.</p>
<p>Ok, so what ARE the timing variables, anyway?  Here's the idea: first, think about how we describe speed in the real world.  We might say a car is going 60 miles per hour, or a fastball is moving at 80 miles per hour.  To animate an object in this way, we need to know the <strong>time step</strong> between one position and the next, and use that to determine how much change should happen.  </p>
<p>In the case of a baseball traveling 80 miles an hour, let's say the time step is 1 second (meaning our animation is running at 1 frame per second).  There are 60 * 60 = 3600 seconds in an hour, so in each second the ball should move 80/3600 = .02222 miles.  In more reasonable units, that's around 117 feet per second.</p>
<p>So a chart of the ball's progress would look like this:</p>
<pre>
Time (seconds)    Position (feet)
-------------------------------
0                       0
1                       117
2                       234
3                       351
...
</pre>
<p>"Change" is often labeled using the Greek symbol "Delta."  The Time Step, the amount of time that elapses from one update to the next, is also called "Delta Time" or just "<strong>dT</strong>".  The amount of change along one axis is often called Delta X, Delta Y, etc., or just <strong>dX</strong> and <strong>dY</strong>.  </p>
<p>In Panda, Tasks don't have a framerate setting, they just run as fast as they possibly can, which will change depending on how complex the scene is and how fast the computer is.  So in order to find out how long the time step, or dT is, we do this:</p>
<ol>
<li>Get the current timestamp using task.getElapsedTime()</li>
<li>Subtract the timestamp of the last call to update(): dt=task.getElapsedTime()-self.lastTime</li>
<li>Store the current timestamp so we can use it the next time update() is called: self.lastTime=task.getElapsedTime()
</li>
</ol>
<p>Then we multiply <strong>dt</strong> times the velocity vector before adding it on.  If the velocity vector is expressed in meters per second, dt will contain a fraction of a second and so multiplying it times the velocity will give the correct amount of movement.</p>
<p><!--more--></p>
<h2>Adding Gravity</h2>
<p>To create the effect of gravity, make another vector variable with the gravity direction in it, and add that (multiplied times dt) in each update.</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># -*- coding: utf-8 -*-</span><br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">actor</span>.<span class="me1">Actor</span> <span class="kw1">import</span> Actor<br />
<span class="kw1">from</span> direct.<span class="me1">interval</span>.<span class="me1">ActorInterval</span> <span class="kw1">import</span> ActorInterval<br />
<span class="kw1">from</span> direct.<span class="me1">interval</span>.<span class="me1">IntervalGlobal</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span>.<span class="me1">DirectObject</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> MousePickingManager<br />
<span class="kw1">import</span> <span class="kw3">random</span></p>
<p>GRAVITY=Vec3<span class="br0">&#40;</span>0,0,-2<span class="br0">&#41;</span></p>
<p><span class="kw1">class</span> Bullet:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="co1"># property for this class to store the current velocity &nbsp; &nbsp;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">velocity</span>=Vec3<span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1"># set up the update task to animate the bullet</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">updateTask</span> = taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;models/ball&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setScale</span><span class="br0">&#40;</span>.25<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1"># this variable is used to calculate the elapsed time between calls to the update function</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">lastTime</span>=0<br />
&nbsp; &nbsp; <br />
&nbsp; <span class="kw1">def</span> setVelocity <span class="br0">&#40;</span><span class="kw2">self</span>,v<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">velocity</span>=v<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; <span class="kw1">def</span> setPos<span class="br0">&#40;</span><span class="kw2">self</span>,v<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>v<span class="br0">&#41;</span><br />
&nbsp; <br />
&nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="co1"># how much time elapsed since the last update</span><br />
&nbsp; &nbsp; dt=task.<span class="me1">getElapsedTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-<span class="kw2">self</span>.<span class="me1">lastTime</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">lastTime</span>=task.<span class="me1">getElapsedTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">velocity</span>=<span class="kw2">self</span>.<span class="me1">velocity</span>+ <span class="br0">&#40;</span>GRAVITY <span class="sy0">*</span> dt<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="co1"># multiply the elapsed time X the velocity</span><br />
&nbsp; &nbsp; delta = <span class="kw2">self</span>.<span class="me1">velocity</span> <span class="sy0">*</span> dt</p>
<p>&nbsp; &nbsp; <span class="co1"># add the amount of change onto the current position</span><br />
&nbsp; &nbsp; newPos = <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">getPos</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + <span class="kw2">self</span>.<span class="me1">velocity</span> <span class="sy0">*</span> dt</p>
<p>&nbsp; &nbsp; <span class="co1"># update the position of the object</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>newPos<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> task.<span class="me1">cont</span></p>
<p>&nbsp; &nbsp; <br />
<span class="kw1">class</span> World<span class="br0">&#40;</span>DirectObject<span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; base.<span class="me1">disableMouse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; terrain=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;models/terrain&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; terrain.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; terrain.<span class="me1">setScale</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">3</span>,<span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; light1=render.<span class="me1">attachNewNode</span><span class="br0">&#40;</span>PointLight<span class="br0">&#40;</span><span class="st0">&quot;light1&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; light1.<span class="me1">setPos</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">20</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span>light1<span class="br0">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">1</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; base.<span class="me1">setBackgroundColor</span><span class="br0">&#40;</span>.3,.3,<span class="nu0">7</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1"># create a bullet</span><br />
&nbsp; &nbsp; bullet=Bullet<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1"># give it an initial velocity</span><br />
&nbsp; &nbsp; v = Vec3<span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">5</span>,<span class="nu0">3</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; bullet.<span class="me1">setVelocity</span><span class="br0">&#40;</span>v<span class="br0">&#41;</span></p>
<p>
w=World<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<p><!--more--></p>
<h2>Aiming</h2>
<p>This code example sets up a gun and rotates it to follow the mouse.  The gun is positioned just underneath the camera, and the update() task maps the X and Y movement of the mouse to the Heading and Pitch rotations of the gun.  (Remember Heading is Left-Right rotation, and Pitch is Up-Down rotation).</p>
<p>There are a number of other ways to accomplish this effect, but this one is pretty straightforward.  This example uses the "MousePickingManager" utility class, so you'll need that file in the same directory so you can import it; but this can also be done easily with Panda's built in mouse functions.  MousePickingManager is used here just for consistency with some of the other examples.</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># -*- coding: utf-8 -*-</span><br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">actor</span>.<span class="me1">Actor</span> <span class="kw1">import</span> Actor<br />
<span class="kw1">from</span> direct.<span class="me1">interval</span>.<span class="me1">ActorInterval</span> <span class="kw1">import</span> ActorInterval<br />
<span class="kw1">from</span> direct.<span class="me1">interval</span>.<span class="me1">IntervalGlobal</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span>.<span class="me1">DirectObject</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> MousePickingManager<br />
<span class="kw1">import</span> <span class="kw3">random</span></p>
<p><span class="kw1">class</span> World<span class="br0">&#40;</span>DirectObject<span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; <br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span>=MousePickingManager.<span class="me1">MousePickingManager</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; terrain=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;models/terrain&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; terrain.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; terrain.<span class="me1">setScale</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">3</span>,<span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; light1=render.<span class="me1">attachNewNode</span><span class="br0">&#40;</span>PointLight<span class="br0">&#40;</span><span class="st0">&quot;light1&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; light1.<span class="me1">setPos</span><span class="br0">&#40;</span>0,0,20<span class="br0">&#41;</span><br />
&nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span>light1<span class="br0">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span>0,0,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; base.<span class="me1">setBackgroundColor</span><span class="br0">&#40;</span>.3,.3,7<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">gun</span>=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;models/gun&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">gun</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>0,.8,.65<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">gun</span>.<span class="me1">setScale</span><span class="br0">&#40;</span>.5<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">gun</span>.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseDown&quot;</span>,<span class="kw2">self</span>.<span class="me1">onMouseDown</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; <span class="kw1">def</span> onMouseDown<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Click!&quot;</span><br />
&nbsp; &nbsp; <br />
&nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="co1"># get the X,Y coordinates of the mouse, on a range from -1 to 1</span><br />
&nbsp; &nbsp; p=<span class="kw2">self</span>.<span class="me1">mousemanager</span>.<span class="me1">getMouse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="co1"># scale the X,Y mouse coordinates to rotations: -45 to 45 degrees left/right, and 0 to 30 degrees up</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">gun</span>.<span class="me1">setHpr</span><span class="br0">&#40;</span>p.<span class="me1">getX</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">*</span> -45,<span class="br0">&#40;</span>p.<span class="me1">getY</span><span class="br0">&#40;</span><span class="br0">&#41;</span>+1<span class="br0">&#41;</span><span class="sy0">*</span>15,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> task.<span class="me1">cont</span></p>
<p>w=World<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<p><!--more--><br />
<b>Firing</b></p>
<p>To fire the bullet, we add a "fire" function and call it from onMouseDown().  It doesn't necessarily need to be its own function, all that code could just go straight into onMouseDown(), but this keeps the code more organized.</p>
<p>The bullet is created here:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="kw1">def</span> fire<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; bullet = Bullet<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; fvec = Vec3<span class="br0">&#40;</span>0,1,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; bullet.<span class="me1">setVelocity</span><span class="br0">&#40;</span>render.<span class="me1">getRelativeVector</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">gun</span>,fvec<span class="sy0">*</span>20<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; bullet.<span class="me1">setPos</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">gun</span>.<span class="me1">getPos</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + render.<span class="me1">getRelativeVector</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">gun</span>,fvec<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</div>
<p>As soon as it's created, it begins animating (through Bullet's update() methdo).  The last three lines in the fire() function make the bullet launch in the direction the gun is pointing, and deserve some explanation.</p>
<p>The key is the function getRelativeVector:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;">Vec3 NodePath.<span class="me1">getRelativeVector</span><span class="br0">&#40;</span>NodePath N,Vec3 V<span class="br0">&#41;</span></div>
</div>
<p>which takes the vector <b>V</b> relative to NodePath <b>N</b>, and returns an equivalent vector relative to the NodePath you use to call the method.  Here's how it's used.</p>
<p>the vector fvec (0,1,0) points forward along the Y axis - it's a Forward Vector.  What we want is to make the bullet move forward, but in the direction the gun is pointing.  We could get that effect by simply parenting the bullet to the gun, but then the bullet would move as the gun rotates even after it's in flight.  </p>
<p>So what we want is a new vector, in world coordinates, pointing forward from the gun.  That's where getRelativeVector comes in - given the forward vector in the gun's coordinate system, it finds the equivalent vector in the world <strong>render</strong> coordinate system.</p>
<p>Note that you can launch as many bullets as you want.  The <b>bullet</b> variable is temporary, since it's a local variable within the fire() method; but the bullet objects you've spawned all stay around.  In some cases you'll want to add these to a list or keep track of them in some other way, but for this example it won't be necessary - we can store everything we need via the scene graph.</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># -*- coding: utf-8 -*-</span><br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">actor</span>.<span class="me1">Actor</span> <span class="kw1">import</span> Actor<br />
<span class="kw1">from</span> direct.<span class="me1">interval</span>.<span class="me1">ActorInterval</span> <span class="kw1">import</span> ActorInterval<br />
<span class="kw1">from</span> direct.<span class="me1">interval</span>.<span class="me1">IntervalGlobal</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span>.<span class="me1">DirectObject</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> MousePickingManager<br />
<span class="kw1">import</span> <span class="kw3">random</span></p>
<p>GRAVITY = Vec3 <span class="br0">&#40;</span>0,0,-2<span class="br0">&#41;</span></p>
<p><span class="kw1">class</span> Bullet:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">velocity</span>=Vec3<span class="br0">&#40;</span>0,0,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">updateTask</span> = taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;models/ball&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setScale</span><span class="br0">&#40;</span>.25<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">lastTime</span>=0<br />
&nbsp; &nbsp; <br />
&nbsp; <span class="kw1">def</span> setVelocity <span class="br0">&#40;</span><span class="kw2">self</span>,v<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">velocity</span>=v<br />
&nbsp; &nbsp; <span class="co1">#print self.velocity</span><br />
&nbsp; &nbsp;<br />
&nbsp; <span class="kw1">def</span> setPos<span class="br0">&#40;</span><span class="kw2">self</span>,v<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>v<span class="br0">&#41;</span><br />
&nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; dt=task.<span class="me1">getElapsedTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-<span class="kw2">self</span>.<span class="me1">lastTime</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">lastTime</span>=task.<span class="me1">getElapsedTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="co1">#print dt,task.getDt()</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">velocity</span> = <span class="kw2">self</span>.<span class="me1">velocity</span> + <span class="br0">&#40;</span>GRAVITY <span class="sy0">*</span> dt<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="co1">#print task.getDt(),self.velocity,self.obj.getPos()</span><br />
&nbsp; &nbsp; delta = <span class="kw2">self</span>.<span class="me1">velocity</span> <span class="sy0">*</span> dt<br />
&nbsp; &nbsp; <span class="co1">#print task.getElapsedTime(),self.velocity.getY(),self.obj.getY()</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">#print delta.getY()</span><br />
&nbsp; &nbsp; newPos = <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">getPos</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + <span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">velocity</span> <span class="sy0">*</span> dt<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> newPos.<span class="me1">getZ</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&lt;</span> 0:<br />
&nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>newPos<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">removeNode</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; taskMgr.<span class="me1">remove</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">updateTask</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">del</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span> &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">obj</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>newPos<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="co1">#print self.obj.getPos()</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> task.<span class="me1">cont</span></p>
<p>
<span class="kw1">class</span> World<span class="br0">&#40;</span>DirectObject<span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span>=MousePickingManager.<span class="me1">MousePickingManager</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; terrain=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;models/terrain&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; terrain.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; terrain.<span class="me1">setScale</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">3</span>,<span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; light1=render.<span class="me1">attachNewNode</span><span class="br0">&#40;</span>PointLight<span class="br0">&#40;</span><span class="st0">&quot;light1&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; light1.<span class="me1">setPos</span><span class="br0">&#40;</span>0,0,20<span class="br0">&#41;</span><br />
&nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span>light1<span class="br0">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span>0,0,1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; base.<span class="me1">setBackgroundColor</span><span class="br0">&#40;</span>.3,.3,7<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">gun</span>=loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;models/gun&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">gun</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>0,.8,.65<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">gun</span>.<span class="me1">setScale</span><span class="br0">&#40;</span>.5<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">gun</span>.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="co1">#self.gun.setHpr(15,0,0)</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span><span class="br0">&#40;</span><span class="st0">&quot;mouseDown&quot;</span>,<span class="kw2">self</span>.<span class="me1">onMouseDown</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span class="kw1">def</span> onMouseDown<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">fire</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; <span class="kw1">def</span> fire<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; bullet = Bullet<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; fvec = Vec3<span class="br0">&#40;</span>0,1,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; bullet.<span class="me1">setVelocity</span><span class="br0">&#40;</span>render.<span class="me1">getRelativeVector</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">gun</span>,fvec<span class="sy0">*</span>20<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; bullet.<span class="me1">setPos</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">gun</span>.<span class="me1">getPos</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + render.<span class="me1">getRelativeVector</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">gun</span>,fvec<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; p=<span class="kw2">self</span>.<span class="me1">mousemanager</span>.<span class="me1">getMouse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">gun</span>.<span class="me1">setHpr</span><span class="br0">&#40;</span>p.<span class="me1">getX</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">*</span> -45,<span class="br0">&#40;</span>p.<span class="me1">getY</span><span class="br0">&#40;</span><span class="br0">&#41;</span>+1<span class="br0">&#41;</span><span class="sy0">*</span>15,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> task.<span class="me1">cont</span><br />
&nbsp; &nbsp; <br />
w=World<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://bcchang.com/immersive_blog/?feed=rss2&#038;p=741</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mouse example &#8211; object follows mouse</title>
		<link>http://bcchang.com/immersive_blog/?p=740</link>
		<comments>http://bcchang.com/immersive_blog/?p=740#comments</comments>
		<pubDate>Thu, 08 Apr 2010 19:34:13 +0000</pubDate>
		<dc:creator>Ben Chang</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://bcchang.com/immersive_blog/?p=740</guid>
		<description><![CDATA[# Mouse Example 4 # Moving an object around to follow the mouse from pandac.PandaModules import * from direct.task import * from direct.showbase import DirectObject import direct.directbase.DirectStart import random from MousePickingManager import * class World&#40;DirectObject.DirectObject&#41;: &#160; def __init__&#40;self&#41;: &#160; &#160; self.mousemanager = MousePickingManager&#40;self&#41; &#160; &#160; taskMgr.add&#40;self.update,&#34;update&#34;&#41; &#160; &#160; self.hand = loader.loadModel&#40;&#34;models/hand&#34;&#41; &#160; &#160; self.hand.reparentTo&#40;render&#41; &#160; [...]]]></description>
			<content:encoded><![CDATA[<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># Mouse Example 4</span><br />
<span class="co1"># Moving an object around to follow the mouse</span></p>
<p><span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">import</span> <span class="kw3">random</span></p>
<p><span class="kw1">from</span> MousePickingManager <span class="kw1">import</span> <span class="sy0">*</span></p>
<p><span class="kw1">class</span> World<span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:</p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span> = MousePickingManager<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">hand</span> = loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;models/hand&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">hand</span>.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-10,0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">light</span> = render.<span class="me1">attachNewNode</span><span class="br0">&#40;</span>PointLight<span class="br0">&#40;</span><span class="st0">'light1'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">light</span>.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">light</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-50,50<span class="br0">&#41;</span><br />
&nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">light</span><span class="br0">&#41;</span></p>
<p>
&nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="co1"># get the current position of the mouse on the screen</span><br />
&nbsp; &nbsp; mousepos = <span class="kw2">self</span>.<span class="me1">mousemanager</span>.<span class="me1">getMouse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; x=mousepos.<span class="me1">getX</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">*</span> 4<br />
&nbsp; &nbsp; y=mousepos.<span class="me1">getY</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">*</span> 4</p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">hand</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>x,0,y<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">return</span> Task.<span class="me1">cont</span></p>
<p>w=World<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://bcchang.com/immersive_blog/?feed=rss2&#038;p=740</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rotate object to follow mouse</title>
		<link>http://bcchang.com/immersive_blog/?p=739</link>
		<comments>http://bcchang.com/immersive_blog/?p=739#comments</comments>
		<pubDate>Thu, 08 Apr 2010 19:33:40 +0000</pubDate>
		<dc:creator>Ben Chang</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://bcchang.com/immersive_blog/?p=739</guid>
		<description><![CDATA[# Rotate a model based on mouse movement from pandac.PandaModules import * from direct.task import * from direct.showbase import DirectObject import direct.directbase.DirectStart import random from MousePickingManager import * class World&#40;DirectObject.DirectObject&#41;: &#160; def __init__&#40;self&#41;: &#160; &#160; self.mousemanager = MousePickingManager&#40;self&#41; &#160; &#160; taskMgr.add&#40;self.update,&#34;update&#34;&#41; &#160; &#160; self.eye = loader.loadModel&#40;&#34;models/eye&#34;&#41; &#160; &#160; self.eye.reparentTo&#40;render&#41; &#160; &#160; camera.setPos&#40;0,-10,0&#41; &#160; def update&#40;self,task&#41;: [...]]]></description>
			<content:encoded><![CDATA[<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># Rotate a model based on mouse movement</span></p>
<p><span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">import</span> <span class="kw3">random</span></p>
<p><span class="kw1">from</span> MousePickingManager <span class="kw1">import</span> <span class="sy0">*</span></p>
<p><span class="kw1">class</span> World<span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:</p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span> = MousePickingManager<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">eye</span> = loader.<span class="me1">loadModel</span><span class="br0">&#40;</span><span class="st0">&quot;models/eye&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">eye</span>.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span><br />
&nbsp; &nbsp; camera.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-10,0<span class="br0">&#41;</span></p>
<p>&nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="co1"># get the current position of the mouse on the screen</span><br />
&nbsp; &nbsp; mousepos = <span class="kw2">self</span>.<span class="me1">mousemanager</span>.<span class="me1">getMouse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; x=mousepos.<span class="me1">getX</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; y=mousepos.<span class="me1">getY</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">print</span> x,y</p>
<p>&nbsp; &nbsp; xangle = x <span class="sy0">*</span> 45<br />
&nbsp; &nbsp; yangle = y <span class="sy0">*</span> -45</p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">eye</span>.<span class="me1">setH</span><span class="br0">&#40;</span>xangle<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">eye</span>.<span class="me1">setP</span><span class="br0">&#40;</span>yangle<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> Task.<span class="me1">cont</span></p>
<p>w=World<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://bcchang.com/immersive_blog/?feed=rss2&#038;p=739</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Navigation, dragging, collision example</title>
		<link>http://bcchang.com/immersive_blog/?p=738</link>
		<comments>http://bcchang.com/immersive_blog/?p=738#comments</comments>
		<pubDate>Thu, 08 Apr 2010 19:32:36 +0000</pubDate>
		<dc:creator>Ben Chang</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://bcchang.com/immersive_blog/?p=738</guid>
		<description><![CDATA[NavigationExample_1.tar]]></description>
			<content:encoded><![CDATA[<p><a href='http://bcchang.com/immersive_blog/wp-content/uploads/2010/04/NavigationExample_1.tar.gz'>NavigationExample_1.tar</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bcchang.com/immersive_blog/?feed=rss2&#038;p=738</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mouse Examples</title>
		<link>http://bcchang.com/immersive_blog/?p=735</link>
		<comments>http://bcchang.com/immersive_blog/?p=735#comments</comments>
		<pubDate>Thu, 08 Apr 2010 15:34:53 +0000</pubDate>
		<dc:creator>Ben Chang</dc:creator>
				<category><![CDATA[Panda]]></category>

		<guid isPermaLink="false">http://bcchang.com/immersive_blog/?p=735</guid>
		<description><![CDATA[Mouse Examples Set 1 # Mouse Example 1 # Getting mouse position and checking the buttons from pandac.PandaModules import * from direct.task import * from direct.showbase import DirectObject import direct.directbase.DirectStart import random from MousePickingManager import * class World&#40;DirectObject.DirectObject&#41;: &#160; def __init__&#40;self&#41;: &#160; &#160; self.mousemanager = MousePickingManager&#40;self&#41; &#160; &#160; taskMgr.add&#40;self.update,&#34;update&#34;&#41; &#160; def update&#40;self,task&#41;: &#160; &#160; # [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Mouse Examples Set 1</strong></p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># Mouse Example 1</span><br />
<span class="co1"># Getting mouse position and checking the buttons</span></p>
<p><span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">import</span> <span class="kw3">random</span></p>
<p><span class="kw1">from</span> MousePickingManager <span class="kw1">import</span> <span class="sy0">*</span></p>
<p><span class="kw1">class</span> World<span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span> = MousePickingManager<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="co1"># get the current position of the mouse on the screen</span><br />
&nbsp; &nbsp; mousepos = <span class="kw2">self</span>.<span class="me1">mousemanager</span>.<span class="me1">getMouse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> mousepos<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; leftbutton = <span class="kw2">self</span>.<span class="me1">mousemanager</span>.<span class="me1">getButtonState</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">print</span> leftbutton<br />
&nbsp; &nbsp; <span class="kw1">return</span> Task.<span class="me1">cont</span></p>
<p>w=World<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<p><span id="more-735"></span></p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># Mouse Example 2</span><br />
<span class="co1"># mouseUp and mouseDown events</span></p>
<p><span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">import</span> <span class="kw3">random</span></p>
<p><span class="kw1">from</span> MousePickingManager <span class="kw1">import</span> <span class="sy0">*</span></p>
<p><span class="kw1">class</span> World<span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:</p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span> = MousePickingManager<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span> <span class="br0">&#40;</span><span class="st0">&quot;mouseDown&quot;</span>,<span class="kw2">self</span>.<span class="me1">onMouseDown</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span> <span class="br0">&#40;</span><span class="st0">&quot;mouseUp&quot;</span>,<span class="kw2">self</span>.<span class="me1">onMouseUp</span><span class="br0">&#41;</span></p>
<p>&nbsp; <span class="kw1">def</span> onMouseDown<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;CLICK&quot;</span></p>
<p>&nbsp; <span class="kw1">def</span> onMouseUp<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;RELEASE&quot;</span></p>
<p>&nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="co1"># get the current position of the mouse on the screen</span><br />
&nbsp; &nbsp; mousepos = <span class="kw2">self</span>.<span class="me1">mousemanager</span>.<span class="me1">getMouse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="co1">#print mousepos</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; leftbutton = <span class="kw2">self</span>.<span class="me1">mousemanager</span>.<span class="me1">getButtonState</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="co1">#print leftbutton</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> Task.<span class="me1">cont</span></p>
<p>w=World<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1"># Mouse Example 3</span><br />
<span class="co1"># start and stop an animation</span></p>
<p><span class="kw1">from</span> pandac.<span class="me1">PandaModules</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">task</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">from</span> direct.<span class="me1">showbase</span> <span class="kw1">import</span> DirectObject<br />
<span class="kw1">import</span> direct.<span class="me1">directbase</span>.<span class="me1">DirectStart</span><br />
<span class="kw1">import</span> <span class="kw3">random</span></p>
<p><span class="kw1">from</span> direct.<span class="me1">actor</span>.<span class="me1">Actor</span> <span class="kw1">import</span> Actor</p>
<p><span class="kw1">from</span> MousePickingManager <span class="kw1">import</span> <span class="sy0">*</span></p>
<p><span class="kw1">class</span> World<span class="br0">&#40;</span>DirectObject.<span class="me1">DirectObject</span><span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:</p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">mousemanager</span> = MousePickingManager<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; taskMgr.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">update</span>,<span class="st0">&quot;update&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span> <span class="br0">&#40;</span><span class="st0">&quot;mouseDown&quot;</span>,<span class="kw2">self</span>.<span class="me1">onMouseDown</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">accept</span> <span class="br0">&#40;</span><span class="st0">&quot;mouseUp&quot;</span>,<span class="kw2">self</span>.<span class="me1">onMouseUp</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; base.<span class="me1">setBackgroundColor</span><span class="br0">&#40;</span>.8,.8,.8<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; light1 = render.<span class="me1">attachNewNode</span> <span class="br0">&#40;</span>PointLight<span class="br0">&#40;</span><span class="st0">&quot;light1&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; render.<span class="me1">setLight</span><span class="br0">&#40;</span>light1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; light1.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-50,20<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; base.<span class="me1">disableMouse</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; base.<span class="me1">cam</span>.<span class="me1">setPos</span><span class="br0">&#40;</span>0,-50,10<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">hair</span> = Actor <span class="br0">&#40;</span><span class="st0">&quot;models/hair.egg&quot;</span>,<span class="br0">&#123;</span><span class="st0">&quot;clip1&quot;</span>:<span class="st0">&quot;models/hair_anim.egg&quot;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">hair</span>.<span class="me1">reparentTo</span><span class="br0">&#40;</span>render<span class="br0">&#41;</span></p>
<p>&nbsp; <span class="kw1">def</span> onMouseDown<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">hair</span>.<span class="me1">loop</span><span class="br0">&#40;</span><span class="st0">&quot;clip1&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; <span class="kw1">def</span> onMouseUp<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">hair</span>.<span class="me1">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; <span class="kw1">def</span> update<span class="br0">&#40;</span><span class="kw2">self</span>,task<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">return</span> Task.<span class="me1">cont</span></p>
<p>w=World<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
run<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://bcchang.com/immersive_blog/?feed=rss2&#038;p=735</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

