Artariel Mesaj tarihi: Ocak 6, 2013 Paylaş Mesaj tarihi: Ocak 6, 2013 aslında opengl konusu sayılmaz, ekranda 2d bir noktayı 3d projeksiyonda bir noktaya nasıl çevirebilirim ? örnek verecek olursam, 3d dünyada mouse ile tıkladığım yere karakteri yürütmek gibi. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Kojiroh Mesaj tarihi: Ocak 6, 2013 Paylaş Mesaj tarihi: Ocak 6, 2013 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ş Daha fazla paylaşım seçeneği…
Kojiroh Mesaj tarihi: Ocak 6, 2013 Paylaş Mesaj tarihi: Ocak 6, 2013 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ş Daha fazla paylaşım seçeneği…
Rahan Mesaj tarihi: Ocak 9, 2013 Paylaş Mesaj tarihi: Ocak 9, 2013 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ş Daha fazla paylaşım seçeneği…
Cd- Mesaj tarihi: Ocak 13, 2013 Paylaş Mesaj tarihi: Ocak 13, 2013 http://www.opengl.org/sdk/docs/man2/xhtml/gluUnProject.xml said: gluUnProject — map window coordinates to object coordinates Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Artariel Mesaj tarihi: Ocak 14, 2013 Konuyu açan Paylaş Mesaj tarihi: Ocak 14, 2013 ç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ş Daha fazla paylaşım seçeneği…
Öne çıkan mesajlar