<?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>Flexmaniak.pl &#187; dae</title>
	<atom:link href="http://blog.flexmaniak.pl/tag/dae/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.flexmaniak.pl</link>
	<description>Flex, Papervision3D, PHP, Symfony</description>
	<lastBuildDate>Sat, 07 Aug 2010 11:49:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Collada i Papervision3D &#8211; Wczytanie modelu i obsługa zdarzeń</title>
		<link>http://blog.flexmaniak.pl/flex/papervision3d/collada-i-papervision3d-wczytanie-modelu-i-obsluga-zdarzen</link>
		<comments>http://blog.flexmaniak.pl/flex/papervision3d/collada-i-papervision3d-wczytanie-modelu-i-obsluga-zdarzen#comments</comments>
		<pubDate>Wed, 25 Nov 2009 00:12:44 +0000</pubDate>
		<dc:creator>Piotr Wierzgała</dc:creator>
				<category><![CDATA[Papervision3D]]></category>
		<category><![CDATA[collada]]></category>
		<category><![CDATA[dae]]></category>

		<guid isPermaLink="false">http://blog.na14.pl/wordpress/?p=135</guid>
		<description><![CDATA[Collada (.dae) to jeden z popularniejszych formatów modeli 3D dla Papervision. Możliwość tworzenia modeli 3D i stosowania ich w projektach przynosi ze sobą wiele nowych perspektyw dlatego warto poznać przynajmniej podstawy związane z ich obsługą. W tym wpisie pokażę jak użyć parsera plików .dae w celu dodania modelu do sceny, w jaki sposób uzyskać dostęp [...]]]></description>
			<content:encoded><![CDATA[<p>Collada (.dae) to jeden z popularniejszych formatów modeli 3D dla Papervision. Możliwość tworzenia modeli 3D i stosowania ich w projektach przynosi ze sobą wiele nowych perspektyw dlatego warto poznać przynajmniej podstawy związane z ich obsługą. W tym wpisie pokażę jak użyć parsera plików .dae w celu dodania modelu do sceny, w jaki sposób uzyskać dostęp do poszczególnych składowych (obiektów) modelu oraz jak uczynić je interaktywnymi poprzez dodanie nasłuchiwania wybranych zdarzeń.<br />
<span id="more-135"></span><br />
FLEX: 3.0, Papervision3D: 2.0.883<br />
<embed src="http://blog.na14.pl/examples/DAEModel/DAEModel.swf" width="100%" height="350"></embed><br />
<a href="http://blog.na14.pl/examples/DAEModel/DAEModel.zip">Pobierz źródła przykładu</a><br />
<br/><br />
Przed przeczytaniem tego wpisu warto zapoznać się z:<br />
<a href="http://blog.na14.pl/wordpress/papervision3d/pierwsze-kroki-z-papervision3d">Pierwsze kroki z Papervision3D</a></p>
<p></br><br />
<strong>Pola klasy</strong><br />
Pola klasy jakie w tym przykładzie będą nam potrzebne to:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> dae:DAE;<br />
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> head:DisplayObject3D;<br />
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> neck:DisplayObject3D; <br />
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> light:LightObject3D;<br />
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> phongMaterialOver:PhongMaterial;<br />
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> phongMaterialOut:PhongMaterial;</div></div>
<p><u>dae </u>- Parser plików dae.<br />
<u>head</u>, <u>neck </u>- Części składowe (obiekty) modelu.<br />
<u>light </u>- Światło niezbędne do zastosowania materiału typu PhongMaterial.<br />
<u>phongMaterialOver</u>, <u>phongMaterialOut </u> &#8211; materiały modelu.</p>
<p></br><br />
<strong>Funkcja inicjalizująca obiekty 3D</strong></p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> init3d<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; dae = <span style="color: #000000; font-weight: bold;">new</span> DAE;<br />
&nbsp; &nbsp; light = <span style="color: #000000; font-weight: bold;">new</span> PointLight3D<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">true</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; phongMaterialOver = <span style="color: #000000; font-weight: bold;">new</span> PhongMaterial<span style="color: #66cc66;">&#40;</span>light,0xdedede,0x333333,<span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; phongMaterialOver.<span style="color: #006600;">interactive</span> = <span style="color: #000000; font-weight: bold;">true</span>;<br />
&nbsp; &nbsp; phongMaterialOut = <span style="color: #000000; font-weight: bold;">new</span> PhongMaterial<span style="color: #66cc66;">&#40;</span>light,0x333333,0xdedede,<span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; phongMaterialOut.<span style="color: #006600;">interactive</span> = <span style="color: #000000; font-weight: bold;">true</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; dae.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>IOErrorEvent.<span style="color: #006600;">IO_ERROR</span>,daeFileIOErrorEventHandler<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; dae.<span style="color: #0066CC;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;com/model.dae&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>Tworzymy instancje parsera i światła a następnie materiały modelu stosowane odpowiednio do zdarzeń OBJECT_OVER i OBJECT_OUT. Na koniec dodajemy nasłuchiwanie zdarzenia wczytania modelu po czym rozpoczynamy jego wczytywanie.</p>
<p><br/><br />
<strong>Funkcja obsługująca zdarzenie zakończenia wczytywania modelu</strong></p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> daeFileLoadCompleteEventHandler<span style="color: #66cc66;">&#40;</span>event:FileLoadEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; scene.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>dae<span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; head = dae.<span style="color: #006600;">getChildByName</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Head&quot;</span>,<span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; neck = dae.<span style="color: #006600;">getChildByName</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Neck&quot;</span>,<span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; head.<span style="color: #006600;">material</span> = phongMaterial;<br />
&nbsp; &nbsp; neck.<span style="color: #006600;">material</span> = phongMaterial;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; addInteractiveEventListeners<span style="color: #66cc66;">&#40;</span>dae,InteractiveScene3DEvent.<span style="color: #006600;">OBJECT_OVER</span>,objectOverEventHandler<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; addInteractiveEventListeners<span style="color: #66cc66;">&#40;</span>dae,InteractiveScene3DEvent.<span style="color: #006600;">OBJECT_OUT</span>,objectOutEventHandler<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>Funkcja obsługująca zdarzenie zakończenia wczytywania modelu dodaje go do sceny a następnie przypisuje zmiennym head i neck jego odpowiednie składowe. Nazwy składowych nadaje się podczas tworzenia modelu, ale jeżeli korzystamy z gotowca to albo otwieramy go w jakimś programie do modelowania 3D (np. Blender) i tam sprawdzamy jak nazywają się jego części albo kompilujemy projekt w trybie debug i tam w konsoli, po wczytaniu modelu, powinny pojawić się wszystkie szukane nazwy.<br />
Kiedy mamy już referencje do składowych modelu przypisujemy im wybrany przez nas materiał i dodajemy do nich nasłuchiwanie odpowiednich zdarzeń.</p>
<p><br/><br />
<strong>Funkcja dodająca nasłuchiwanie zdarzeń do modelu</strong></p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> addInteractiveEventListeners<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">object</span>:DisplayObject3D, eventType:<span style="color: #0066CC;">String</span>, handler:<span style="color: #000000; font-weight: bold;">Function</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">object</span>.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>eventType, handler<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #b1b100;">for</span> <span style="color: #b1b100;">each</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> child:DisplayObject3D <span style="color: #b1b100;">in</span> <span style="color: #0066CC;">object</span>.<span style="color: #006600;">children</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; addInteractiveEventListeners<span style="color: #66cc66;">&#40;</span>child, eventType, handler<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>Użyta pod koniec ostatniego listingu funkcja addInteractiveEventListeners przyjmuje trzy parametry:<br />
<u>object</u> &#8211; Obiekt, do którego doda nasłuchiwanie zdarzenia.<br />
<u>eventType</u> &#8211; Typ zdarzenia jakie zostanie obsłużone.<br />
<u>handler</u> &#8211; identyfikator funkcji, która obsłuży zdarzenie typu eventType dla obiektu object.</p>
<p></br><br />
<strong>Funkcje obsługujące zdarzenia modelu</strong><br />
Na koniec pozostaje tylko zamieścić kod funkcji obsługujących zdarzenie OBJECT_OVER i OBJECT_OUT oraz stwierdzić, że podstawowe zagadnienie związane z obsługą modeli Collada mamy już opanowane.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> objectOverEventHandler<span style="color: #66cc66;">&#40;</span>event:InteractiveScene3DEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; event.<span style="color: #0066CC;">target</span>.<span style="color: #006600;">material</span> = compositeMaterial;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> objectOutEventHandler<span style="color: #66cc66;">&#40;</span>event:InteractiveScene3DEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; event.<span style="color: #0066CC;">target</span>.<span style="color: #006600;">material</span> = phongMaterial;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/papervision3d/collada-i-papervision3d-wczytanie-modelu-i-obsluga-zdarzen/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
