OpenGL de üç temel model dönüşümü vardır, glTranslate*(), glRotate*(),ve glScale*( )dir. Bu rutinler nesneyi hareketle, döndürerek, uzatarak, küçülterek, yada yansıtarak öteler.
Bu üç komut uygun öteleme, döndürme, ve ölçü matrisini üretmek için yeterlidir. OpenGL otomatik olarak matrisleri sizin için hesaplanır.
ÖTELEME(glTranslate)
void glTranslated (GLdouble x,GLdouble y,GLdouble z) void glTranslatef ( GLfloat x,GLfloat y,GLfloat z)
glTranslate nin x y z parametresi gecerli matrix modu ile belirlenen matrix
çarpılarak ötelenmektedir.
Örnek olarak kup programında bu uygulamaları yapa biliriz.
#include<GL/glut.h> void init(void) { glClearColor(1.0, 1.0, 1.0, 1.0); glShadeModel(GL_FLAT); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 0.0, 0.0); glLoadIdentity(); /* matrix temizleniyor */ gluLookAt(0.0, 1.0, 3.0,0.0, 0.0, 0.0, 0.0, 1.0, 0.0);/* Görüş dönüşümleri*/ glTranslatef(0.0, 0.0, 0.0); /* model Dönüşümleri */ glutWireCube(1.0); glFlush(); } void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); glMatrixMode(GL_MODELVIEW); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(300, 300); glutInitWindowPosition(100, 100); glutCreateWindow("OpenGLTurk"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }
kodun display fonksiyonunda gltranslate x y z degerleri 0.0 verilmiş
void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 0.0, 0.0); glLoadIdentity(); /* matrix temizleniyor */ gluLookAt(0.0, 1.0, 3.0,0.0, 0.0, 0.0, 0.0, 1.0, 0.0);/* görüş dönüşümleri */ glTranslatef(0.0, 0.0, 0.0); /* model dönüşümleri */ glutWireCube(1.0); glFlush(); }öteleme fonksiyonunu x parametresini 1.0 olarak degiştirerek
glTranslatef(1.0, 0.0, 0.0);öteleme fonksiyonunu y parametresini 1.0 olarak degiştirerek
glTranslatef(0.0,1.0, 0.0);öteleme fonksiyonunu z parametresini 1.0 olarak degiştirerek
glTranslatef(0.0, 0.0, 1.0);kup üzerinde etkisini göre bilriz Not:glTranslate*() için argüman olarak (0.0, 0.0, 0.0) kullanmanın nesne veya yerel koordinat sistemine hiçbir etkisi olmadığını unutmayın. DÖNDÜRME(glRotate)
void glRotated(GLdouble angle,GLdouble x,GLdouble y,GLdouble z); void glRotatef( GLfloat angle,GLfloat x,GLfloat y,GLfloat z);

glRotatef(45.0, 0.0, 0.0,1.0);/* model dönüşümleri */ kısmına ekleyerek deneye bilirsiniz. NOT: Dönüş ekseninden uzakta bulunan bir nesnenin, eksene yakın çizilen bir nesneden daha keskin döndüğüne (daha geniş bir yörüngeye sahip) oldugunu unutmayın. BOYUTLANDIRMA(glScale)
void glScaled( GLdouble x,GLdouble y,GLdouble z); void glScalef( GLfloat x,GLfloat y,GLfloat z);

glScalef(1.0, 2.0, 1.0);glScale*(), bir nesnenin belirgin büyüklüğünü değiştiren üç modelleme dönüşümünden sadece biridir: 1.0’dan büyük bir değerle boyutlandırmak bir nesneyi uzatır ve 1.0’dan küçük değerler kullanmak onu küçültür. -1.0 değeriyle boyutlandırma bir nesneyi bir eksen üzerinde yansıtır. Ölçekleme için kimlik değerleri, (1.0, 1.0, 1.0)’dır. Genelde glScale*() kullanımınızı gerekli olduğu zamanlarla kısıtlamanız gerekir. glScale*() kullanmak ışıklandırma hesaplamalarının performansını azaltır çünkü yüzey vektörlerinin dönüştürmeden sonra yeniden normallaştirilmesi gerekir. Not: Sıfır değerinde bir ölçek o eksen boyunca tüm nesne koordinatlarını sıfıra çeker. Bunu yapmak genellikle iyi bir fikir değildir, çünkü böyle bir operasyon geriye alınamaz. Matematiksel olarak konuşursak matris geriye çevrilemez ve invers matrisler belli ışıklandırma operasyonları için gereklidir.
Hiç yorum yok:
Yorum Gönder