laoo/ng napisał/a:Może spróbuj skrótowo opisać algorytm jakiego faktycznie używasz: Opisz jak przeliczasz każdy z wejściowych puntków (x,y,z), aby otrzymać końcową pozycję na ekranie (przez co mnożysz, jakim wzorem, punkt po punkcie) bo rozłożenie punktów jest tak nierównomierne, że mi to wygląda na błąd w zastosowanej formule.
Załączam kod w Javie z komentarzami, który wysłałem do jednego z koderów z którym również koresponduje w tej sprawie (mam nadzieje, że się nie obrazi) :
// początkowe wartości wektorów kamery- up, front, right, wektory
jednostkowe
//(camz,camx,camy to obiekty klasy wektor z polem float x[4]);
camz.x[0]=0;camz.x[1]=0;camz.x[2]=1.0f;camz.x[3]=1;
camx.x[0]=1.0f;camx.x[1]=0;camx.x[2]=0;camx.x[3]=1;
camy.x[0]=0;camy.x[1]=1.0f;camy.x[2]=0;camy.x[3]=1;
// obroty na poszczegolnych osiach 3 wektorow kamery ,wartosci obrotow
wziete z wejscia
// oś y obraca wokoł osi Z kamery, jakoś tak mi się poprzestawiało, w
kazdym badz razie
//najpierw obracam osie x i y a na koncu z- wynikiem jest bledne obracanie
wokol osi Z
// gdy obrot jest najpierw wokol osi Z blad dotyczy pozostalych dwóch osi
obrocx(camz,osx*3.14f/180);
obrocx(camx,osx*3.14f/180);
obrocx(camy,osx*3.14f/180);
obrocz(camz,osz*3.14f/180);
obrocz(camx,osz*3.14f/180);
obrocz(camy,osz*3.14f/180);
obrocy(camz,osy*3.14f/180);
obrocy(camx,osy*3.14f/180);
obrocy(camy,osy*3.14f/180);
// przygotowanie macierzy (wstawienie 1.0 w kilka pól)
mtxbase(mbase);
//normalizowanie wektorów (na wszelki wypadek)
wersor(camz);
wersor(camx);
wersor(camy);
// ustalanie pozycji kamery
campoz.x[0]=pozx;campoz.x[1]=pozy;campoz.x[2]=pozz;campoz.x[3]=1;
//przygotowanie macierzy projekcji-wszystkie punkty świata mnożone są
przez tą macierz
//campoz służy do translacji, pozostałe wektory, jako normalne służą
do ustalenia obrotu
// poszczególne pola macierzy :plik JPG w załączniku
makeview(mbase,camx,camy,camz,campoz);
[edit] W załączonej macierzy brakuje translacji (pola 3,7,11)
[edit 2] punkty są rzucone na chybił trafił, to raczej nie wiąże się z samym problemem