eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming3d -> 2dRe: 3d -> 2d
  • Data: 2012-12-01 18:25:41
    Temat: Re: 3d -> 2d
    Od: bartekltg <b...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    W dniu 2012-12-01 11:39, firr kenobi pisze:
    > Ostatnio naszła mnie idea by podzialac troche w
    > softwarowym rasteryzerze, tj zrobic sobie prosty,
    > (prosty framework do 2d mam juz zrobiony, o tyle
    > prosty rasteryzer z kulkami czy trojkatami to
    > nie jest juz tak duzo roboty


    Parser mi się wyłożył. Nie zamknąłeś nawiasu, nie
    kontynuowałeś myśli sprzed nawiasu. Wdałeś się
    w dygresję i zapomniałeś napisać, o co chodzi.
    ...zrobić sobie prosty _co_?

    Czytaj posty przed wysłaniem.

    > potrzebuje jednakze wzorku na rrzutowanie
    > wspolrzednych 3d na ekran 2d dla danego
    > ustawienia kamery
    >
    > kamera jest u mnie opisana przez:

    > float3 cameraPos = {0,0,0};
    > float3 cameraDir = {0,0,-1};
    > float3 cameraUp = {0,1,0};
    > float3 cameraLeft = {1,0,0};


    A co znaczą te punkty?
    Rozumiem, że pos to położenie środka (wyróżnionego
    punktu), dir to kierunek patrzenia, up i left to
    ścianki kamery.

    {dir, up, left} są wzajemnie prostopadłe.
    > jak zrzutowac
    >
    > float3 wierzcholek = {-20, -10, 200};
    >
    > na ekran dla danych ustawien kamery?


    No to nic prostszego.
    Zakładam, że wektory są stojące. ' to transpozycja, * mnożenie.

    {dir, up, left} są prostopadłe i odpowiednio wyskalowane.

    X - punkt do obróbki.

    X2 = X - Pos.

    Cle = (Left')*X2 (czyli po ludzku, dostajemy liczbę w wyniku
    dodania przemnożonych współrzędnych
    left.x * X2.x + left.y * X2.y +left.z * X2.z)

    Cup = (Up')*X2

    Dodatkowo, jeśli chcesz wiedzieć, czy punkt nie jest czasem
    za kamerą, liczysz Cdi = (Dir')*X2. Jeśli jest dodatni, jest
    przed kamerą, jeśli ujemny, za. Jeśli ==0, to punkt jest na
    powierzchni kamery.

    Można to zapisać macierzowo

    [Cle;Cup; Cdi] = [left'; up'; dir] * (X-Pos)

    Macierz ze środka składa się z wektorów leżących (obróconych)
    jeden na drugim.

    Jeśli zamiast wektorów w 3D użyjesz sztuczki z dodatkowym wymiarem,
    zawsze równym 1, czyli
    X = {x; y; z; 1}

    to możesz stworzyć jedną macierz rzutowania na kamerę:
    M = [left', 0; up', 0; dir, 0; 0,0,0,1] *
    * [ 1,0,0,-pos_x; 0,1,0,-pos_y; 0,0,1,-pos_z; 0,0,0,1 ]

    A taka operacja ma najprawdopodobniej wsparcie sprzętowe.
    Chociaż pierwsza wersja nie wykonuje niepotrzebnych obliczeń,
    nie wiem, którą się obecnie używa.

    pzdr
    bartekltg




Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: