<?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; prosta</title>
	<atom:link href="http://blog.flexmaniak.pl/tag/prosta/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>
	</channel>
</rss>

