Obyektning ko‘zgudagi aksi.
Bu bo‘limda biz tekis obyektlarni akslantirish algoritmlarini ko‘rib chiqamiz. Bunday aks qaytarishlar tasvir ko‘rinishida katta axamiyatga ega va ularni oson amalga oshirish mumkin.
Algoritm kuzgu bilan 2 ta to‘liq sahnani jamlaydi: “haqiqiy” va “virtual” ko‘zgu orqasida joylashgan. Demak, aksni chizish jarayoni ikki qismdan iborat: 1) Har daqiqa sahnaning vizualligi va 2) Virtuallarni qurilish va vizuallashi har bir “haqiqiy” obyekt uchun uning ikkinchisi – aksi ko‘riladi, ya’ni kuzatuvchi ko‘zguda ko‘riladi.
Misol uchun devorda osilib turgan ko‘zguli xonani tasavvur qilamiz. Xona va obyektlar shunaqa ko‘zgu ko‘rinishida, huddi, agar ko‘zgu shisha bo‘lsa ko‘rinadigan, uning orqasida ham huddi shunaqa ko‘zgu bor. Ular tekislikka nisbatan simmetrik – aksi berilgan, ko‘zgu tepasidan o‘tkazilgan.
3.9-rasm. Ko‘zgudagi tasvir.
Tekislik aksini yaratish algoritmning soddalashtirilgan varianti quyidagi qadamlardan iborat:
Sahnani har doimgidek chizamiz, ammo ko‘zgu obyektlarisiz.
Niqob buferi ishlatgan xolda, ekranga ko‘zgu proeksiyasining keyingi natijalarini cheklaymiz.
Ko‘zgu tekisligiga nisbatan akslangan sahnani vizuallashtiramiz. Shunda niqob buferi ko‘zgu obyekti proeksiyasi shaklining natijasini cheklash imkonini beradi.
Bu harakat ketma-ketligi akslantirishning ishonchli samarasini olish imkonini beradi.
Bosqichlarni batafsil kurib chiqamiz.
Dastlab sahnani odatdagidek chizish kerak. Bu bosqichga batafsil to‘htalmaymiz. Chizishdan oldin bevosita OpenGL buferi tozalashda, niqob buferini tozalashni unutmaslik lozim:
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|
GL_STENCIL_BUFFER_BIT);
Sahnani vizuallashtirish vaqtida obyektlarni chizmagan ma’qul, keyinchalik ular ko‘zguda tasvirdek bo‘lib qoladi.
Ikkinchi bosqichda ekranga ko‘zgudagi obyekt proeksiyasining keyingi natijalarini cheklash zarur.
Buning uchun niqob buferini to‘g‘rilaymiz va ko‘zgu yasaymiz.
glEnable(GL_STENCIL_TEST);
/* shart doim bajariladi va buferdagi qiymat 1 ga teng bo‘ladi */
glStencilFunc(GL_ALWAYS, 1, 0);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
RenderMirrorObject();
Natijada biz quyidagiga ega bo‘ldik:
Kadr buferida ko‘zgu sohasidan tashqarida bo‘lgan aniq chizilgan sahna;
Ko‘zgu sohasida (biz akslantirishni ko‘rmoqchi bo‘lgan joyda) niqob buferi qiymati 1 ga teng.
Uchinchi bosqichda ko‘zgudagi obyekt tekisligiga nisbatan aks etuvchi sahnani chizish zarur.
Dastlab akslantirish matritsasini to‘g‘rilab olamiz. Akslantirish matritsasi tekislikka nisbatan butun geometriyani ko‘zguda akslantirish lozim, ko‘zgu – aksi yotgan obyektni ko‘rsatishi kerak. Uni topish mumkin, masalan, quyidagi funksiyalar orqali (mashq sifatida mustaqil ushbu matritsani olishga harakat qiling).
void
Do'stlaringiz bilan baham: |