Article View: pl.comp.grafika.grafika3d
Article #90282[OpenGL, 3D] przekształcenie 2D do 3D
From: Wojciech "Spook" Sura
Date: Tue, 05 Aug 2008 17:17
Date: Tue, 05 Aug 2008 17:17
102 lines
6517 bytes
6517 bytes
Witam! Crosspost na pl.comp.grafika.grafika3d; pl.sci.matematyka i pl.comp.lang.delphi. Followup-to na pl.comp.lang.delphi Piszę program wykonujący pewne wizualizacje 3D. Wyświetla on na scenie widgety umożliwiające przekształcanie jej zawartości, a są one w postaci (mniej więcej) scrollbara (paska przewijania). Ogólny problem polega na tym, że użytkownik przeciąga suwak scrollbara na płaskim, dwuwymiarowym ekranie, ale przesunięcie następuje w przestrzeni trójwymiarowej, a ja nie umiem znaleźć sprytnego sposobu na wykonanie jakiejś transformacji 2D->3D by powiązać kliknięte przez usera miejsce z pewnym miejscem na trójwymiarowej scenie. Teraz bardziej formalnie. Na scenie dany jest pewien odcinek, wyznaczony - powiedzmy - punktem zaczepienia P3D i pewnym wektorem V3D. Jest on wizualizowany na odcinek na płaskim ekranie, który możemy opisać punktem zaczepienia P2D i pewnym wektorem V2D. Przekształcenie [punktu] w tą stronę realizowane jest pewnym iloczynem macierzy: I * P * R * R * T (x), gdzie: I - macierz jednostkowa (4x4 !) P - macierz perspektywy, która jest opisana na stronie: http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/frustum.html [1] R - pewne macierze rotacji T - pewna macierz translacji. Poszczególne macierze nie grają chyba specjalnej roli - dosyć, że mogę dobrać się bez problemów do każdej z osobna, mam kąty rotacji, mam wektor translacji, mam współrzędne perspektywy i tak dalej. Mam też wynikową macierz. Wynik (x1, y1) nałożenia na macierz wektora (x, y, z, 1) (pozostałe współrzędne są porzucane) jest liniowo skalowany na współrzędne ekranowe (wynikowe współrzędne są w zakresie od -1 do 1) i tak wyświetlany. Problem polega na tym, że mam dany pewien punkt (x1, y1) ekranowy (dla uproszczenia przyjmijmy, że zawsze należy on do "ekranowego" odcinka) i chciałbym przekształcić go teraz na punkt trójwymiarowy (x, y, z) leżący na trójwymiarowym odcinku w odpowiednim miejscu. Teoretycznie mógłbym próbować walczyć z macierzą odwrotną, ale nie mam niestety wartości z1 (będącej, de facto, odległością punktu na scenie od obserwatora), więc nie jestem w stanie wykonać przekształcenia odwrotnego. Myślałem o liniowym przenoszeniu pozycji myszy na odcinku z 2D do 3D, ale niestety nie jest to rozwiązanie najlepsze. Wyobraźmy sobie bowiem odcinek, którego lewa strona jest gdzieś daleko, prawa zaś blisko. Jeśli będę przesuwał liniowo mysz z lewej na prawą stronę, mysz będzie przesuwała się tak: a b c d e f -------------------------- Ale "marker" na trójwymiarowym odcinku zwizualizowany w dwóch wymiarach, a z uwagi na perspektywę, mniej więcej tak: ab c d e f -------------------------- Jak widać, funkcja f(x), gdzie x jest pozycją myszy na ekranowym odcinku, zaś jej wynikiem jest taka pozycja na trójwymiarowym odcinku, która po wizualizacji pokrywa się z pozycją myszy, nie jest liniowa. Niestety jednak nie mam pojęcia, jaka jest to funkcja - nawet nie mam żadnych pomysłów, intuicji. Fragment kwadratowej? Wykładniczej? Ale skąd się wzięła i jak obliczyć jej współczynniki? Pomysł niestety upadł. Pojawił się inny - aby próbować obliczyć oś widoku odpowiadającą pozycji myszy (przeciwobraz miejsca w którym znajduje się mysz - jak wiadomo, będzie to prosta) i stamtąd próbować powiązać ją z odcinkiem, ale właściwie nie mam pomysłu co dalej. Kombinowałem z próbą obliczenia jakiejś płaszczyzny w którą wbije się owa prosta, a następnie rzutowanie miejsca trafienia na docelowy odcinek, ale i tu było sporo problemów. Właściwie pomysły już mi się skończyły. Czy ktoś wie może jak rozwiązać ten problem? Pozdrawiam -- Spook. [1] Obszar widoku opisywany jest następująco: * Obserwator jest w punkcie (0,0,0) * Obszar, który jest renderowany ma postać ściętego ostrosłupa o podstawie prostokąta; * Jego mniejsza podstawa (ta ścięta) jest opisana wartościami top, left, bottom i right, a znajduje się w odległości [z]near od obserwatora * Większa podstawa jest odległa o [z]far od obserwatora (wraz z wierzchołkiem w (0,0,0) wystarczy to do jednoznacznego wyznaczenia ostrosłupa widoku) * Ekranem jest mniejsza podstawa. -- ! ._______. Warning: Lucida Console sig! //) ! ! || spk || www.spook.freshsite.pl / _ """*! ! ||_____|| spook at op.pl / ' | ""! ! | ___ | tlen: spoko_ws gg:1290136 /. __/"\ '! ! |_|[]_|_| May the SOURCE be with you! \/) \ !
Technical Details
Message-ID:
<g79ro5$kma$1@news.onet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!newsfeed.straub-nv.de!newshub.sdsu.edu!news.alt.net!psm.knf.p.lodz.pl!robomod!not-for-mailShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!newsfeed.straub-nv.de!newshub.sdsu.edu!news.alt.net!psm.knf.p.lodz.pl!robomod!not-for-mail From: "Wojciech \"Spook\" Sura" <spook.no@unwanted_mail.op.pl> Newsgroups: pl.comp.grafika.grafika3d,pl.sci.matematyka,pl.comp.lang.delphi Subject: [OpenGL, 3D] przekształcenie 2D do 3D Followup-To: pl.comp.lang.delphi Date: Tue, 5 Aug 2008 11:17:22 CST Organization: Onet.pl Lines: 103 Approved: PSM Moderators <psm-board@knf.p.lodz.pl> Message-ID: <g79ro5$kma$1@news.onet.pl> Mime-Version: 1.0 X-Trace: news.onet.pl 1217950277 21194 83.12.247.78 (5 Aug 2008 15:31:17 GMT) X-Complaints-To: usenet@news.onet.pl NNTP-Posting-Date: Tue, 5 Aug 2008 15:31:17 +0000 (UTC) To: psm-errors@knf.p.lodz.pl Return-Path: <psm-errors@knf.p.lodz.pl> X-PSM-Policy: http://ux1.mat.mfc.us.edu.pl/~pgladki/faq X-PSM-Info-1: Send submissions to psm@knf.p.lodz.pl X-PSM-Info-2: Send technical complaints to psm-admin@knf.p.lodz.pl X-PSM-Info-3: Send complaints about policy to psm-board@knf.p.lodz.pl X-Comment: moderators do not necessarily agree or disagree with this article. X-Robomod: STUMP, ichudov@algebra.com (Igor Chudov), C++/Perl/Unix Consulting X-Moderation-1: Hassle-Free commercial hosting of moderation sites available X-Moderation-2: See http://www.algebra.com/~ichudov/stump X-Original-To: psm@knf.p.lodz.pl Delivered-To: psm@knf.p.lodz.pl X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 X-Sender: 6xLpLC/sgJzVGqGMTs5itA== X-Antivirus-Status: Clean X-Newsreader: Microsoft Outlook Express 6.00.2900.2180 X-Antivirus: avast! (VPS 080805-0, 2008-08-05), Outbound message X-Priority: 3 X-MSMail-Priority: Normal Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit