Şimdi Ara

OpenGL World To Screen - Screen To World

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
1.656
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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 >







  • 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.
  • 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 >
  • Requizm kullanıcısına yanıt
    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
  • 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.




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.