2013-04-05 16 views
10

Mam problem lub dobrze, nie wiem jak przekształcić punkt 3d z wartościami x, y, z do punktu 2d, Muszę narysować projekcję, gdzie mam x, y, z wartości dla punktów, ale nie wiem, jak przekształcić je na 2d, więc mogę je przenieść na moją oś.Projekcja - Przekształcanie 3D na 2d

enter image description here

czekałem około wiki i google, howevever Nie jestem pewien, które transformacje matrix powinienem użyć, aby uzyskać chciał wynik.

+0

Czy wiesz, na jaki samolot chcesz je wyświetlać? jak by ten samolot był podany (w jakiej formie)? – Bitwise

+0

No cóż, nie wiem o samolocie, jednak mam funkcję, więc obliczyć punkt z biorąc xy od min. Max, a potem muszę ustawić te punkty na osi, które mam namalowane powyżej i nie mam pomysł, jak zacząć to robić, oglądałem kilka filmów o punktowaniu punktów, ale muszę rysować funkcję, więc muszę jakoś połączyć punkty, odkryłem, że musi coś zrobić z matrycą, ale dobrze, nie jestem pewien, jaką transformację macierzy należy zastosować – user2141889

+0

Może okazać się przydatna: http: //en.wikipedia.org/wiki/3D_projection i wszystko, co z nim związane – Olexandr

Odpowiedz

3

Zdecydowanie zaleca się użycie istniejącego pakietu graficznego, aby to zrobić, a raczej próbować pisać własne biblioteki. Nie wiem, w jakim języku pracujesz, ale OpenGL to silnik graficzny o otwartym kodzie źródłowym, który może być używany do renderowania w 3D i ma porównywalność w wielu językach, więc może być dobrym miejscem do rozpoczęcia pracy.

Jeśli nalegasz na zrobienie tego ręcznie, jest bardzo dobry przykładowy kod w odpowiedzi na pytanie this.

+0

Dziękuję, przeczytam to pytanie, ale muszę napisać to na własną rękę, używając płótna – user2141889

12

Załóżmy najpierw, że kamera, patrząc na twoją scenę, jest wyśrodkowana na początku i patrząc na kierunek -z. Następnie:

  • rzutem perspektywicznym, jest dana wzorem:
    x' = x/z
    y' = y/z

  • segmenty występ jest dana przez:
    x' = x
    y' = y
    (czyli po prostu odrzucić Z składnik)

Po zastosowaniu powyższego kroku można uzyskać punkt o numerze (x',y') = (-28.4, +134.5). Teraz musisz przeskalować i wyśrodkować je na podstawie rozdzielczości ekranu i współczynnika powiększenia aparatu oraz proporcji obrazu: na przykład możesz pomnożyć przez Zoom i dodać screen_center do obu składników x i y (uwaga: większość systemów renderowania grafiki mieć kierunek y skierowany w dół, więc może być konieczna zamiana znaków na komponent y). Możesz nadal kończyć się pikselami o ujemnych współrzędnych lub których współrzędne są większe niż rozmiar obszaru roboczego. Po prostu je odrzuć: oznacza to, że znajdują się poza twoim zasięgiem frustum.

Wreszcie, możesz się zastanawiać, co zrobić, jeśli kamera jest nie skierowana w stronę -z lub nie jest wyśrodkowana w punkcie początkowym. Później jest to proste: wystarczy odjąć współrzędne kamery do komponentu wszystkich punktów 3D, zanim zrobisz cokolwiek innego. Obracanie kamery jest również całkiem proste: wystarczy obrócić punkty w odwrotny sposób, w jaki kamera jest obracana przed wykonaniem czegokolwiek innego. Oznacza to po prostu konieczność pomnożenia wszystkich współrzędnych 3D przez transpozycję macierzy obrotu kamery. Ideą tego kroku jest to, że poruszanie kamerą jest dokładnie takie samo, jak poruszanie punktami w odwrotnym kierunku (i zdarza się, że odwrotność macierzy obrotu jest transpozycją tej samej matrycy).

+0

