Page 1 of 3

3Dimensionāla kamera

Posted: 28 May 2011, 13:33
by CodeWolf
Sveiki... Uhh kādu labu laiciņu jau nevaru tikt gala ar Kameru..Izmeiģināju dažādus variantus + skatijos pec pamacibam , bet nekas īsti nav sanācis.
Lietiņa tāda ,ka kamera negriežas un neseko līdzi objektam + tā aiziet kautkur galīgi garām..
kods Pozicijai + rotacijai

Code: Select all

Phy.Pos.x += (float)sin(heading*piover180)*5 ;			// Move On The X-Plane Based On Player Direction
		Phy.Pos.z += (float)cos(heading*piover180) *5;			// Move On The Z-Plane Based On Player Direction
		Phy.Gd = 0.1f;
Un kameras

Code: Select all

//gluLookAt(Phy.Pos.x,100,Phy.Pos.z+250,Phy.Pos.x,0,Phy.Pos.z,0,1,0);
	glTranslatef(0,-100,-250+Z);
	glTranslatef(Phy.Pos.x,0,Phy.Pos.z);
	//glRotatef(Phy.Pos.z,0,1,0);
:)
kods ir mainīts vairākas reizes taka ...tagad nav īsti sakarīgs..

Re: 3Dimensionāla kamera

Posted: 28 May 2011, 15:04
by snake5
Pēc koda nevaru saprast, ko tieši gribi panākt ar kameru. Vajag, lai griežas ap objektu un visu laiku skatās uz to?
Tā kā kods izskatās savākts no NeHe sliktajiem tutoriāļiem ("piover180" ir tik īpašs konstantes apzīmējums, ka Google nespēj noslēpt autoru :D ), nevaru arī saprast, vai ir pielāgots tavai asu sistēmai un visam pārējam.

Tāpēc sākam ar to, ka pastāsti, ko tieši gribi panākt, ar kādiem uzstādījumiem strādā (asu sistēmām*) u.tml.

*Ja vēl tikai sāc mācīties visu 3D un visu laiku kopē XZ asu bāzes kodu, iesaku laicīgi pāriet uz XY bāzi (un sakarīgākām pamācībām). XZ radās no slinkuma, ne veselā saprāta (tajos laikos, kad 3D API lietoja tikai zīmēšanai ekrāna telpā). Reāli visa 2D matemātika strādā ar X un Y un tā kā pārsvarā tā tiek lietota 3D horizontālajā plaknē, tad nebūs jācīnās ar Y/Z jaukšanu, kad tiek lietotas šādas funkcijas.

Re: 3Dimensionāla kamera

Posted: 28 May 2011, 16:13
by CodeWolf
mm Gribu panākt 3ešās personas kameru kura skatās uz noteiktu objektu..
līdzīgu postu rakstiju vecajā foruma kad stradaju ar xna...
Image
tikai strādājot ar Opengl nevaru isti saprst ko jaliek pie
glRotatef(...,0,1,0);//Y rotacijas
+ bieži vien ir tā ka kamera sagriežas galīgi atšgārni.
:D tikko sapratu ka liela nozīme ir secībai..
Pārliku šādi... itka viss ir labi

Code: Select all

gluLookAt(Phy.Pos.x,100,Phy.Pos.z+250,Phy.Pos.x,0,Phy.Pos.z,0,1,0);
	glRotatef(-Phy.YRot,0,1,0);
	glTranslatef(0,0,250+Z);
	glTranslatef(Phy.Pos.x,0,+Phy.Pos.z);
Neskaitot to ka kamera pa Zassi nekustas. ja uzliek negatīvu poziciju tad attalinas.. :?

Re: 3Dimensionāla kamera

Posted: 28 May 2011, 16:37
by snake5
kura skatās uz noteiktu objektu..
Tas ir īpaši skops apraksts. Pēc tāda atbilde ir "gluLookAt( cam.x, cam.y, cam.z, obj.x, obj.y, obj.z, up.x, up.y, up.z );".

Re: 3Dimensionāla kamera

