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
}
}
