3Dimensionāla kamera

Parunāsim par OpenGL
Message
Author
snake5
Posts: 353
Joined: 07 Dec 2010, 04:54
Contact:

Re: 3Dimensionāla kamera

#11 Post by snake5 » 30 May 2011, 02:53

Virzienam nav formulas, virziens ir daļa no objekta stāvokļa. Tāpat kā pozīcija. Ja objekta rotācija tiek glabāta citādāk (quaternioni, lenķi?), tad jālieto formula, lai dabūtu virzienu vektora formā, kura visprimitīvākajā variantā ir vienkārši rotācijas matricas iegūšana un nerotēta objekta virziena vektora (kurš parasti ir vienāds ar kādu no asu normālvektoriem) pareizināšana ar to matricu (vektoram w=0).
Praktiski viss jau te ir nosaukts...
Nekur neatradu, kur rakstīts, kuras asis lieto kā horizontālās un kuru kā vertikālo, kuri virzieni kam atbilst (t.i. left-handed/right-handed).

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 20:10
Location: LV-Riga-Marupe

Re: 3Dimensionāla kamera

#12 Post by CodeWolf » 31 May 2011, 19:09

hmm, nedaudz pa netu parakājos uzskrēju virsū Polarajai koardinatu sistēmai...
Image
Uzliku kamerai...Itkā viss strādā + nedaudz paeditēju kodu...
Rezultāts:
http://95.68.95.215/m.wmv
:D
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 12:54

Re: 3Dimensionāla kamera

#13 Post by bubu » 31 May 2011, 19:32

Neiesaku taisot kameru domāt par leņķiem. Leņķi - tā ir trigonometrija, kosinusi un sinusi. Tie slikti rēķinās un ir neērti.
Iesaku domāt par kameras/acs pozīciju, normalizētu virziena vektoru (uz kurieni skatīties) un vektoru, kas apzīmē augšup virzienu. Ar šiem trim parametriem var vai nu triviālā veidā pielietot gluLookAt funkcijai. Vai arī uzturēt View matricu, kuru pa tiešo tad arī dot OpenGL'am (vai DX'am) kā MODELVIEW matricas sastāvdaļu, vai pa tiešo šeiderim uniformā.

Un no trim vektoriem var itin viegli izveikt dažādas operācijas:
* pakustināt kameru par trīs vienībām uz priekšu - pozīcija += 3*virziens;
* pakustināt kameru par 3 pa labi - pozīcija += 3 * TransformVector(virziens, RotateMatrix(90, augšup_vektors))
* skatīties uz konkrētu objektu - virziens = normalize(objekta_pozīcija - kameras_pozīcija)
...
tāpat arī ar rotācijām.

Uzliekot dažādus constraintus šiem vektoriem var ierobežot kameras darību, piemēram, skatīšanos augšup vai lejup vairāk par 90 grādiem = FPS stila kamera. Kameras pozīcija vienmēr ir no objekta fiksētā attālumā = kamera rotē ap objektu orbītā, utt. Arī koliženus ar sienām apstrādāt būs vieglāk. Piemēram, orbitējošai kamerai - if (kamera ir sienā / vai nogrieznis kamera + virziens*k krusto sienu) { pozīcija += virziens * attālums līdz sienas malai }

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 20:10
Location: LV-Riga-Marupe

Re: 3Dimensionāla kamera

#14 Post by CodeWolf » 18 Feb 2012, 16:01

