Mengenang Percobaan Membuat Grafis 3D

Jika grafik anda sudah terbiasa dengan grafik 2D, sering membuat aplikasi grafis dengan grafik 2D, maka anda terbiasa menggunakan istilah koordinat. Di dalam koordinat terdapat 2 hal yang sangat penting, yaitu X dan Y. Titik X pada sumbu X dan titik Y pada sumbu Y.

Waktu kuliah saya pernah mencoba membuat 3D graphic engine menggunakan bahasa C#. Untuk membangun sistem tersebut, saya membaca berbagai sumber untuk mempelajari ilmu dasar grafis 3D. Sayang sekali dulu saya mempelajarinya secara tidak beraturan, semua materi itu entah di mana lagi berada diantara tumpukan berkas-berkas.

Berbicara tentang 3D, anda sekarang melihat ke dalam 3 pengukuran, yaitu nilai X, Y, dan Z. Jadi adalagi tambahan sumbu baru, yaitu sumbu Z. Anda harus mampu berimajinasi untuk memahami konsep 3D. Bukan hanya butuh imajinasi, tetapi digunakan perhitungan rumit berupa matriks dan trigonometri.

Jika di grafis 2D, satu titik disebut piksel, lain halnya dengan grafis 3D, 1 titik disebut dengan vektor. Dalam 1 vektor terdapat 3 nilai, yaitu X, Y dan Z. Grafis 3D dimensi memang dalam dimensi 3 ruang, namun teknologi saat ini hanya mampu menampilkannya dalam media grafis 2D. Agar dapat ditampilkan ke dalam media grafis 2D, maka diperlukan perhitungan projeksi.

Saya membongkar kembali source code program yang pernah saya buat dan masih dapat saya pahami bahwa rumus projeksi grafis 3D terhadap media media grafis 2D adalah :

X = XScreen + X - Z
Y = YScreen - Y + (Z / 2)

Sayapun melihat kode yang digunakan untuk memutar (rotate) vektor. Menurut saya agak rumit. Dibutuhkan sebuah matriks diagonal seperti pada kode di bawah ini.

float[][] matrix = {
 new float[]{1,0,0,0},
 new float[]{0,1,0,0},
 new float[]{0,0,1,0},
 new float[]{0,0,0,1}
};

Perubahan nilai vektor berdasarkan nilai sudut perputaran.
public void Rotation(float angle, RotationType type)
{
    double radian = angle / 180 * Math.PI;
    float sin = (float)Math.Sin(radian);
    float cos = (float)Math.Cos(radian);
    switch (type)
    {
        case RotationType.RotationX:
            matrix[0] = new float[] { 1, 0, 0, 0 };
            matrix[1] = new float[] { 0, cos, -sin, 0 };
            matrix[2] = new float[] { 0, sin, cos, 0 };
            matrix[3] = new float[] { 0, 0, 0, 1 };
            break;
        case RotationType.RotationY:
            matrix[0] = new float[] { cos, 0, -sin, 0 };
            matrix[1] = new float[] { 0, 1, 0, 0 };
            matrix[2] = new float[] { sin, 0, cos, 0 };
            matrix[3] = new float[] { 0, 0, 0, 1 };
            break;
        case RotationType.RotationZ:
            matrix[0] = new float[] { cos, -sin, 0, 0 };
            matrix[1] = new float[] { sin, cos, 0, 0 };
            matrix[2] = new float[] { 0, 0, 1, 0 };
            matrix[3] = new float[] { 0, 0, 0, 1 };
            break;
    }
}

Vektor kemudian dikalikan dengan matriks.
public float[][] multiplyMatrix(float[][] object3d)
{
    int n = object3d.Length;
    float[][] temp = new float[n][];
    for (int i = 0; i < n; i++)
    {
        temp[i] = new float[4];
        for (int j = 0; j < 4; j++)
        {
            temp[i][j] = 0;
            for (int k = 0; k < 4; k++)
            {
                temp[i][j] += matrix[j][k] * object3d[i][k];
            }
        }
    }
    return temp;
}

Grafis 3D memang sangat rumit, apalagi jika ingin membangunnya dari nol (from the scratch). Anda harus menguasai ilmu grafik 2D terlebih dahulu sebelum mencoba melanjutkan ke tahap tersebut.

Ini adalah hasil running program yang pernah saya buat semasa kuliah. Program ini menampilkan sebuat plat berbentuk persegi panjang yang berputar-putar secara random.

Program Primitif Grafis 3D
Saya berharap ke depannya untuk membangun kembali 3D graphic engine ini menggunakan bahasa C++. Hanya sekedar coba-coba, karena saya suka sekedar coba-coba. Sebenarnya sudah ada engine bernama OpenGL yang sudah lengkap untuk 3D grafis dasar, tapi saya hanya ingin sekedar tahu.

Ahmad Jawahir

    Tidak ada komentar:

    Posting Komentar