Arsip

Archive for the ‘Gamedev’ Category

Konversi vektor screen ke world pada orthogonal projection

28 September 2008 kecebongsoft Tinggalkan komentar

Banyak yang bingung mencari nilai vektor (x, y) pada 3D world yang berasal dari vektor screen. Biasanya teknik ini disebut picking. Kali ini kita akan melakukan konversi vektor screen ke vektor 3D world, tapi dalam orthogonal projection, yang berarti posisi y axis kamera sama nilainya dengan posisi y axis poros kamera. Disini kita menggunakan OpenGL dan GLFW sebagai frameworknya.

Banyak sekali teknik picking yang sudah ada, saya nggak akan ngebahas banyak tentang matematika untuk mendapatkan nilai vektornya, karena OpenGL sendiri punya sebuah library bernama GLU, kita akan menggunakan fungsi gluUnProject() milik GLU untuk melakukan konversi koordinat window ke koordinat objek.

GLdouble posx,posy,posz; // variabel untuk menyimpan hasil konversi
int mx,my; // variabel untuk menyimpan koordinat mouse

// ambil koordinat mouse dengan GLFW, bisa juga menggunakan lib lain (SDL, etc)
glfwGetMousePos(&mx,&my); 

glLoadIdentity(); // reset matrix
GLdouble modelMatrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix);
GLdouble projMatrix[16];
glGetDoublev(GL_PROJECTION_MATRIX,projMatrix);
int viewport[4];
glGetIntegerv(GL_VIEWPORT,viewport);
gluUnProject(mx,my,0,modelMatrix,projMatrix,viewport,&posx,&posy,&posz);

posx*=(zoom * 10); // hasil konversi dikalikan dengan (zoom * 10)
posy*=(zoom * 10);

posy*=-1; // karena arah y axis pada 3D world umumnya berbeda dengan y axis pada 2D (orthogonal), jadi kita kalikan dengan -1

std::cout << posx << ", " << posy << "\n"; // print output konversi

Disini pertama-tama kita ambil dulu koordinat mouse, kemudian ambil setting model view matrix,projection matrix, dan viewport yang sudah di set sebelumnya, setelah itu gunakan gluUnProject untuk melakukan konversi (silahkan lihat manual gluUnProject pada website OGL).

Variabel zoom adalah distance antara posisi Z kamera dengan posisi Z poros kamera, kita kalikan dengan 10 karena nilai konversi sebelumnya adalah nilai floating point yang sangat kecil. Terakhir mengalikan posy dengan -1 untuk menormalkan posisi y axisnya sesuai dengan 3D world.

Banyak sekali implementasi teknik picking yang tersebar di internet. Teknik diatas adalah salah satu yang paling simpel :roll: .

Cross Compiling aplikasi OpenGL melalui Linux

20 Mei 2008 kecebongsoft 3 komentar

Beberapa bulan yang lalu aku sempat melakukan cross compiling aplikasi OpenGL yang kubuat di environment linux kedalam platform windows xp, dan ternyata berhasil. Kenapa harus cross compiling, ini masalah legalitas, aku sering eksperimen bikin aplikasi/game menggunakan DirectX di windows tanpa memperhatikan apakah OS atau aplikasi lainnya yang ada di windowsku adalah bajakan atau tidak. Tapi belakangan ini sering kepikiran juga untuk “melegalkan” semua perangkat yang kumiliki untuk tujuan pengembangan game. Mulai dari Graphics API yang menggunakan OpenGL, modeller yang menggunakan Blender, image editor yang menggunakan GIMP, dan lain sebagainya, dan tentu saja dengan platform linux :-D Read more…

Mendapatkan nilai FPS – Bagian 2

Setelah post sebelumnya membahas tentang bagaimana cara mendapatkan nilai FPS dengan mengambil nilai waktu menggunakan fungsi GetTickCount(), sekarang kita akan mencoba mengambil nilai fps yang lebih presisi, kali ini menggunakan fungsi QueryPerformanceCounter dan QueryPerformanceFrequency, funsi ini akan menghitung “tick” atau clock prosesor sehingga hasilnya lebih akurat dari GetTickCount. Aturan mainnya agak berbeda dari cara menghitung FPS yang sebelumnya, urutan adalah sebagai berikut

1. Ambil nilai frekuensi tick (f)
2. Ambil nilai waktu sekarang (w1)
3. Mulai Render
4. Hentikan Render
5. Ambil nilai waktu sekarang (w2)
6. delta waktu = w2-21
7. waktu render = delta waktu/frekuensi
8. fps = 1 / waktu render

Dari urutan diatas, maka kita buat satu fungsi untuk menghitung fps dengan lebih presisi :

void Looping()
{
	static double rendertime;
	static double fps;
	static  __int64 w1,w2,freq;

	QueryPerformanceFrequency((LARGE_INTEGER *)&freq);
	QueryPerformanceCounter((LARGE_INTEGER *)&w1);

	/* Mulai rutinitas render disini */

	/* Hentikan rutinitas render disini */

	QueryPerformanceCounter((LARGE_INTEGER *)&w2);
	rendertime=(double)(w2-w1)/(double)(freq);
	fps=(double)(1)/(double)rendertime;
}

Pertama-tama kita melakukan casting terhadap variabel w1, w2 dan freq, karena tipenya adalah integer 64 dan parameter untuk fungsi QueryPerformanceFrequency/QueryPerformanceCounter adalah LARGE_INTEGER. Pada baris terakhir, kita cast hasil delta waktu menjadi double karena tipe dari rendertime dan fps adalah double.

Met mencoba ya :D

Categories: C++, DirectX, Gamedev, Tutorial