Sveiki.. Atvainojos ka pacēlu šo veco postu.. bet to dariju tapec ,lai nebutu javeido jauns..
jo tēma ir līdzīga tikai saistībā ar peles implentāciju.
Gribēju zināt kā lai
peles koardinatas parvieto uz 3dimensionalam koardinatam (// vektoriem//)
Sākumā domāju ka šo uzdevumu atrisināt nebus gruti.. vienkārši pārveidojot
Peles X-> objekta X(iekš 3d)
PelesY -> objetka Z(iekš 3d)
Bēt tad sakas problēmas kad ar kameru sāku pārvietoties pa pasauli & rotēt..
rotacijas momenta +/- nobidijas vai ari pat X ar Y samainijas vietam..
iedomajos to ka iespejams varetu kautka pec gradiem mainit + vai munusus bet nezinu cik efektivi tas butu + tur ar poziciju klat jārēķina
Paskatijos ari pamacibas par objektu selektošanu iekš 3d pasaules ar peli.. bet tā šķita nedaudz nepliniga + nezinu vai ari tā pat strādātu uz
poziciju mainošu kameru.. Un vai ari no ta attiecigi mainisies peles pozicijas iekš 3d
jautaju šo jo nepieciešams iekš editora izveidot tadu ka objektu novietotaju..+/ terraina editoru../

ceru ka izteicos kaut cik skaidri ko velos izveidot..
ja ne tad centos speciali ziletaju klubiņam izveidot ~ to ko velos panakt..
Image
//OpenGL

snake5
Posts: 353
Joined: 07 Dec 2010, 04:54
Contact:

Re: 3Dimensionāla kamera

#15 Post by snake5 » 18 Feb 2012, 16:58

Gribēju zināt kā lai
peles koardinatas parvieto uz 3dimensionalam koardinatam
p = vec4( cursor_x, cursor_y, z, 1 ) * invert( view_matrix * projection_matrix );
result = p.xyz / p.w;

Ja z ieliksi >= 0, varēsi bonusā dabūt virziena vektoru (kur tiek "tēmēts" ar kursoru) ar normalize( result - camera_pos ).
Reāli Z vērtība nav svarīga, jāzina tikai tas, ka 0 novietos punktu uz z_near plaknes un 1 - uz z_far.

P.S. Rakstu nelielā steigā, tāpēc aicinu kādu matemātiski pieredzējušāku palabot, ja kaut kur nedaudz kļūdījos.

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 20:10
Location: LV-Riga-Marupe

Re: 3Dimensionāla kamera

#16 Post by CodeWolf » 19 Feb 2012, 20:40

hmm , paldies sneik..
pirmstam čot pamaniju tādu fiču kā

Code: Select all

gluUnProject
kas parveido Peles koardinatas uz pasaules 3d koardinatam.. domaju to iespejams izmantot..
Itkā notestēju..
Liekas ka strādā jo bridi kad kursors atduras pret plakni apļa izmērs palielinās, bet tad kad tas atrodas uz melna laukuma , sarūk līdz MaxViewDist
tikai veidojas viena problēma..

virzoties pa plakni , manis veidotais riņķis sāk staipīties pa visu laukumu, atkarībā no peles novietojuma uz plaknes..
+ liekas ka pozīcija netiek īsti iegūta.. jo ja nemaldos x,y,z ko iegustu ir attālums no kameras vai kas tāds , jo kamerai kustoties iegūstu to pašu ko iepriekš.. nevis poziciju kur atrodas punkts (aplis) bet kautkādu atspoguļojumu....Domaju ka to varetu iegut atņemot no 0-Peles 3d koardinatas.. bet tas neizdevās rezultāts bija tāds pats. :(



http://www.bildites.lv/images/qc59d7ztn9ajay1kv4r.png

http://www.bildites.lv/images/qcxseq9ff26zb5qnhr03.png

kods:

Code: Select all

void GetMSPos(int x,int y)
{
	GLint viewport[4];
    GLdouble modelview[16];
    GLdouble projection[16];
    GLfloat winX, winY, winZ;
    
 
    glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
    glGetDoublev( GL_PROJECTION_MATRIX, projection );
    glGetIntegerv( GL_VIEWPORT, viewport );
 
    winX = (float)x;
    winY = (float)viewport[3] - (float)y;
    glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
 
    gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
	glDisable(GL_DEPTH_TEST);
	
	int r=100;
	int h2 =100;
	int h=100;

	glColor3f(1,0,0);
	glBegin(GL_LINES);
	for (int i = 0; i < 180; i++)
	{
	circle.x = r * cos((double)i) - h;
	circle.y = r * sin((double)i) + h2;
	glVertex3f(posX+circle.x + h2,posY,posZ+circle.y - h);
	circle.x = r * cos((double)i + 0.1) - h;
	circle.y = r * sin((double)i + 0.1) + h2;
	glVertex3f(posX+circle.x + h2,posY,posZ+circle.y - h);
	}
	glEnd();
}
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 12:54

Re: 3Dimensionāla kamera

#17 Post by bubu » 19 Feb 2012, 22:10

Nē, xyz ko tu iegūsti ir punkta koordināte pasaules koordināšu sistēma. Tb absolūtā vērtība, neatkarīga no kameras pozīcijas/rotācijas - tāpēc jau unproject'am bija jāpadod kameras matrica (modelview).

cos un sin btw argumentā sagaida grādus radiānos, nevis grādos.
Tad, kad tu zīmē riņķi, tu esi pārliecināts, ka modelview matrica satur tikai kameras matricu? Tb tur nav piereizināta klāt kāda cita matrica?
Es riņķi zimētu šādi:

Code: Select all

glBegin(GL_LINE_LOOP);
for (int i = 0; i <= 360; i++)
{
    float x = r * cosf(i * PI / 180);
    float z = r * sinf(i * PI / 180);
    glVertex3f(posX + x, posY, posZ + z);
}
glEnd();
Pēc vajadzības, protams, punktu skaitu riņķī droši var samazināt.

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 20:10
Location: LV-Riga-Marupe

Re: 3Dimensionāla kamera

#18 Post by CodeWolf » 19 Feb 2012, 22:49

Jep varetu tā būt.. jo priekš
2D un 3D izmantoju modelview &Reshape
hmm bet reāli nav kāds veids kā viņu varētu viņu saudzīgi noņemt..? :?

Code: Select all

void Enable3DS(void){

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_CULL_FACE);
	glEnable(GL_DEPTH_TEST);
	glViewport(0,0,sWidth,sHeight);
	glMatrixMode(GL_PROJECTION);
	glPopMatrix();
	glMatrixMode(GL_MODELVIEW);
	glPopMatrix();
}
void Enable2DS(void){
	
	glDisable(GL_DEPTH_TEST);
	glDisable(GL_CULL_FACE);
	glDisable(GL_LIGHTING);
	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
	glLoadIdentity();
	glScalef(1, -1, 1);
	gluOrtho2D(0,sWidth,0,sHeight);
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
	glLoadIdentity();

}
+ no tās riņķa līnijas jau isti nekas nemainas.. tas pats vien ir, tik tavs dotais kods nedaudz īsāks :D
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 12:54

Re: 3Dimensionāla kamera

#19 Post by bubu » 19 Feb 2012, 23:19

Ko noņemt? Papildu matricas? Vienkārši seko līdzi tam, ko dari, un lieto pareizo matricu. Vai nu ar Push/Pop (kas nav kūl un ir novecojis veids) vai nu pa tieši lādējot pareizo matricu OpenGL'ā.

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 20:10
Location: LV-Riga-Marupe

Re: 3Dimensionāla kamera

#20 Post by CodeWolf » 23 Feb 2012, 00:21

Jap ar matricam tagad viss okej , viss strada (:
nekas netiek sagriezts ,+ liekas ka peles noraditās objekta x, y,z koardinatas ir pareizas..
tikai gribēju paprasit.. kā var noteikt izvēleto punktu ID un to pozīcijas.. :D
ja katrs punkts meroga tiek reizinats ar 40 :D zinu ka nav nekas sarežģits bet nespeju atcereties ^.^
Image
//OpenGL

Post Reply

Return to “OpenGL”