Saya membaca pertanyaan yang disarankan serupa dan solusinya, tetapi tidak dapat menemukan jawaban .

Saya mencoba menggambar pemandangan dengan tampilan isometrik di OpenGL.

Fungsi menggambar:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glRotatef(atan(0.5f) * 180.0f / PI, 1.0f, 0.0f, 0.0f);
glRotatef(-45.0f, 0.0f, 1.0f, 0.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
    
glBegin(GL_QUADS);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 1.0f);
glEnd();

glPopMatrix();

Pada akhirnya, saya mendapatkan hasil ini. Kamera memang memiliki proyeksi isometrik, tetapi untuk beberapa alasan poligon terpotong.

Screen 1

Jika saya menambahkan glTranslatef(-0.8f, 0, -0.8f) sebelum menggambar segi empat, hasilnya adalah sebagai berikut:

Screen 2

Masalahnya adalah saya tidak menerapkan pengoptimalan apa pun pada render OpenGL. Tapi mengapa poligon harus dipotong?

1
Mark R. 30 Juni 2020, 23:17

1 menjawab

Jawaban Terbaik

Poligon terpotong oleh bidang dekat atau jauh dari volume tampilan.

Bila Anda tidak mengatur matriks proyeksi, maka ruang tampilan, ruang klip, dan ruang perangkat yang dinormalisasi adalah sama. Ruang perangkat yang dinormalisasi adalah kubus unik dengan kiri, bawah, dekat (-1, -1, -1) dan kanan, atas, jauh (1, 1, 1). Semua geometri yang tidak ada di dalam kubus ini terpotong.

Sebenarnya Anda menggambar segi empat dengan panjang sisi 1. Salah satu simpul segi empat berada di titik asal pandangan (0, 0, 0). Quad diputar di sekitar titik asal dengan glRotate. Karena panjang diagonal dari segi empat adalah sqrt(2.0), salah satu simpul dari segi empat yang diputar dipotong oleh bidang dekat atau bidang jauh.

Jika Anda membuat dan memutar sebuah segi empat yang pusatnya (0, 0 ,0), segi empat itu tidak akan terpotong, karena panjang dari pusat setiap simpul adalah sqrt(2.0)/2.0. Itu kurang dari 1 (jarak ke bidang dekat dan jauh membentuk pusat volume tampilan)

glBegin(GL_QUADS);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(-0.5f, 0.0f, -0.5f);
glVertex3f( 0.5f, 0.0f, -0.5f);
glVertex3f( 0.5f, 0.0f,  0.5f);
glVertex3f(-0.5f, 0.0f,  0.5f);
glEnd();

Masing-masing

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glRotatef(atan(0.5f) * 180.0f / PI, 1.0f, 0.0f, 0.0f);
glRotatef(-45.0f, 0.0f, 1.0f, 0.0f);

glTranslate(-0.5f, 0.0f, -0.5f);

glBegin(GL_QUADS);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 1.0f);
glEnd();

Atau, Anda dapat menyetel Proyeksi ortografis, yang memperbesar volume tampilan sebesar glOrtho:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrtho(-1.0, 1.0, -1.0, 1.0, -2.0, 2.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glRotatef(atan(0.5f) * 180.0f / PI, 1.0f, 0.0f, 0.0f);
glRotatef(-45.0f, 0.0f, 1.0f, 0.0f);    

glBegin(GL_QUADS);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 1.0f);
glEnd();
2
Rabbid76 30 Juni 2020, 21:02