[ PeraKojovic @ 08.06.2007. 11:57 ] @
Pozdrav ljudi,

Rec je o D3D9, odlucio sam se
za to da mi objekti na sceni budu fiksirani, a da kameru
pomeram/rotiram po sceni, ne uspevam da zarotiram kako treba kameru oko arbitrary ose
koja se nalazi u tacki Camera.Position. Odnosno, da kamera sada bude okrenuta
kao na slici isprekidana linija (novi LookAt kamere).

Na slici se ne vidi, ali kamera, naravno, nije samo u XZ ravni, vec
menja i Y koordinatu...
Sledi kod za Rotate():
Code:

    {
            float fr = 1;
            // rotiramo kameru po napravljen osi koja se nalazi u tacki lookAt
            Vector3 madeUp = new Vector3(0, 0, 1);
            Matrix rot = Matrix.RotationAxis(madeUp, Geometry.DegreeToRadian(fr));
            Vector3 v = Vector3.Normalize(LookAt);
            Matrix tr = Matrix.Translation(m_look);

            //LookAt = Vector3.TransformCoordinate(LookAt, tr);
            LookAt = Vector3.TransformCoordinate(LookAt, rot);
            //tr = Matrix.Translation(m_lookAt);
            //LookAt = Vector3.TransformCoordinate(LookAt, tr);
            m_right = Vector3.TransformNormal(m_right, rot);
            //m_up = Vector3.TransformNormal(m_up, rotation);
            m_up = Vector3.Cross(m_look, m_right);
    }

Nebitno za rotate, ali posle toga sledi Update, npr.:
Code:

    {
            m_view = Matrix.LookAtLH( m_position, m_lookAt, m_up );


            float tempWidth, tempHeight, h;
            h = Udaljenost(m_lookAt, m_position);
            tempHeight = m_height * m_nearPlane / h;
            tempWidth = tempHeight * m_aspect;

            if (perspective)
                m_projection = Matrix.PerspectiveLH(tempWidth, tempHeight, m_nearPlane, m_farPlane);
            else
                m_projection = Matrix.OrthoLH(m_width, m_height, m_nearPlane, m_farPlane);
    }            

Pozdrav,
Petar Kojovic
Novi Sad


[Ovu poruku je menjao tosa dana 14.06.2007. u 03:18 GMT+1]
[ vlaiv @ 13.06.2007. 13:04 ] @
Nisam se dublje upustao u analizu koda koji si prilozio (mada predlazem sledeci put
da koristis "code" tag za kod, citljivije je) ali ti mozda mogu konceptualno pomoci:

Ako recimo zelis da kameru rotiras oko neke ose (ako sam dobro razumeo, osa koja
je tebi potrebna lezi na polupravi centar kamere->pravac gledanja kamere, koja se poklapa
sa centar kamere->centar koordinatnog pocetka), predlazem da uradis sledece:

uradis transofrmaciju kamere tako da je vratis u koordinatni pocetak (inverzna matrica
transformacije koja je kameru postavila u dati polozaj), rotiras je oko ose sa kojom je
poravnata (z-osa u slucaju DX ako se ne varam) (mnozis sa inverznom matricom) i ponovo kameru
vratis u transofrmisan polozaj (mnozis sa transoformacionom matricom).

To bi bilo resenje u opstem slucaju, uz malo matematike i u zavisnosti od konkretnog slucaja (orjentacije
kamere, pravca u koji gleda i sl), citav postupak se najverovatnije moze optimizovati,
stavi sve na papir pa malo matematike ...
[ PeraKojovic @ 15.06.2007. 07:46 ] @
OK, meni je i trebalo samo konceptualno, kao ideja kako resiti.
Trebalo bi da je nebitno oko koje ose rotiram, jer za rotaciju mogu proslediti bilo koji vektor.
Cini mi se da sam tako nesto pokusao, ali da probam da potvrdim ono sto predlazes:
1. uradim transform(transliranje) kamere u koordinatni pocetak i pritom zapamtim translate matricu
2. uradim rotaciju oko neke ose
3. vratim kameru na staro mesto, ali sada sa novim LookAt

Rezultat ove operacije ce biti rotacija po zadatoj osi koja ce kada vratim kameru na stari polozaj
pored Camera.LookAt promeniti i Camera.Position sto mi nije bio cilj.

Mani treba sledece:
1. sedim na tzv. stolici na tockice
2. pogled mi je pod 45 stepeni ka podu
3. okrecem se na stolici za nekoliko stepeni
4. glava nije promenila polozaj u prostoru, ali tacka u koju sada gledam jeste

Ako imas vremena, probaj jos jednom da mi odgovoris...

Pozdrav,
Pera
[ vlaiv @ 18.06.2007. 18:24 ] @
Hm, hajde da pokusamo ovako ...

Ukoliko rotiras oko bilo koje ose koja ne prolazi kroz centar kamere, pozicija kamere ce ti se promeniti u prostoru.
Ukoliko rotiras oko ose koja prolazi kroz centar kamere, onda polozaj kamere ostaje isti dok se menja samo pravac
u koji kamera gleda.

Ono sto sam predlagao je sledece:

1. Uzevsi da imas pravu oko koje treba da izvrsis rotaciju i da je ta prava zadata sa dve tacke:

tacka 1. je tacka u centru kamere
tacka 2. je tacka kojom odredjujes osu rotacije (u slucaju sa stolicom, nalaziti se na pola metra iznad stolice recimo)

Formiras sledecu transformaciju:

Translaciju tacke 1 u kordinatni pocetak (trivijalno), rotaciju kamere tako da se prava tacka1 -> tacka2 poklopi sa izabranom
osom koordinatnog sistema (recimo osom Y), ovo se postize tako sto ces naci uglove izmedju date ose i ravni koordinatnog sistema
i u odgovarajucem smeru zarotirati tacku2 dok se ne nadje na Y osi ...

Takvu transformaciju obelezimo sa T1

Nadjes inverznu transformaciju transformacije T1 - neka bude obelezena sa T2

Ono sto ce ti uciniti posao je

T1 x Rotacija_oko_Y_ose x T2

(znaci pomeris kameru u koordinatni pocetak, zarotiras kameru dok se osa oko koje rotiras ne poklopi sa nekom osom koordinatnog sistema,
zarotiras kameru oko izabrane ose koordinadnog sistema (opet trivijalno), vratis kameru za negativne uglove od onih koje si koristio kada si poklapao
proizvoljnu osu sa nekom osom koordinatnog pocetka, i na kraju transliras kameru nazad na svoje mesto)

Ako ce ti sta pomoci, pogledaj recimo:

http://www.mines.edu/~gmurray/...ion/ArbitraryAxisRotation.html

(prvi rezultat sa Google, kad ukucas "rotation around arbitrary axis")
[ PeraKojovic @ 19.06.2007. 10:53 ] @
Hvala na angazovanju, bilo je poucno.
Konacno sam resio i cini mi se (barem za sada) da je sve kako treba.

Pozdrav