Dzięki, będziemy pracować nad tym jutrem – user2141889

1

Musisz tylko wziąć pod uwagę kąt kamery, jeśli chcesz obrócić swój kształt w 3 wymiarach.Jeśli masz solidną wiedzę na temat algebry liniowej i trygonometrii, to jest to warte dodatkowego wysiłku, ponieważ sprawia ona, że ​​twój program jest bardziej elastyczny, ale jeśli nie masz zbyt dużego zainteresowania matematyką, poleciłbym następujące rozwiązanie.

To, co musisz zrobić, aby rzutować obraz 3D na płaszczyznę 2D, to tworzenie i równanie, które będzie mapowane.

(x,y,z) -> (x',y') 

Można to zrobić, definiując trzy odwzorowania z punktu 3D na punkt 2D.

(1,0,0) -> ( 1, 0) 
(0,1,0) -> ( 0, 1) 
(0,0,1) -> (-.7,-.7) 

kiedyś (-.7, -. 7) dla dostępu oo ponieważ punkt około 1 jednostkę od początku, w połowie drogi pomiędzy x i y dostęp.

Po uzyskaniu tych trzech punktów masz wystarczającą ilość informacji do obliczenia dowolnego punktu x, y, z.

(x,y,z) -> (1*x - .7*z, 1*y - .7*z) 

W grafice komputerowej pochodzenie siatki nie znajduje się na środku ekranu, ale w lewym górnym rogu. Aby użyć równania, które właśnie wygenerowaliśmy w naszym programie, musimy zdefiniować przesunięcie, aby przesunąć początek do środka ekranu. Nazwamy ten punkt odsunięcia (Ox, Oy).

Przy przesunięciu nasze równanie staje się następujące.

(x,y,z) -> (Ox + 1*x - .7*z, Oy + 1*y - .7*z) 
2

Znalazłem drogę do projekcji 3D w izometryczny 2D.

mam do kąt na widok izometryczny i oczywiście punkt 3D do projekcji jak

Dim IsometricViewAngle As Integer = 30 
Dim RowPoint As New Point3D(dx,dy,dz) 

który dx, dy i dz są twoje wartości niestandardowe. potem musiałem obliczyć Delta wartość dla X i Y kroków i zmniejsza jak

Dim XDelta = Math.Cos(IsometricViewAngle * Math.PI/180) 
Dim YDelta = Math.Sin(IsometricViewAngle * Math.PI/180) 
Dim ZDelta = 0.5 

OK, że teraz jadę do projektu punktów 3D do punktu 2D:

Dim X As Double = (RowPoint.X * XDelta) + (RowPoint.Y * YDelta) 
Dim Y As Double = (RowPoint.X * XDelta) + (RowPoint.Z * ZDelta) 
Dim ProjectedPoint As New Point(X,Y) 

, a ostateczny wynik działa najlepiej w RadDiagramie. Pozdrowienia/

+0

Albo jeśli wartości 3D są tak duże jak '2565452 'itd. możesz podzielić X, Y i Z przez' Dim ScaleValue As Ineger = 10000' –

2

To działa dla mnie: (jest w vb). f_nodes są płaskimi węzłami, a_nodes są 3d węzłami po transformacji o alfa, beta i gamma. (x, y, z) jest punktem. Są bardziej wyrafinowane.

ca = Cos(alpha) 
    sa = Sin(alpha) 
    cb = Cos(beta) 
    sb = Sin(beta) 
    cg = Cos(gamma) 
    sg = Sin(gamma) 
    q(1) = cg * (cb * X - sb * (sa * Y + ca * z)) - sg * (ca * Y - sa * z) 
    q(2) = sg * (cb * X - sb * (sa * Y + ca * z)) + cg * (ca * Y - sa * z) 
    q(3) = sb * X + cb * (sa * Y + ca * z) 

    f_nodes(i, 1) = q(1) 
    f_nodes(i, 2) = q(2) 

    a_nodes(i, 1) = q(1) 
    a_nodes(i, 2) = q(2) 
    a_nodes(i, 3) = q(3) 
Powiązane problemy