Arama butonu
Bu konudaki kullanıcılar: 1 misafir
4
Cevap
2179
Tıklama
0
Öne Çıkarma
OpenGL World To Screen - Screen To World
R
6 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 >

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.