Posted: 29 May 2011, 13:42
by CodeWolf
A. tatad translate nemaz nav vajadzīgi :D
Atstājot tikai LookAt.. un Rotatef uz Y ass ,kamera nedaudz par atru pagriežas vai ari izskatas ka seko citām koardiatem.
Video:
http://95.68.95.215/gfx/gfx.html
kods

Code: Select all

gluLookAt(Phy.Pos.x,100,Phy.Pos.z+250,Phy.Pos.x,0,Phy.Pos.z,0,1,0);
	glRotatef(-Phy.YRot,0,1,0);
:?

Re: 3Dimensionāla kamera

Posted: 29 May 2011, 15:58
by snake5
Var visu darīt daudz vienkāršāk.
Normalizē objekta virziena vektoru, atņem to, pareizinātu ar attālumu, no objekta pozīcijas un dabūsi kameras pozīciju. Būs šausmīgi primitīvi, bet vismaz pareizi. :P

Re: 3Dimensionāla kamera

Posted: 29 May 2011, 17:15
by Arrovs
Šo es izmantoju priekš saviem projektiem.
Īsi un vienkārši. Pārveido tā lai atpazītu tava sistēma.
Šeit neesu iekļāvis kameras sadursmes, bet man nav ne jausmas kā tas rukā tev.
////////////
temp = fcos(camera.tilt,-kameras_distance);
vec_set(camera.x,vector(my.x + fcos(camera.pan,temp),my.y + fsin(camera.pan,temp),my.z + 20 + fsin(camera.tilt,-kameras_distance)));
///
Sākumā iegūstu vertikālo leņķi, ko pēc tam piereizinu horizontālajam aplim, lai iegūtu sfēru.
Kameras distanci var dinamiski pielāgot.
un my = tavs sekojamais objekts.
Vari arī pēc tam to ierobežot noteiktos leņķos, lai nevar apgriezt kameru kājām gaisā.

Re: 3Dimensionāla kamera

Posted: 29 May 2011, 19:42
by CodeWolf
hmm, meiģināju Snake5 metodi.Itkā kamera kustas līdzi + rotē , bet nedaudz.. Objektam pagriežoties kamera minimāli pagriežas+ nestāv precizi uz Z ass.

Code: Select all

if( keyarr['w'] )
	{
		Atrums.x += (float) sin(RotY*PiOver180)*4.04f;
		Atrums.z += (float) cos(RotY*PiOver180)*4.04f;
		
	}
	if( keyarr['s'] )
	{
		Atrums.x -= (float) sin(RotY*PiOver180)*4.04f;
		Atrums.z -= (float) cos(RotY*PiOver180)*4.04f;
		
	}

	Pos /*+*/=Atrums;
	Virz = Atrums;
	Virz.normalize();
	KPos = Pos - Virz * 250 ;
	gluLookAt(-KPos.x,100,-KPos.z,-Pos.x,0,-Pos.z,0,1,0);
:roll:

Re: 3Dimensionāla kamera

Posted: 29 May 2011, 22:24
by snake5
Objektam pagriežoties kamera minimāli pagriežas+ nestāv precizi uz Z ass.
Pirmkārt, nevajag apgriezt otrādi pozīcijas vektoru, tas ir galīgi nevajadzīgi. Otrkārt, virziens nav tas pats, kas ātrums. Ja radīsies gļuki, kad objekts stāvēs uz vietas, nevajag teikt, ka nebrīdināju. ;)
Un es vēl joprojām neesmu iebraucis asu sistēmā - nezinu, kura tavā kodā lietota. Ja tu lieto divas dažādas cauri visam kodam, nebūs brīnums, ja kādā asī kaut kas rādīsies nepareizi.

Re: 3Dimensionāla kamera

Posted: 30 May 2011, 00:10
by CodeWolf
Pag, ar kādu formulu varēja iegūt virzienu? Vectors... = .... (RotacijaY,Pozicija) vai ka tur bija :?
Un es vēl joprojām neesmu iebraucis asu sistēmā
Praktiski viss jau te ir nosaukts...