<?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; 2D</title>
	<atom:link href="http://blog.flexmaniak.pl/tag/2d/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.flexmaniak.pl</link>
	<description>Flex, Papervision3D, PHP, Symfony</description>
	<lastBuildDate>Sun, 02 Oct 2011 08:36:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Obliczanie współrzędnych kliknięcia (2D) w przestrzeni (3D)</title>
		<link>http://blog.flexmaniak.pl/flex-libraries/papervision3d/obliczanie-wspolrzednych-klikniecia-2d-w-przestrzeni-3d</link>
		<comments>http://blog.flexmaniak.pl/flex-libraries/papervision3d/obliczanie-wspolrzednych-klikniecia-2d-w-przestrzeni-3d#comments</comments>
		<pubDate>Thu, 10 Dec 2009 00:07:29 +0000</pubDate>
		<dc:creator>Piotr Wierzgała</dc:creator>
				<category><![CDATA[Papervision3D 2.1]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[prosta]]></category>
		<category><![CDATA[płaszczyzna]]></category>
		<category><![CDATA[unproject]]></category>

		<guid isPermaLink="false">http://blog.na14.pl/wordpress/?p=162</guid>
		<description><![CDATA[Wpis pokazuje w jaki sposób przenieść punkt kliknięcia o jeden wymiar dalej czyli jak na podstawie współrzędnych ekranowych (2D) obliczyć współrzędne odpowiadającego im punktu w przestrzeni (3D). FLEX: 3.0, Papervision3D: 2.0.883 Pobierz źródła przykładu Poniższy kod napisałem w oparciu o tekst Andy&#8217;ego Zupko Dragging in 3D &#8211; The Right Way. Zadanie przeniesienia współrzędnych kliknięcia do [...]]]></description>
			<content:encoded><![CDATA[<p>Wpis pokazuje w jaki sposób przenieść punkt kliknięcia o jeden wymiar dalej czyli jak na podstawie współrzędnych ekranowych (2D) obliczyć współrzędne odpowiadającego im punktu w przestrzeni (3D).<br />
<span id="more-162"></span><br />
FLEX: 3.0, Papervision3D: 2.0.883<br />
<embed src="http://blog.na14.pl/examples/2Dto3D/2Dto3D.swf" width="100%" height="350"></embed><br />
<a href="http://blog.na14.pl/examples/2Dto3D/2Dto3D.zip">Pobierz źródła przykładu</a></p>
<p>Poniższy kod napisałem w oparciu o tekst Andy&#8217;ego Zupko <a href="http://blog.zupko.info/?p=143">Dragging in 3D &#8211; The Right Way</a>.</p>
<p>Zadanie przeniesienia współrzędnych kliknięcia do przestrzeni, w skrócie, będzie polegało na znalezieniu punktu przecięcia prostej z płaszczyzną. Prostą zdefiniujemy na podstawie współrzędnych położenia kamery oraz punktu kliknięcia. Płaszczyznę natomiast określimy jednoznacznie za pomocą wektora normalnego tożsamego z wektorem wyznaczającym kierunek spoglądania kamery oraz dowolnego punktu leżącego na tej płaszczyźnie.</p>
<p>Tym wszystkim zajmie się funkcja convert2Dto3D, której kod zamieszczam poniżej wraz z objaśnieniem:</p>
<p>Funkcja convert2Dto3D przyjmuje dwa parametry:<br />
<u>distance</u> typu Number &#8211; Odległość od kamery w jakiej będzie znajdować się punkt w przestrzeni.<br />
<u>viewportClickPoint</u> typu Number2D &#8211; Współrzędne kliknięcia w viewport (viewport.containerSprite.mouseX, viewport.containerSprite.mouseY).</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:100%;"><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> convert2Dto3D<span style="color: #66cc66;">&#40;</span>distance:<span style="color: #0066CC;">Number</span>,viewportClickPoint:Number2D<span style="color: #66cc66;">&#41;</span>:Number3D <span style="color: #66cc66;">&#123;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> unprojectedPoint:Number3D;<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> intersectPoint:Number3D;<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> plane3d:Plane3D = <span style="color: #000000; font-weight: bold;">new</span> Plane3D<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> planeNormal: Number3D = forward.<span style="color: #006600;">clone</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; Matrix3D.<span style="color: #006600;">multiplyVector</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">camera</span>.<span style="color: #006600;">transform</span>,planeNormal<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; planeNormal.<span style="color: #006600;">normalize</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> planeVertex:Number3D = planeNormal.<span style="color: #006600;">clone</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; plane3d.<span style="color: #006600;">setNormalAndPoint</span><span style="color: #66cc66;">&#40;</span>planeNormal, planeVertex<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; unprojectedPoint= <span style="color: #0066CC;">camera</span>.<span style="color: #006600;">unproject</span><span style="color: #66cc66;">&#40;</span>viewportClickPoint.<span style="color: #006600;">x</span>,viewportClickPoint.<span style="color: #006600;">y</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; unprojectedPoint= Number3D.<span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span>unprojectedPoint, <span style="color: #0066CC;">camera</span>.<span style="color: #0066CC;">position</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; intersectPoint= plane3d.<span style="color: #006600;">getIntersectionLineNumbers</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">camera</span>.<span style="color: #0066CC;">position</span>, unprojectedPoint<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; intersectPoint.<span style="color: #006600;">normalize</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; intersectPoint.<span style="color: #006600;">multiplyEq</span><span style="color: #66cc66;">&#40;</span>distance<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> intersectPoint;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p><strong>Zdefiniowanie płaszczyzny</strong><br />
Zmienna planeNormal początkowo jest kopią wektora <em>forward</em> wyznaczającego kierunek &#8220;do przodu&#8221; czyli ten, w którym przez cały czas spogląda kamera:</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> const forward: Number3D = <span style="color: #000000; font-weight: bold;">new</span> Number3D<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">0</span>,-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Ponieważ możemy obracać kamerą wektor ten ulega zmianie zgodnie ze zmianą wartości kątów obrotu kamery. Żeby znać aktualny wektor wyznaczający kierunek w jakim spogląda kamera musimy pomnożyć wektor <em>forward</em> przez macierz transformacji kamery. Po wykonaniu operacji mnożenia normalizujemy otrzymany wektor.<br />
Żeby jednoznacznie określić płaszczyznę w przestrzeni musimy jeszcze znać współrzędne dowolnego punktu leżącego na tej płaszczyźnie. W tym celu użyjemy współrzędnych obliczonego przed chwilą wektora, który możemy potraktować jako punkt leżący w satysfakcjonującym nas miejscu. Nie musimy przejmować się odległością w jakiej znajdzie się punkt przecięcia prostej z płaszczyzną ponieważ pod koniec skorygujemy ją sobie zgodnie z parametrem <em>distance</em>.</p>
<p><strong>Zdefiniowanie prostej</strong><br />
Jednym z punktów, który posłuży do zdefiniowania prostej w przestrzeni będzie punkt położenia kamery. Drugim zaś punkt powstały przez zastosowanie metody <em>unproject</em> obiektu kamery na współrzędnych kliknięcia. Funkcja <em>unproject</em> wykonuje operację odwrotną do rzutowania (projekcji współrzędnych 3D na 2D) w wyniku, której otrzymujemy punkt 3D leżący na przedniej płaszczyźnie odcinania. Na koniec dodajemy do drugiego punktu współrzędne położenia kamery w celu uzyskania jego rzeczywistego położenia w przestrzeni.</p>
<p><strong>Punkt przecięcia prostej i płaszczyzny</strong><br />
Punkt przecięcia prostej i płaszczyzny oblicza metoda <em>getIntersectionLineNumbers</em> obiektu Plane3D, która jako parametry przyjmuje dwa punkty definiujące prostą.</p>
<p><strong>Korekcja współrzędnych punktu przecięcia</strong><br />
Założeniem naszej funkcji jest obliczanie współrzędnych 3D klikniętego punktu w odległości od kamery określonej przez parametr <em>distance</em>. W tym celu wystarczy znormalizować otrzymany punkt przecięcia i pomnożyć przez parametr <em>distance</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex-libraries/papervision3d/obliczanie-wspolrzednych-klikniecia-2d-w-przestrzeni-3d/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rzutowanie współrzędnych 3D na 2D</title>
		<link>http://blog.flexmaniak.pl/flex-libraries/papervision3d/rzutowanie-wspolrzednych-3d-na-2d</link>
		<comments>http://blog.flexmaniak.pl/flex-libraries/papervision3d/rzutowanie-wspolrzednych-3d-na-2d#comments</comments>
		<pubDate>Wed, 04 Nov 2009 21:41:24 +0000</pubDate>
		<dc:creator>Piotr Wierzgała</dc:creator>
				<category><![CDATA[Papervision3D 2.1]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[calculateScreenCoords]]></category>
		<category><![CDATA[rzutowanie współrzędnych]]></category>

		<guid isPermaLink="false">http://blog.na14.pl/wordpress/?p=95</guid>
		<description><![CDATA[Jeżeli szukasz odpowiedzi na pytanie jak rzutować współrzędne 3D na 2D to trafiłeś w dobre miejsce. W tym wpisie rozwijam ten problem w oparciu o użycie metody calculateScreenCoords dostępnej we wszystkich obiektach dziedziczących po DisplayObject3D. FLEX: 3.0, Papervision3D: 2.0.883 Zaczynamy od utworzenia klasy dziedziczącej po BasicView. Jeżeli ktoś nie ma doświadczenia z Papervision3D to polecam [...]]]></description>
			<content:encoded><![CDATA[<p>Jeżeli szukasz odpowiedzi na pytanie jak rzutować współrzędne 3D na 2D to trafiłeś w dobre miejsce. W tym wpisie rozwijam ten problem w oparciu o użycie metody calculateScreenCoords dostępnej we wszystkich obiektach dziedziczących po DisplayObject3D.<br />
<span id="more-95"></span><br />
FLEX: 3.0, Papervision3D: 2.0.883<br />
<embed src="http://blog.na14.pl/examples/3Dto2D/3Dto2D.swf" width="100%" height="350"></embed></p>
<p>Zaczynamy od utworzenia klasy dziedziczącej po BasicView. Jeżeli ktoś nie ma doświadczenia z Papervision3D to polecam najpierw zapoznać się z wpisem: <a href="http://blog.na14.pl/wordpress/papervision3d/pierwsze-kroki-z-papervision3d">Pierwsze kroki z Papervision3D</a>. Do klasy dodajemy trzy pola:</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> plane:Plane;<br />
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> vertexPlane:Plane;<br />
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> vertices2dSprite:Sprite;</div></div>
<p>Zmienna plane posłuży jako obiekt, którego współrzędne wierzchołków 3D będziemy rzutować na 2D. Zmienna vertexPlane jest niezbędna do rzutowania wspomnianych wierzchołków (ale o tym zaraz), natomiast vertices2dSprite to zwykły sprite, na którym będziemy wizualizować rzutowane wierzchołki.</p>
<p>Dodajmy teraz do naszej klasy metodę init3D(), w której wstawiamy na scenę wszystkie niezbędne w tym przykładzie obiekty 3D:</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; <span style="color: #000000; font-weight: bold;">var</span> wireframeMaterial: WireframeMaterial = <span style="color: #000000; font-weight: bold;">new</span> WireframeMaterial<span style="color: #66cc66;">&#40;</span>0x000000<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> colorMaterial:ColorMaterial = <span style="color: #000000; font-weight: bold;">new</span> ColorMaterial<span style="color: #66cc66;">&#40;</span>0xffffff<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> planeMaterial:CompositeMaterial = <span style="color: #000000; font-weight: bold;">new</span> CompositeMaterial;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; planeMaterial.<span style="color: #006600;">addMaterial</span><span style="color: #66cc66;">&#40;</span>colorMaterial<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; planeMaterial.<span style="color: #006600;">addMaterial</span><span style="color: #66cc66;">&#40;</span>wireframeMaterial<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; planeMaterial.<span style="color: #006600;">doubleSided</span> = <span style="color: #000000; font-weight: bold;">true</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; plane = <span style="color: #000000; font-weight: bold;">new</span> Plane<span style="color: #66cc66;">&#40;</span>planeMaterial,<span style="color: #cc66cc;">250</span>,<span style="color: #cc66cc;">250</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; scene.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>plane<span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; vertexPlane = <span style="color: #000000; font-weight: bold;">new</span> Plane<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">null</span>,<span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; scene.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>vertexPlane<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>Oraz metodę init2D dodającą do aplikacji sprite, na którym odrysujemy rzutowane wierzchołki:</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> init2D<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; vertices2dSprite = <span style="color: #000000; font-weight: bold;">new</span> Sprite;<br />
&nbsp; &nbsp; addChild<span style="color: #66cc66;">&#40;</span>vertices2dSprite<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>Przejdźmy teraz do sedna sprawy a mianowicie do obliczania współrzędnych 2D i ich odrysowywania.</p>
<p>Pierwszą kwestią zajmie się nasza metoda o nazwie getPoint2D.</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;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getPoint2D<span style="color: #66cc66;">&#40;</span>do3d:DisplayObject3D<span style="color: #66cc66;">&#41;</span>:Number2D <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; singleRender<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; <br />
&nbsp; &nbsp; do3d.<span style="color: #006600;">calculateScreenCoords</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">camera</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Number2D<span style="color: #66cc66;">&#40;</span>do3d.<span style="color: #006600;">screen</span>.<span style="color: #006600;">x</span> + viewport.<span style="color: #006600;">viewportWidth</span><span style="color: #66cc66;">*</span><span style="color: #cc66cc;">0.5</span>, do3d.<span style="color: #006600;">screen</span>.<span style="color: #006600;">y</span> + viewport.<span style="color: #006600;">viewportHeight</span><span style="color: #66cc66;">*</span><span style="color: #cc66cc;">0.5</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>Metoda getPoint2D przyjmuje jako parametr dowolny obiekt typu DisplayObject3D i zwraca jego zrzutowane na 2D współrzędne. W tym celu na rzutowanym obiekcie wywołuje funkcję calculateScreenCoords, która jako parametr przyjmuje obiekt kamery względem, którego ma odbyć się rzutowanie. Wywołanie funkcji calculateScreenCoords powoduje ustawienie wartości dla pola screen rzutowanego obiektu. Pole screen zaś to nic innego jak struktura, która przechowuje pożądane współrzędne ekranowe (2D). Wiążą się z tym dwa szczegóły, na które trzeba zwrócić uwagę. </p>
<p>Pierwszy to taki, że żeby pole screen mogło zostać ustawione to obiekt dla którego wywoływana jest funkcja calculateScreenCoords musi być wyrenderowany (czyli też dodany do sceny przyp.). Dlatego też na samym początku omawianej metody wywołujemy funkcję singleRender klasy BasicView. </p>
<p>Druga kwestia to konieczność zwiększenia składowych pola screen odpowiednio o wartość połowy wysokości i szerokości viewportu. Dzieje się tak ponieważ współrzędne w polu screen liczone są od środka viewportu. </p>
<p>Teraz pozostało nam tylko odrysować to co umiemy już liczyć. Posłuży do tego nasza kolejna metoda:</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;">public</span> <span style="color: #000000; font-weight: bold;">function</span> calculate2DCoordinates<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; <span style="color: #000000; font-weight: bold;">var</span> vertex2D:Number2D;&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; vertices2dSprite.<span style="color: #006600;">graphics</span>.<span style="color: #0066CC;">beginFill</span><span style="color: #66cc66;">&#40;</span>0xffff00<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; vertices2dSprite.<span style="color: #006600;">graphics</span>.<span style="color: #0066CC;">lineStyle</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>,0x000000<span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; plane.<span style="color: #006600;">geometry</span>.<span style="color: #006600;">transformVertices</span><span style="color: #66cc66;">&#40;</span>plane.<span style="color: #006600;">transform</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> i:<span style="color: #0066CC;">Number</span>=<span style="color: #cc66cc;">0</span>; i<span style="color: #66cc66;">&lt;</span>plane.<span style="color: #006600;">geometry</span>.<span style="color: #006600;">vertices</span>.<span style="color: #0066CC;">length</span>; i++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; vertexPlane.<span style="color: #006600;">x</span> = plane.<span style="color: #006600;">geometry</span>.<span style="color: #006600;">vertices</span><span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">x</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; vertexPlane.<span style="color: #006600;">y</span> = plane.<span style="color: #006600;">geometry</span>.<span style="color: #006600;">vertices</span><span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">y</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; vertexPlane.<span style="color: #006600;">z</span> = plane.<span style="color: #006600;">geometry</span>.<span style="color: #006600;">vertices</span><span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">z</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; vertex2D = getPoint2D<span style="color: #66cc66;">&#40;</span>vertexPlane<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; vertices2dSprite.<span style="color: #006600;">graphics</span>.<span style="color: #006600;">drawCircle</span><span style="color: #66cc66;">&#40;</span>vertex2D.<span style="color: #006600;">x</span>,vertex2D.<span style="color: #006600;">y</span>,<span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; plane.<span style="color: #006600;">geometry</span>.<span style="color: #006600;">transformVertices</span><span style="color: #66cc66;">&#40;</span>Matrix3D.<span style="color: #006600;">inverse</span><span style="color: #66cc66;">&#40;</span>plane.<span style="color: #006600;">transform</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; vertices2dSprite.<span style="color: #006600;">graphics</span>.<span style="color: #0066CC;">beginFill</span><span style="color: #66cc66;">&#40;</span>0xff0000<span style="color: #66cc66;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; vertex2D = getPoint2D<span style="color: #66cc66;">&#40;</span>plane<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; vertices2dSprite.<span style="color: #006600;">graphics</span>.<span style="color: #006600;">drawCircle</span><span style="color: #66cc66;">&#40;</span>vertex2D.<span style="color: #006600;">x</span>,vertex2D.<span style="color: #006600;">y</span>,<span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; vertices2dSprite.<span style="color: #006600;">graphics</span>.<span style="color: #0066CC;">endFill</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>Warto tu zwrócić uwagę na to co się dzieje w miejscu wystąpienia pętli for. Ponieważ wierzchołki płaszczyzny nie dziedziczą po klasie DisplayObject3D dlatego nie ma możliwości ich bezpośredniego zrzutowania na 2D. Żeby to obejść korzystamy z dodatkowej, stworzonej w metodzie init3D płaszczyzny vertexPlane o wymiarach 1&#215;1. W pętli for iterujemy po wszystkich wierzchołkach ustawiając położenie vertexPlane zgodnie z aktualnie przetwarzanym a następnie rzutujemy współrzędne vertexPlane na 2D. </p>
<p>Żeby uzyskać poprawne odwzorowanie położenia rzutowanych wierzchołków przed pętlą musimy zastosować na nich macierz przekształceń obiektu do którego należą. W przeciwnym razie nie uwzględnione zostaną zmiany współrzędnych wierzchołków wynikające ze skalowania, obracania i przesunięcia plane&#8217;a. Ponieważ macierz transformacji odnosi się do bazowych wartości współrzędnych wierzchołków dlatego po wyjściu z pętli przywracamy je do stanu sprzed przekształcenia. W tym celu stosujemy na nich odwrotność macierzy transformacji. </p>
<p>Oprócz wierzchołków odrysowujemy też to co zwraca metoda getPoint2D dla plane&#8217;a (czerwona kropka). Dzięki temu widzimy, że po obliczeniu wartości pola screen zawiera ono współrzędne środka rzutowanego obiektu.</p>
<p><a href="http://blog.na14.pl/examples/2Dto3D/2Dto3D.zip">Pobierz źródła</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex-libraries/papervision3d/rzutowanie-wspolrzednych-3d-na-2d/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

