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

Milzīga problēma
Goto page 1, 2  Next
 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
s1
Guest





PostPosted: Wed Jan 19, 2005 12:51 am    Post subject: Milzīga problēma

Varbūt kāds var palīdzēt. Man te tāda problēma. Kā lai pasaka, ir nepieciešams panākt, lai ar peles kursoru varētu izvēlēties poligonu,uz tā uzklikšķinot, no 3d scēnas. Kodu esmu rakstījis delphi un izmantoju OpenGL. Varbūt kādam ir jau gatava klase, kuru es varētu ātri piešaut klāt savam projektam. Vienalga kas, palīdziet lūdzu! Crying or Very sad
Back to top
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Jan 19, 2005 3:41 pm    Post subject:

Shito teemu diezgan sen neesmu aizticis, taapeec vareetu pieljaut kaadu kljuudu ar kaadu siikumu, bet kopsumaa to dara shaadi. Kods buus c++, bet opengl api jau no taa nemainaas ;)

Code:

int Sel=0,SelDepth,CurDepth;
GLuint   buffer[512];
GLint   viewport[4],hits,Cur;

int x=...,y=....;//cursora coordinaates ogl logaa, tikai njem veeraa,
//ka OGL skaita y coordinaati no ekraana apakshas

glGetIntegerv(GL_VIEWPORT, viewport);
glSelectBuffer(512, buffer);
glRenderMode(GL_SELECT);
glInitNames();                     
glPushName(0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPickMatrix(x,y, 1.0f, 1.0f, viewport);//tie 1.0f - cik pixeljus apkaart
//sursoram skaitiit taa clicka zonaa
gluPerspective(...te uzseto savu projekcijas matricu...);
glMatrixMode(GL_MODELVIEW);   
glLoadIdentity();
Camera.MoveIntoPosition();//savas kamera glulookat/translate/rotate/scale etc

for(Cur=0;Cur<ObjectCount;Cur++)
{
glLoadName(Cur);//katram objektam savu picking name noraadi   

Object[Cur].DrawForPicking();//uzziimee objektu

}

hits=glRenderMode(GL_RENDER);//cik objektiem kursors ir traapiijis
if(hits<1)//nav nevienam
   {
   SelectedObject=-1;//atziimee - nav selekteets ogjects
   return;
   }

Sel=0;

for (Cur=1;Cur<hits;Cur++)
//atrodi, kursh objekts vistuvaak kamerai         
{
if(buffer[Sel*4+1]>buffer[Cur*4+1]) Sel=Cur;
}
SelectedObject=buffer[Sel*4+3];

_________________
Back to top
View user's profile Send e-mail
Guest






PostPosted: Wed Jan 19, 2005 8:45 pm    Post subject:

O, paldies par kodu. Very Happy Mēģināšu tajā iebraukt.
Back to top
s1
Guest





PostPosted: Wed Jan 19, 2005 8:52 pm    Post subject:

nu... es ar OpenGL sāku kautko darīt pirms pāris nedēļām, tāpēc man te visādi jautājumi Laughing

gluPerspective(...te uzseto savu projekcijas matricu...);
projekcijas matrica - kas tas par zvēru? Par tām matricām es īsti netieku gudrs.
Back to top
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Jan 19, 2005 9:15 pm    Post subject:

Nu ar gluPerspective - tur liec taadu pashu kaadu izmanto, kad renderee sceenu normaalaa veidaa. Nu Tu zini, kaut kas liidziigs shim: gluPerspective(45.0f,ScreenWidth/ScreenHeight,0.1f,100.0f); Par OGL matricaam vari palasiities te: http://fly.cc.fer.hr/~unreal/theredbook/chapter03.html

Bet ja nu Tev tas liekas par daudz prieksh shii briizja, tad diezgan vienkaarshots matricu apraksts vareetu buut taads:

Prieksh 3 dimensijaam pilna matrica ir 4x4 divdimensionaals massiivs. (Jeb vienkaarshi 16 mainiigie). Vienkaarshaa valodaa runaajot taa satur paaris skaitljus, ar kuriem pareizinot vektoru var ieguut shii pasha vektora koordinaates citaa "telpaa", jeb attieciibaa pret citu punktu. Ogl MODELVIEW matrica transformee objektus no objekta telpas (koordinaates saglabaatas attieciibaa pret tekoshaa objekta nosaciito centru) uz acs telpu - koordinaates tiek saglabaatas attieciibaa pret cameru. Tas varbuut izklausas diezgan sarezgiiti, bet nekas vienkaarshaaks par to nevar buut. Iedomaajies sceenu: punkts atrodas 3m attaalumaa no objekta nosaciitaa centra. Acs atrodas metra attaalumaa. Tad pareizinot sho punktu ar MODELVIEW matricu tu ieguusi, ka punkts atrodas 2m attalumaa no acs. Citiem vaardiem - ar to Tu ieguusi punkta koordinaates attieciibaa pret aci. Taalaak PROJECTIOn jeb projekcijas matrica paarveers punktu no acs telpas uz ekraana telpu - kuraa vietaa uz tava monitora jaabuut attieciigajam punktam. Cereesim, ka izteicos skaidri.

Plashaaku skaidrojumu vari atrast te: http://www.euclideanspace.com/maths/algebra/matrix/index.htm

P.S. Ja kaut kas neskaidrs, droshi prasi Smile buushu prieciigs pastaastiit, jo pats atceros, cik sarezgiiti un gruuti tas viss likaas, kad es saaku maaciities. Turklaat, man dereetu zinaat, kuras lietas civleekiem skjiet neskaidras un vajadzeetu labaak uzsveert tajaa tutoriaali, ko taisos rakstiit.
_________________
Back to top
View user's profile Send e-mail
s1
Guest





PostPosted: Wed Jan 19, 2005 9:19 pm    Post subject:

Man beidzot pieleca, kas ir gluPerspective. Es atvainojos par savu neatapību.
nākošais jautājums:
for(Cur=0;Cur<ObjectCount;Cur++)
{
glLoadName(Cur);//katram objektam savu picking name noraadi
Object[Cur].DrawForPicking();//uzziimee objektu
}
ObjectCount ? vai tas ir domāts poligonu skaits?
Kā šis algoritms var zināt katra poligona numuru? manā gadījumā, poligonu virsotņu koordinātes glabājas parastā masīvā. Rolling Eyes Question
Back to top
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Jan 19, 2005 9:23 pm    Post subject:

Heh, object count ir manaa gadiijumaa Smile tas ir tikai piemeera peec. Ar to piemeeru Tev buutu jaasaprot, ka tev jaaziimee katrs objekts (jeb Tavaa gadiijumaa triistuuris) pirms katra no tiem ar glLoadName iedodot unikaalu ID nummuru, peec kura peec tam noteiksi, kursh objekts ir selecteets.
_________________
Back to top
View user's profile Send e-mail
s1
Guest





PostPosted: Wed Jan 19, 2005 9:32 pm    Post subject:

OK, paldies, ka palīdzēji. Mēģināšu tagd to palaist. Es ceru, ka tev netraucēs mani turpmākie jautājumi.
Back to top
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Jan 19, 2005 9:34 pm    Post subject:

Tikai atceries, ka glLoadName nevar izsaukt starp glBegin un glEnd; taapeec, ja tu taadus izmanto, tad tur kur man ir Object[Cur].DrawForPicking(); ir jaaieliek attieciigaa objekta/triistuura glBegin glEnd
_________________
Back to top
View user's profile Send e-mail
s1
Guest





PostPosted: Sun Jan 23, 2005 2:19 pm    Post subject:

Objektu selection strādā, taču es uzrāvos uz nepatīkamu problēmu - selection strādā pareizi tikai tad, ja "kamera" ir nekustīga, precīzāk, ja es "aizeju" objektam otrā pusē(aimugurē), tad tuvākais trīstūris uzrādās tas, kurš ir vistālāk!!!


To es dabūju no NEHE, lai gan tas ir gandrīz tas pats ko man iedeva GIGA
Vai kāds nevar arī šoreiz palīdzēt veikt kādus labokumus.

glMatrixMode(GL_PROJECTION);
glPopMatrix;
glMatrixMode(GL_MODELVIEW);
hits := glRenderMode(GL_RENDER);
if(hits > 0)then
begin
SelTriangle := buffer[3];
depth := buffer[1];
for i := 1 to hits - 1 do
if(buffer[i*4+1] < depth)then
begin
SelTriangle := buffer[i*4+3];
depth := buffer[i*4+1];
end;
end;
Back to top
Guest






PostPosted: Sun Jan 23, 2005 2:20 pm    Post subject:

Sorry, kods sagāja vienā stabā Laughing
Back to top
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Sun Jan 23, 2005 2:26 pm    Post subject:

Nu nevar buut, man shitas straadaa visos tuvum taalumos un lenkjos. Tajaa buferii buutu jaabuut saglabaatam attalumam liidz kamerai (no kameras depth buffera), taapeec buutu jaastraadaa pareizi...
_________________
Back to top
View user's profile Send e-mail
s1
Guest





PostPosted: Sun Jan 23, 2005 2:55 pm    Post subject:

Tavs kods nedaudz atšķiras no tā kas ir manā rīcībā, patiesībā sakot tavējais kods man negāja, laikam tu kautkas trūkst. šeit ir pilns selecton kods, varbūt tu vari aplūkot?

Code:
glGetIntegerv(GL_VIEWPORT,@viewport);
glSelectBuffer(512,@buffer);
glRenderMode(GL_SELECT);
glInitNames;
glPushName(0);
glMatrixMode(GL_PROJECTION);

glPushMatrix;
glLoadIdentity;

gluPickMatrix(mouseX,viewport[3] - mouseY,1.0,1.0,@viewport);
gluPerspective(45.0,(viewport[2] - viewport[0]) / (viewport[3] - viewport[1]),0.1,100.0);
glMatrixMode(GL_MODELVIEW);
//----------------------------------------------------------------------
glLoadIdentity;
glPushMatrix;
glRotate(dir,0,1,0);
glTranslate(-worldX,worldY-1.5,worldZ-25);
for i := 0 to faceCount-1 do
     begin
     glLoadName(i);
     glBegin(GL_TRIANGLES);
     drawTriangle(i);
     glEnd;
     end;
glPopMatrix;
//-----------------------------------------------------------------------
glMatrixMode(GL_PROJECTION);
glPopMatrix;
glMatrixMode(GL_MODELVIEW);
hits := glRenderMode(GL_RENDER);
if(hits > 0)then
     begin
     SelTriangle := buffer[3];
     depth := buffer[1];
     for i := 1 to hits  do
         if(buffer[i*4+1] < depth)then
              begin
              SelTriangle := buffer[i*4+3];
              depth := buffer[i*4+1];
              end;

     end;
end;

Back to top
s1
Guest





PostPosted: Sun Jan 23, 2005 3:17 pm    Post subject:

šis kods, kā jau es minēju ir no NEHE tutoriāļa. Tur bija vienkārši nekustīga kamera, tādēļ arī man dziļums strādā pareizi tikai no vienas puses.
Back to top
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Sun Jan 23, 2005 3:33 pm    Post subject:

Nu es tikko to paartulkoju uz c++; ieliku vienaa test progaa un man viss gaaja, no visaam puseem selecteeja tuvaako triistuuri kaa vajadeetu.

Luuk kods:
Code:

    GLuint   buffer[512];
    GLint   viewport[4];

glGetIntegerv(GL_VIEWPORT,viewport);
glSelectBuffer(512,buffer);
glRenderMode(GL_SELECT);
glInitNames();
glPushName(0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

POINT mouse;
GetCursorPos(&mouse);

gluPickMatrix(mouse.x,viewport[3] - mouse.y,1.0,1.0,viewport);
gluPerspective(45.0f,Window.Width/Window.Height,1.0f,1000.0f);
glMatrixMode(GL_MODELVIEW);
for(int i=0;i<Model.ModelPart[0].TriangleCount;i++)
     {
     glLoadName(i);
     glBegin(GL_TRIANGLES);
     Model.RenderTriangle(i);
     glEnd();
      }   
int hits = glRenderMode(GL_RENDER);
if(hits > 0)
     {
     SelectedTriangle=buffer[3];
     int depth = buffer[1];
     for(int i=1;i<hits;i++)
         if(buffer[i*4+1] < depth)
              {
              SelectedTriangle = buffer[i*4+3];
              depth = buffer[i*4+1];
              }

     }


Kaa redzi esmu tikai iznjeemis modelview matricas izmainjas, vienkaarshi lietojot taas, kas man jau ir no sceenas rendereeshanas. Varbuut tur ir kljuuda tavaa kodaa? Jebkuraa gadiijumaa, shitam selection kodam jaastraadaa no visaam puseem. Kljuuda tev jameklee kaut kur citur.
_________________
Back to top
View user's profile Send e-mail
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Goto page 1, 2  Next
Page 1 of 2

 
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