Proyeksi ortografis dengan asal di kiri bawah layar

Saya menggunakan pengikatan python OpenGL, dan mencoba hanya menggunakan panggilan opengl modern. Saya memiliki VBO dengan simpul, dan saya mencoba merender dengan matriks proyeksi ortografis yang diteruskan ke vertex shader.

Saat ini saya sedang menghitung matriks proyeksi saya dengan nilai berikut:

from numpy import array

w = float(width)
h = float(height)
n = 0.5
f = 3.0

matrix = array([
                   [2/w,        0,        0,        0],
                   [  0,      2/h,        0,        0],
                   [  0,        0,  1/(f-n), -n/(f-n)],
                   [  0,        0,        0,        1],
               ], 'f')


#later
projectionUniform = glGetUniformLocation(shader, 'projectionMatrix')
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)

Kode itu saya dapatkan dari sini:

Rumus matriks proyeksi ortogonal?

Ini sepertinya berfungsi dengan baik, tapi saya ingin Asal saya ada di sudut kiri bawah layar. Apakah ini fungsi yang dapat saya terapkan pada matriks saya sehingga semuanya "berfungsi", atau haruskah saya menerjemahkan setiap objek dengan w/2 h/2 secara manual?

catatan tambahan: Akankah koordinatnya cocok dengan posisi piksel dan ini berfungsi dengan benar?

Karena saya menggunakan teknik OpenGL modern, menurut saya saya tidak seharusnya menggunakan panggilan gluOrtho2d atau GL_PROJECTION.


person Shootfast    schedule 16.11.2012    source sumber


Jawaban (3)


Saya belum sepenuhnya paham dengan proyeksi, karena saya baru memulai pemrograman OpenGL baru-baru ini, tetapi matriks Anda saat ini tidak menerjemahkan poin apa pun. Diagonal akan menerapkan penskalaan, tetapi kolom paling kanan akan menerapkan terjemahan. Tautan yang diberikan Dirk memberi Anda matriks proyeksi yang akan menjadikan asal Anda (0,0 adalah yang Anda inginkan, ya?) di sudut kiri bawah layar Anda.

Matriks yang saya gunakan untuk melakukan ini (setiap baris sebenarnya adalah kolom untuk OpenGL):

OrthoMat = mat4(
        vec4(2.0/(screenDim.s - left),  0.0,    0.0,    0.0),
        vec4(0.0,   2.0/(screenDim.t - bottom),     0.0,    0.0),
        vec4(0.0,   0.0,    -1 * (2.0/(zFar - zNear)),  0.0),
        vec4(-1.0 * (screenDim.s + left)/(screenDim.s - left), -1.0 * (screenDim.t + bottom)/(screenDim.t - bottom), -1.0 * (zFar + zNear)/(zFar - zNear), 1.0)
 );

Perhitungan screenDim secara efektif adalah lebar atau tinggi, karena kiri dan bawah keduanya disetel ke 0. zFar dan zNear masing-masing adalah 1 dan -1 (karena ini 2D, keduanya tidak terlalu penting).

Matriks ini mengambil nilai dalam piksel, dan posisi titik juga harus dalam piksel. Titik (0, 32) akan selalu berada pada posisi yang sama ketika Anda mengubah ukuran layar juga.

Semoga ini membantu.

Sunting #1: Agar lebih jelas, nilai kiri/bawah/zfar/zdekat yang saya nyatakan adalah nilai yang Saya pilih untuk dibuat. Anda dapat mengubahnya sesuai keinginan Anda.

person Hydronium    schedule 19.11.2012
comment
Terima kasih banyak atas teladan Anda Alex. Dengan menggabungkan ini, dan GL_FALSE saya yang tercampur, semuanya berfungsi seperti yang diharapkan! - person Shootfast; 19.11.2012

Anda dapat menggunakan matriks proyeksi yang lebih umum yang juga menggunakan posisi kiri dan kanan.

Lihat Wikipedia untuk mengetahui definisinya.

person Dirk    schedule 16.11.2012

glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)

Matriks Anda disimpan dalam urutan baris-utama. Jadi, Anda harus meneruskan GL_TRUE, atau Anda harus mengubah matriks Anda menjadi kolom-utama.

person Nicol Bolas    schedule 18.11.2012
comment
Terima kasih telah menemukan Nicol itu. Adakah ide tentang bagaimana saya bisa memindahkan titik asal ke sudut kiri bawah? - person Shootfast; 19.11.2012