Skocz do zawartości

macierz widoku


Polecane posty

Witam,mam maly problem ze skonstruowaniem kamery (od podstaw, nie korzystam z dobrodziejstw SDL ani Directx w tej materii). Korzystam z macierzy zamieszczonej na tej stronce, mnoze wszystkie wierzcholki przez ta macierz i..

przesuwajac kamere uzyskuje tylko przesuniecie punktow wzgledem srodka ukladu wspolrzednych swiata. Czy moglby ktos wyjasnic krok po kroku jak "wstawic" kamere w srodek sceny i uzyskac stosowny widok?

Link do komentarza
Udostępnij na innych stronach

wogóle nie podałeś żadnego kodu więc trudno znaleźć rozwiązanie.

Juz pisze:

 float camz[4];     //kolejne osie kamery
float camx[4];
float camy[4];
float campoz[4];        //pozycja kamery w swiecie
float mbase[16];      

        float xt[2500];  //wspolrzedne objektu w swiecie
       float yt[2500];
       float zt[2500];
       float xe[2500];   //wspolrzedne objektu w kamerze
       float ye[2500];
       float ze[2500];

         float vectmul(float v[4],float v2[4]){
          float wynik;
          return wynik=v[0]*v2[0]+v[1]*v2[1]+v[2]*v2[2]+v[3]*v2[3];
               };


 void makeview(float m[16],float v1[4],float v2[4],float v3[4],float posit[4]){
      mtxbase(m);                        //tworzy macierz jednostkowa
      m[0]=v1[0];m[4]=v1[1];m[8]=v1[2];
      m[1]=v2[0];m[5]=v2[1];m[9]=v2[2];
      m[2]=v3[0];m[6]=v3[1];m[10]=v3[2];
      m[12]=-vectmul(v1,posit);
      m[13]=-vectmul(v2,posit);
      m[14]=-vectmul(v3,posit);
}; 

           void buildcamera(int r){

                camz[0]=0;camz[1]=0;camz[2]=1;camz[3]=1;
                camx[0]=1;camx[1]=0;camx[2]=0;camx[3]=1;
                camy[0]=0;camy[1]=1;camy[2]=0;camy[3]=1;

                obrocx(camz[1],camz[2],r*3.14/180);
                obrocx(camx[1],camx[2],r*3.14/180);
               obrocx(camy[1],camy[2],r*3.14/180);
                obrocy(camz[0],camz[2],r*3.14/180);
                obrocy(camx[0],camx[2],r*3.14/180);               
                obrocy(camy[0],camy[2],r*3.14/180);    
                wersor(camz);     //normalizacja wektorow
                wersor(camy);
                wersor(camx);
                campoz[0]=0;campoz[1]=0;campoz[2]=230;campoz[3]=1;
                makeview(mbase,camx,camy,camz,campoz);
};
           void camview(){

                for (int t=0;t<index;t++){  //petla dla wszystkich punktow objektu
                v1[0]=xt[t];v1[1]=yt[t];v1[2]=zt[t];v1[3]=1; 
                maketrans(v1,-campoz[0],-campoz[1],-campoz[2]);//przesuniecie objektu zgodnie z polozeniem kamery          
                mtxmulvec(v1,mbase);                          //mnozenie wektora przez macierz
                xe[t]=v1[0];ye[t]=v1[1];ze[t]=v1[2];}
                };
int main();

  buildcamera(30);
  camview();
  ..

Link do komentarza
Udostępnij na innych stronach

camview przesuwa wektor o położenie kamery, a potem jeszcze mnoży przez macierz, to po co przesuwasz? Wogóle w makeview to ostatni wiersz macierz powinien być: położenie.x, położenie.y, położenie.z, 1. Ty nie masz tej jedynki w m[15], w 12-14 dajesz -pozycja * te różne wektory, po kiego? Wpisz tam po prostu wektor pozycji. I tą macierz przemnażaj przez wektory pamiętając, że mnożenie wiersz z lewej, a macierz z prawej. Tak mam w oglu, jak masz dx-a to tylko Twoja wina bo nawet nie powiedziałeś, że w dx-ie, a SDL to nakładka na OGL-a więc niewiele wiadomo w czym to będzie.

Zamiast dla każdej współrzędnej mieć osobną tablicę, zrób tablicę wektorów, ominiesz te różne przypisanie zmienych

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

hm,objekty "obracaja" sie przy obrocie kamery wokol punktu 0,0,0 + wektor kamery przy czym wszystko widoczne jest z jednego punktu oddalonego od calej sceny.Macierz widoku jest tozsama ze zlozeniem macierzy przesuniecia + macierzy obrotow, a skoro tak to czym rozni sie macierz widoku od macierzy przeksztalcen objektu w globalnym ukladzie wspolrzednych? tak mysle,ze moze potrzebne jest dodatkowo jakis inne przeksztalcenie,moze macierz projekcji ?

Link do komentarza
Udostępnij na innych stronach

hm,objekty "obracaja" sie przy obrocie kamery wokol punktu 0,0,0 + wektor kamery przy czym wszystko widoczne jest z jednego punktu oddalonego od calej sceny.Macierz widoku jest tozsama ze zlozeniem macierzy przesuniecia + macierzy obrotow, a skoro tak to czym rozni sie macierz widoku od macierzy przeksztalcen objektu w globalnym ukladzie wspolrzednych? tak mysle,ze moze potrzebne jest dodatkowo jakis inne przeksztalcenie,moze macierz projekcji ?

Domyślam się, że robisz to jak w DirectX bo tam też są trzy, a nie dwie macierze. I nie wiem po co tam mają 3 macierze. Jak dla mnie to strasznie dużo kodu masz i nie wiem po co ręcznie te punkty mnożysz, skoro wystarczy w dx/oglu odpowiednią macierz ustawić a punkty same się przemnożą przy rysowaniu

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...