Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

opengl 2d noktayı 3d'ye çevirme


Artariel

Öne çıkan mesajlar

Hmm aslında OpenGL'in kendinde var böyle bi olay, hangi objenin hangi face'ine tıkladığına kadar veriyo ama sanki sadece fixed pipeline'da var gibi geldi şimdi düşününce.

Eğer yoksa da aklıma gelen bikaç çalışma mantığı var:

- Tıklanan 2d noktanın x'i ve y'sini alıp, kameranın baktığı vektöre relative bi şekilde ilerletiyo, döngünün her anında o anki x,y,z'de bi obje var mı diye bakıyo
- Kameranın görüş alanı içersindeki objeleri 2d bi alana project edip tıklanan x,y'dekini buluyo

Tamamen götümden atarak bulduğum, aşırı yavaş çalışması muhtemel bu iki tamamen yalan muhtemelen. Ama dediğim gibi OpenGL'inkine bakmak lazım.

Fixed pipeline kullanıyosan bi bakim yaptğım bi oyunda kullanmıştım o tıklama detect etme olayını.
Link to comment
Sosyal ağlarda paylaş

Evet 2. yöntem gibi yapılıyomuş, tek bi fonksiyon diilmiş ama. Bendeki kod tabi fixed pipeline için ama sanki shadera da uygulanır gibi geldi.

Kısaca mantık şu:

- 64 elemanlı bi GLuint buffer'ı tanımlıyosun
- glSelectBuffer'a bu buffer'ı ve boyutunu veriyosun
- glGetIngeterv ile viewport matrixini 4'lü bi vektöre alıyosun
- Render modu GL_SELECT'e çekiyosun
- Projection matrixine geçiyosun
- gluPickMatrix ile viewport'un 4'lü vektöründen, mouse'un x'i ve y'sinden başlayıp 1'er birim genişlik ve yükseklikte bi alan seçiyosun
- glRenderMode fonksiyonunu kullanarak render modunu yine GL_RENDER'a çekiyosun ve 1 frame render ediyosun, fonksiyonun dönüş değeri sana çarpışma sayısını veriyo
- Çarpışma sayısı 0'dan büyükse, select bufferına bakıyosun, buffer'ın 0. indexi sana hit sayısını veriyo, 1 ve 2 ne işe yarıyo bilmiyom ama 3. indexinden itibaren, seçilen name'leri veriyo. Artık sen render bufferına neyi hangi name ile attıysan o name geliyo yani.

Fixed pipeline işini görüyosa http://pastebin.com/rcn0RiN0
Link to comment
Sosyal ağlarda paylaş

cad gibi bir ortamdaysan, hızlıca implement edebileceğin bir şey arıyorsan; kameranın konumu ve kameranın yönünden oluşturacağın ışın ile sahnedeki her face için, face-ray intersection yapıp makul bir sonuç alabilirsin.

benzerini pratikte yaptım, düşündüğün kadar yavaş olmuyor. internette bolca hazır intersection kodu var.
Link to comment
Sosyal ağlarda paylaş

çok teşekkürler kojiroh, gluunproject fonksiyonunun da sourcesini buldum atayım


int glhUnProjectf(float winx, float winy, float winz, float *modelview, float *projection, int *viewport, float *objectCoordinate)
{
//Transformation matrices
float m[16], A[16];
float in[4], out[4];
//Calculation for inverting a matrix, compute projection x modelview
//and store in A[16]
MultiplyMatrices4by4OpenGL_FLOAT(A, projection, modelview);
//Now compute the inverse of matrix A
if(glhInvertMatrixf2(A, m)==0)
return 0;
//Transformation of normalized coordinates between -1 and 1
in[0]=(winx-(float)viewport[0])/(float)viewport[2]*2.0-1.0;
in[1]=(winy-(float)viewport[1])/(float)viewport[3]*2.0-1.0;
in[2]=2.0*winz-1.0;
in[3]=1.0;
//Objects coordinates
MultiplyMatrixByVector4by4OpenGL_FLOAT(out, m, in);
if(out[3]==0.0)
return 0;
out[3]=1.0/out[3];
objectCoordinate[0]=out[0]*out[3];
objectCoordinate[1]=out[1]*out[3];
objectCoordinate[2]=out[2]*out[3];
return 1;
}
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...