Bu yazımda obje üzerinde öteleme ve ölçeklendirme işlemlerini gösterip bu işlemlerin Stm32f4 kiti üzerinde uygulamasını yapacağım.
Öteleme
Öteleme bütün noktaların belli bir yönde ve uzunlukta yer değiştirmesidir. nokta ve öteleme matrisi olmak üzere öteleme;
şeklinde verilir. İşlemi fonksiyon olarak yazalım:
/**@Tanim : Objeyi belirlenen degerlerde oteleyen fonksiyon *@Parametreler : Obje = Objenin adresi * x, y, z = Oteleme degerlerı */ void GL_3DOtele(GL_Obje *Obje, float x, float y, float z) { //Butun noktalar ıcın donguda kal for(int i = 0; i < Obje->NoktaSayisi; i++){ //Butun koordinatları belirlenen degerde otele Obje->Noktalar[i][0] += x; Obje->Noktalar[i][1] += y; Obje->Noktalar[i][2] += z; } //Ayni islemi koordinat ve merkez ıcın de yap Obje->Koordinat[0] += x; Obje->Koordinat[1] += y; Obje->Koordinat[2] += z; Obje->Merkez[0] += x; Obje->Merkez[1] += y; Obje->Merkez[2] += z; }
Ölçeklendirme
Ölçeklendirme belirli bir katsayı oranında, noktaların, referans noktası sabit kalacak şekilde referans noktasına uzaklığının değişmesidir. referans noktası, ölçeklendirilecek noktanın koordinatı ve ölçeklendirme matrisi olmak üzere, ilk olarak ölçeklendirilecek noktadan referans noktasının çıkrarılması daha sonra ölçeklendirilmesi ve son olarak çıkarılan referans noktasın tekrar eklenmesi gerekmektedir.
Fonksiyon şeklinde yazarsak:
/**@Tanim : Objenin belirlenen noktaya gore olcekleyen fonksiyon *@Parametreler : Obje = Olceklenecek objenin adresi * ReferansNoktasi = Olceklerken referans alınacak nokta. Eger * tanimlanmamis(NULL) ise Obje nin merkez noktasi * Olcek = Olcekleme katsayisi */ void GL_3DOlcekle(GL_Obje *Obje, float *ReferansNoktasi, float Olcek) { //Nokta sayisi kadar dongude kal for(int i = 0; i < Obje->NoktaSayisi; i++){ //Objenin koordinatlarini referans noktasina göre olcekle if(ReferansNoktasi != NULL){ Obje->Noktalar[i][0] = Olcek * (Obje->Noktalar[i][0] - ReferansNoktasi[0]) + ReferansNoktasi[0]; Obje->Noktalar[i][2] = Olcek * (Obje->Noktalar[i][1] - ReferansNoktasi[1]) + ReferansNoktasi[1]; Obje->Noktalar[i][3] = Olcek * (Obje->Noktalar[i][2] - ReferansNoktasi[2]) + ReferansNoktasi[2];} else{ //Eger referans noktasi tanimlanmamis(NULL) ise objenin merkez noktasina gore olcekle Obje->Noktalar[i][0] = Olcek * (Obje->Noktalar[i][0] - Obje->Merkez[0]) + Obje->Merkez[0]; Obje->Noktalar[i][1] = Olcek * (Obje->Noktalar[i][1] - Obje->Merkez[1]) + Obje->Merkez[1]; Obje->Noktalar[i][2] = Olcek * (Obje->Noktalar[i][2] - Obje->Merkez[2]) + Obje->Merkez[2]; } } //Ayni islemi koordinat ve merkez icin de yap if(ReferansNoktasi != NULL){ Obje->Koordinat[0] = Olcek * (Obje->Koordinat[0] - ReferansNoktasi[0]) + ReferansNoktasi[0]; Obje->Koordinat[1] = Olcek * (Obje->Koordinat[1] - ReferansNoktasi[1]) + ReferansNoktasi[1]; Obje->Koordinat[2] = Olcek * (Obje->Koordinat[2] - ReferansNoktasi[2]) + ReferansNoktasi[2]; Obje->Merkez[0] = Olcek * (Obje->Merkez[0] - ReferansNoktasi[0]) + ReferansNoktasi[0]; Obje->Merkez[1] = Olcek * (Obje->Merkez[1] - ReferansNoktasi[1]) + ReferansNoktasi[1]; Obje->Merkez[2] = Olcek * (Obje->Merkez[2] - ReferansNoktasi[2]) + ReferansNoktasi[2]; } else{ Obje->Koordinat[0] = Olcek * (Obje->Koordinat[0] - Obje->Merkez[0]) + Obje->Merkez[0]; Obje->Koordinat[1] = Olcek * (Obje->Koordinat[1] - Obje->Merkez[1]) + Obje->Merkez[1]; Obje->Koordinat[2] = Olcek * (Obje->Koordinat[2] - Obje->Merkez[2]) + Obje->Merkez[2]; Obje->Merkez[0] = Olcek * (Obje->Merkez[0] - Obje->Merkez[0]) + Obje->Merkez[0]; Obje->Merkez[1] = Olcek * (Obje->Merkez[1] - Obje->Merkez[1]) + Obje->Merkez[1]; Obje->Merkez[2] = Olcek * (Obje->Merkez[2] - Obje->Merkez[2]) + Obje->Merkez[2]; } }
Uygulama:
#include "stm32f4xx.h" #include "donanim.h" #include "3D.h" #define BEYAZ 0xFFFF int main() { //GPIO, LTDC, FMC... donanimlarini aktif et DonanimiHazirla(); //Kup objesi olustur GL_Obje Kup; //Kup objesini gercek bir kup objesine donustur GL_3DKupYarat(&Kup, 110, 60, 0, 100, BEYAZ) while(1){ //Kup u buyut for(int i = 0; i < 500; i++) { //Kup objesini ciz GL_3DObjeCiz(&Kup); //Kup objesini kendi merkezinde butun eksenler etrafinda 2 derece dondur GL_3DDonusum(&Kup, NULL, 2, 2, 2); //Kup u 1.001 oranında buyut GL_3DOlcekle(&Kup, Kup.Merkez, 1.001); //30ms bekle Bekle(30); } //Kup u kucult for(int i = 0; i < 500; i++) { //Kup objesini ciz GL_3DObjeCiz(&Kup); //Kup objesini kendi merkezinde butun eksenler etrafinda 2 derece dondur GL_3DDonusum(&Kup, NULL, 2, 2, 2); //Kup u 0.999 oranında buyut GL_3DOlcekle(&Kup, Kup.Merkez, 0.999); //30ms bekle Bekle(30); } //Kup u otele for(int i = 0; i < 500; i++) { //Kup objesini ciz GL_3DObjeCiz(&Kup); //Kup objesini kendi merkezinde butun eksenler etrafinda 2 derece dondur GL_3DDonusum(&Kup, NULL, 2, 2, 2); //Kup u belirlenen koordinatlarda otele GL_3DOtele(&Kup, -0.3, 0.06, 0); //30ms bekle Bekle(30); } //Kup u eski yerine otele for(int i = 0; i < 500; i++) { //Kup objesini ciz GL_3DObjeCiz(&Kup); //Kup objesini kendi merkezinde butun eksenler etrafinda 2 derece dondur GL_3DDonusum(&Kup, NULL, 2, 2, 2); //Kup u belirlenen koordinatlarda otele GL_3DOtele(&Kup, 0.3, -0.06, 0); //30ms bekle Bekle(30); } //Basa dön } }