🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.grafika.grafika3d
Article #90282

[OpenGL, 3D] przekształcenie 2D do 3D

#90282
From: Wojciech "Spook" Sura
Date: Tue, 05 Aug 2008 17:17
102 lines
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-mail

Show 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