Yazan : Şadi Evren ŞEKER

Bilgisayar grafiklerinde bir nesnenin diğer nesnelere bağlı olarak hareket etmesi mümkündür. Bunu sağlamak için bir varlık ağaç yapısı üzerinden bütün nesneler birbirine bağlanır. Ardından bağlı nesneleri çağıran bir dolaşma (traverse) fonksiyonu özyineli (recursive) olarak çalışır ve bütün nesneleri doğru sıra ile ve doğru şekil dönüşümleri ile (transformation) çizer.

Bu ağaç yapısının tanımlanması aslında C dilindeki yapılar (structs) ile mümkündür. Ağacı oluşturan her düğümün (node) yapısı aşağıda verilmiştir:

Düğüm Yapısı:

typedef struct treenode
{
Glfloat m[16];
void (*f)();
struct treenode *sibling;
struct treenode *child;
} treenode;

Yukarıdaki kodda bir şekli oluşturan veri bilgisi tanımlanmıştır. Bu veri ünitesinde bir dönüşüm matrisi (m) bir fonksiyon göstericisi (function pointer) ve komşu ve çocuklarını gösteren birer gösterici (pointer) bulunmaktadır.

Atama işlemi:

Aşağıdaki kod örneğinde yukarıda tanımlanmış olan yapının (struct) içerisine ilgili değerler atanmıştır (örnek olarak)

treenode torso_node, head_node, lua_node, … ;
/* use OpenGL functions to form transformation matrices */
glLoadIdentity();
glRotatef(theta[0], 0.0, 1.0, 0.0);
/* move modelview matrix to m */
glGetFloatv(GL_MODELVIEW_MATRIX, torso_node.m)
torso_node.f = torso_draw; /* torso_draw() draws torso */
torso_node.sibling = NULL;
torso_node.child = &head_node;

Dolaşma Fonksiyonu:

Son olarak yukarıda tanımlanan ve içerisine değer atanan yapıyı dolaşan ve dolaşırken ekrana basan fonksiyon aşağıda verilmiştir:

void traverse(treenode *root)
{
if(root == NULL) return;
glPushMatrix();
glMultMatrix(root->m);
root->f();
if(root->child != NULL)
traverse(root->child);
glPopMatrix();
if(root->sibling != NULL)
traverse(root->sibling);
}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir