dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Kameras vektori

 
dev.gamez.lv Forum Index -> Matemātika un fizika
View previous topic :: View next topic  
Author Message
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Mon Aug 14, 2006 8:30 pm    Post subject:

Varu izskaidrot to x' = -z, z'=x.
Kas ir streifošana? Tā ir iešana uz priekšu, ja kameru pagriež ap Y asi par 90 grādiem pulksteņu rādītāju kustības virzienā.

Kā griež punktu ap Y asi (jeb vektoru, kas uzdots ar nogriezni no O-punkta uz kādu punktu x,y,z telpā)?
x' = z*sin a + x*cos a
y' = y
z' = z*cos a - x*sin a

Kur (x,y,z) - vecās koordinātes. (x',y',z') - jaunās koordinātes, un a - leņķis par kuru pagriezt. Ņemot vērā, ka sin 90 = 1 un cos 90 = 0, iegūstam:
x' = z*1 + x*0 = z
y' = y
z' = z*0 - x*1 = -x
Skaidra bilde?

A par to mPos no mView atņemšanu - man liekas, ka tas vienkārši tā realizēts šajā kameras implementācijā. Noteikti to var arī savādāk realizēt. mView nav īsti vektors uz kuru pavērsta kamera, bet gan vektors uz punktu (no koordināšu sākumpunktu), uz kuru jāskatās (tb tas ir ekrāna centrā). Tad šo abu vectoru (mView un mPos) starpība dos vektoru, kas iet no spēlētāja acs uz priekšu pasaules telpā - tas būs virziens, pa kuru jāiet uz priekšu. Bieži vien šis mView vektors ir konstants - (1, 0, 0). Tb x-ass.
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Tue Aug 15, 2006 12:05 am    Post subject:

Nu vektoru var interpretēt dažādi. Pareizāk sakot - vektoru var uzdot dažādi. Viens veids ir ar diviem punktiem (p1 un p2). Tad vektors nozīmē virzienu no p1 uz p2 punktu. Taču saprotams, ka būs grūti veikt darbības (piemēram: saskaitīt, rēķināt leņķi starp tiem, utt) ar dažādiem vektoriem, kuru sākumpunkti būs dažādās vietās. Tāpēc ir pieņemts visus vektorus vilkt no 0-punkta līdz kautkādam punktam p, tādējādi norādot virzienu. Ja bija doti tie divi p1 un p2 punkti, tad p var iegūt kā p=p2-p1. Redzams, ka 0=p1-p1. Tb notikusi tikai pārbīde telpā. Iedomājies zīmuli uz galda - tā galos atrodās šie p1 un p2 punkti. Ja tu zīmuli nemainot tā virzienu bīdīsi kautkur, tad vienmēr varēsi vienu tā galu nolikt uz galda stūra (piemēram 0-punkta).

Vai redzi, kā vektors norāda virzienu, ja novelk staru, kurš iziet no 0-punkta uz p-punktu? p-punkta koordinātei nav nozīmes, tb vai tas ir 10 vai 100 vienību attālumā - tāpēc pieņemts vektorus normēt. Tā lai tas punkts p atrodas uz vienības sfēras virsmas - 1 vienības attālumā no centra. Tb tā punkta p koordinātēm piemīt īpašība x*x+y*y+z*z = 1.

Ar ko vektors atšķirās no punkta (3-d telpā)?
Pielietojot transformācijas (piemēram matricas veidā) punktu ietekmē gan rotācija, gan translācija. Virzienu turpretī ietekmē tikai rotācija. Tas nekur nepārbīdās (jo jāsākas vienmēr 0-punktā). Un tas jau ir loģiski - ja tu gribi paiet piecus soļus pa kreisi un divus uz priekšus (translācija), tad jau vektora virizens, kurš norāda augšup, vai vektora virziens, kurš norāda 30 grādus pa labi, nemainās. vai ne?

Matemātiski vektoru var ērti pierakstīt ar 4-komponenšu vektoru - (x,y,z,0), taču punktu - (x,y,z,1). Tādējādi, izmantojot matricu reizināšanu kā tranformāciju, viss augstāk teiktais saglabāsies. Jo matricai translācijas vektors glabāks 4 rindā. Tāpēc transformējot vektoru ar šo matricu, tas reizināsies ar 0 (nebūs translācijas). Taču transformējot punktu ar šo matricu, tam (punktam) skaitīsies klāt 1 * translācijasVektors - būs pārbīde.
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Tue Aug 15, 2006 8:16 am    Post subject:

Nekādas. Tās glXXX fjas, kuras pieminēji, to jau arī dara - izmanto matricas.
Reku:
http://pyopengl.sourceforge.net/documentation/manual/glTranslate.3G.xml
http://pyopengl.sourceforge.net/documentation/manual/glScale.3G.xml
http://pyopengl.sourceforge.net/documentation/manual/glRotate.3G.xml
apskaties kādas precīzi iskatās matricas (OpenGL tikai tās transponē).
Ja tu piemēram pasaki glTranslatef(1.0f, 2.0f, 3.0f), tad īstenībā OpenGL sevī pareizina tekošo matricu ar:
1 0 0 0
0 1 0 0
0 0 1 0
1 2 3 1

Ja glScalef(4, -1, 2), tad:
4 0 0 0
0 -1 0 0
0 0 2 0
0 0 0 1

Ar glRotatef ir drusku sarežģītāka matrica.

Var protams reizināt ar patvaļīgu savu matricu:
http://pyopengl.sourceforge.net/documentation/manual/glMultMatrix.3G.xml
Tas vajadzīgs, ja tu esi pats sarēķinājis vairāku matricu (piemēram pārbīdes un rotācijas) reizinājumu (transformāciju kompozīciju), un gribi OpenGL pateikt, lai tas pielieto rezultātā sanākušo transformāciju. Tad jālieto šī glMultMatrix.
Back to top
View user's profile Send e-mail
Display posts from previous:   
dev.gamez.lv Forum Index -> Matemātika un fizika All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group

Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in /home/gamedev/www/dev.gamez.lv/htdocs/db/mysqli.php on line 88