Arama butonu
Bu konudaki kullanıcılar: 1 misafir
4
Cevap
1652
Tıklama
0
Öne Çıkarma
OpenGL World To Screen - Screen To World
R
5 yıl
Yarbay
Konu Sahibi

Selamlar. İnsanlara faydası olur bu iki fonksiyonun kodlarını paylaşıyorum.

glm::vec2 WorldToScreen(glm::mat4 viewMatrix,
glm::mat4 projectionMatrix, glm::vec3 point)
{
glm::mat4 mvpmatrix = projectionMatrix * viewMatrix;
const float *pSource = (const float *)glm::value_ptr(mvpmatrix);
glm::vec4 clipCoords;
clipCoords.x = point.x * pSource[0] + point.y * pSource[4] + point.z * pSource[8] + pSource[12];
clipCoords.y = point.x * pSource[1] + point.y * pSource[5] + point.z * pSource[9] + pSource[13];
clipCoords.z = point.x * pSource[2] + point.y * pSource[6] + point.z * pSource[10] + pSource[14];
clipCoords.w = point.x * pSource[3] + point.y * pSource[7] + point.z * pSource[11] + pSource[15];

glm::vec3 normalizedDeviceCoordinates;
normalizedDeviceCoordinates.x = clipCoords.x / clipCoords.w;
normalizedDeviceCoordinates.y = clipCoords.y / clipCoords.w;
normalizedDeviceCoordinates.z = clipCoords.z / clipCoords.w;

GLint viewport[4] = {0};
glGetIntegerv(GL_VIEWPORT, viewport); // viewport = (0, 0, width, height)

glm::vec3 winPos;
winPos.x = (viewport[2] / 2 * normalizedDeviceCoordinates.x) + (normalizedDeviceCoordinates.x + viewport[2] / 2);
winPos.y = -(viewport[3] / 2 * normalizedDeviceCoordinates.y) + (normalizedDeviceCoordinates.y + viewport[3] / 2);
winPos.z = 0;

return winPos;
}

glm::vec3 ScreenToWorld(glm::mat4 viewMatrix, glm::mat4 projectionMatrix, glm::vec2 point)
{
GLfloat winX, winY, winZ;
GLint viewport[4] = {0};
glGetIntegerv(GL_VIEWPORT, viewport); // viewport = (0, 0, width, height)

winX = (float)point.x;
winY = (float)viewport[3] - (float)point.y;
glReadPixels(point.x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

glm::vec3 ret = glm::unProject(glm::vec3(winX, winY, winZ), viewMatrix, projectionMatrix, glm::vec4(viewport[0], viewport[1], viewport[2], viewport[3]));
return ret;
}


Bir açıklama olmadan paylaşıyorum farkındayım. Amacım bu fonksiyonları adım adım anlatarak insanlara sıfırdan öğretmek değil, tam tersine belli bir bilgi birikimi olan insanların faydalanmasını sağlamak. Zaten bu fonksiyonlardan başlayarak sıfırdan anlatılmaz.

https://requizm.blogspot.com/2019/08/opengl-world-to-screen-ve-screen-to.html





< Bu mesaj bu kişi tarafından değiştirildi requizm -- 1 Ağustos 2019; 20:25:55 >

C
5 yıl
Yüzbaşı

Unity'de oyun geliştirirken screentoworldpoint alıyordum onla ilgisi var mı bu kodların ? OpenGl bilmiyorum oyun geliştiriyorum ama framework ile geliştirdiğimden işin tam temeline hakim değilim.


Bu mesaja 1 cevap geldi.
R
5 yıl
Yarbay
Konu Sahibi

quote:

Orijinalden alıntı: codforc

Unity'de oyun geliştirirken screentoworldpoint alıyordum onla ilgisi var mı bu kodların ? OpenGl bilmiyorum oyun geliştiriyorum ama framework ile geliştirdiğimden işin tam temeline hakim değilim.
Evet. Screentoworld'ün yaptığı şey şudur. Oyunda iki farklı koordinat sistemi olduğunu düşünelim. Birincisi dünya koordinat sistemi(3 boyutlu). İkincisi ekran koordinat sistemi(2 boyutlu).

Mesela unity şu kodları yazdığımızı varsayalım.

void Update()
{
Vector3 newPos = screentoworldpoint(mouse.x, mouse.y);
player.transform.position = newPos;
}


Artık player objesi mouse pozisyonu ile hizalı dünya koordinatında olacaktır.

Not: Unity parametre olarak Vector3 alıyormuş ama temelde aynı şey.





< Bu mesaj bu kişi tarafından değiştirildi requizm -- 2 Ağustos 2019; 19:34:42 >
Bu mesaja 1 cevap geldi.
C
5 yıl
Yüzbaşı

Anladım. Biz eğer Unity'de yazılan oyunu OpenGL'de yazarsak bu çok daha hızlı olur değil mi ? Fakat çok daha fazla kod,fonksiyon yazmamız gerekir diye düşünüyorum. Yanlış anlamayın fazla kod yazmaya karşı değilim. Unity c#'ta günlerce uğraştığım problemi acaba OpenGL'de ne kadar da çözerdim kim bilir


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Requizm
R
5 yıl
Yarbay
Konu Sahibi

quote:

Orijinalden alıntı: codforc

Anladım. Biz eğer Unity'de yazılan oyunu OpenGL'de yazarsak bu çok daha hızlı olur değil mi ? Fakat çok daha fazla kod,fonksiyon yazmamız gerekir diye düşünüyorum. Yanlış anlamayın fazla kod yazmaya karşı değilim. Unity c#'ta günlerce uğraştığım problemi acaba OpenGL'de ne kadar da çözerdim kim bilir
Eğer ki iyi derecede bilgiye sahipsen evet yapabilirsin, sonuçta unity genele hitap ediyor, senin yaptığın ise kendi oyununa özel olacak. Ama Unity gibi oyun motorları genel kullanıcıya hitap ettiği için bir sürü optimizasyon seçeneği oluyor. Çok fazla özelliği oluyor. Arayüz kullanımı vs basit. Bu yüzden oyunun büyüklüğüne bağlı olarak oyun motoru yazmak ayrı bir maliyet.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.