kamil gorgh trzaska Napisano Czerwiec 7, 2009 Zgłoś Share Napisano Czerwiec 7, 2009 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 More sharing options...
Force Napisano Czerwiec 7, 2009 Zgłoś Share Napisano Czerwiec 7, 2009 wogóle nie podałeś żadnego kodu więc trudno znaleźć rozwiązanie. Baza tysięcy lotnisk: http://airportsbase.com Link do komentarza Udostępnij na innych stronach More sharing options...
kamil gorgh trzaska Napisano Czerwiec 7, 2009 Autor Zgłoś Share Napisano Czerwiec 7, 2009 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 More sharing options...
Force Napisano Czerwiec 7, 2009 Zgłoś Share Napisano Czerwiec 7, 2009 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 More sharing options...
kamil gorgh trzaska Napisano Czerwiec 8, 2009 Autor Zgłoś Share Napisano Czerwiec 8, 2009 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 More sharing options...
Force Napisano Czerwiec 8, 2009 Zgłoś Share Napisano Czerwiec 8, 2009 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 More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.