Arsip

Archive for the ‘C++’ 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: .

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

Mendapatkan nilai FPS

FPS atau frame per second adalah satuan yang dipakai untuk menyatakan banyak frame yang ada tiap detiknya. Dalam game, tinggi/rendahnya nilai FPS sangat penting demi kenyamanan memainkan game, jika ada game yang fps-nya dibawah 10fps berarti dalam 1 detik game tersebut menampilkan 10 urutan gambar, sehingga akan terlihat patah-patah.

Penting bagi programmer game untuk mendapatkan nilai fps dari game yang ia kembangkan, ini untuk mengukur performance sebuah game (terutama dari sisi grafis). Ada banyak cara mendapatkan nilai fps, salah satunya adalah dengan mencatat jumlah frame yang telah dirender di satu variabel, setelah satu detik jumlah tersebut disalin ke variabel lain kemudian variabel pertama direset :

int GetFPS(){
	static int lasttick = 0; // mencatat waktu (milidetik)
	static int lastframerate = 0; // mencatat nilai fps terakhir
	static int framerate = 0; // mencatat jumlah fps sekarang

	if (GetTickCount() - lasttick >= 1000) // jika waktu sudah satu detik
	{
       	 	lastframerate = framerate; // salin jumlah fps ke variabel nilai fps terakhir
       	 	framerate = 0; // reset jumlah fps
        	lasttick = GetTickCount(); // reset waktu
	}

	framerate++; // tambah jumlah fps
	return lastframerate; // return nilai fps terakhir
}

Atribut static dipakai agar variabel-variabel tersebut menyimpan nilai terakhirnya meskipun proses telah keluar dari fungsi (terkecuali program di-destroy/tutup). Jumlah framerate kita increment setiap kali masuk fungsi, panggil fungsi diatas pada fungsi render yang ada di program kita.Sebagai catatan, kalau menggunakan CD3DApp (class tambahan dari DirectX9SDK), di class tersebut juga ada utility untuk menghitung fps. Mungkin masih banyak cara menghitung fps lainnya, cara diatas adalah salah satu yang general dan bisa dipakai diberbagai macam graphics lib (D3D, DDraw, OpenGL, dll).

Categories: C++, DirectX, Tutorial

Graphics engine

5 November 2007 kecebongsoft 3 komentar

Wuih.. udah lama banget ngepost yah, sekarang lagi nyusun class yang bisa bikin cepet klo mo eksperimen sama DirectX 9, ntar dibagiin deh disini, modalnya cuman Visual C++ 2005 Express sama DirectX 9 SDK. Saat ini udah ada 2 class, satu class buat graphic satu lagi buat input, fitur2 directx yang udah di implementasiin di class-classnya antara lain :

class graphics:
- Init D3D Device
- Load single frame x file (bukan terstruktur/animasi)
- Render mesh yang berasal dari x file
- Render mesh primitive
- Inisialisasi material
- Set nilai transparan (alpha channel) di vertex buffer
- Bikin “plane” object
- bikin rectangle + load texturenya pakai vertex buffer (bisa diatur width heightnya)
- texture alpha channel otomatis ikut dirender
- mesh dan “plane” di letakan dalam sebuah struct, jadi programmer ga langsung akses object directxnya, melainkan instance structnya
- nge-release mesh

class input
- inisialisasi device input
- nge-acquire keyboard
- fungsi yang ngereturn boolean apakah sebuah tombol dipencet atau enggak

hmm.. apalagi ya, lupa :p . Tapi belon bisa switch ke fullscreen mode, ntar aja deh bikin yang gituan. yang jelas classnya bisa dimodifikasi karena semua variabel di taro di public. Jadi klo mo ubah2 kayak render state, light, dll masih bisa kok. Cara gunain classnya? klo menurut aku sih mudah bgt :mrgreen: , inisialisasi graphics + load mesh + render, nggak lebih dari 5 baris :mrgreen: .. sekarang lagi nyoba2 implementasi classnya buat dijadiin game, masih kehambat sama urusan tiket pulang ke Indo dan masalah asrama :( . Udah bye bye dulu ya….

Categories: C++, DirectX, Lifecycle

CizCuz Farm

8 Oktober 2007 kecebongsoft 5 komentar

Satu lagi nih game iseng yang dakuw kerjain pas lagi sibuk2nya ngerjain tugas kuliah :mrgreen:

Download Executable 3MB
Download Source 6MB
Software yang dipake :
MS Visual C++ 2005 Express
DirectX 9 SDK
3dsmax 7 (trial)
Gimp for Windows

Story Line
Alkisah 2 ekor monyet ilmuan dari planet Barz sedang menjelajahi galaksi baru untuk menemukan kehidupan tumbuh-tumbuhan & buah-buahan, karena pasokan pisang di planet Barz sudah menipis. Setelah menjelajahi galaksi selama kurang lebih 5 tahun, akhirnya mereka menemukan sebuah planet kecil yang ditanami rerumputan hijau. Planet tersebut hanya dihuni oleh satu makhluk, yaitu seekor sapi Ilmuan-ilmuan tersebut akhirnya turun di planet tersebut dan menyusuri daerah-daerah sekitarnya. Piring terbang yang mereka kendarai diletakan di dekat kandang sapi karena dianggap tempat yang aman. Tapi tidak lama kemudian si sapi yang rakus dan lugu dengan isengnya mengendus-endus piring terbang tersebut, karena ada bau-bau amis jadi langsung ditelan deh satu piring terbang ama si sapi. Oopss.. apa yang terjadi? piring terbang yang ditelan tiba-tiba menyala dan berfungsi!. Wah wah wah, si sapi tiba-tiba menjelma menjadi “sapi terbang”, si monyet panik karena kehilangan satu piring terbang, dan tidak mungkin meninggalkan temannya sendirian disini. Read more…

How to make a window in C++

24 September 2007 kecebongsoft 4 komentar

Tutorial n00b ini dahulu kala dakuw submit di GameDevID (Indonesia Game Developer) untuk berbagi pengetahuan seputar dasar-dasar win32 programming di lingkungan C++, nggak ada salahnya deh di submit juga di sini :-D . Silahkan ikutin sampai selesai, cocok untuk kamuw-kamuw yang baru belajar C++, lupakan dulu wizard! :-D Read more…

Categories: C++, Tutorial

Mengatasi lost focus pada Direct Input

3 September 2007 kecebongsoft 1 comment

Direct Input adalah salah satu bagian dari DirectX yang digunakan untuk memanajemen inputan user baik berupa keyboard, joystick, mouse, dan lain sebagainya. Belakangan ini dakuw lagi mencoba menggunakan direct input untuk memproses inputan keyboard. Inputan user tersebut diawasi dalam sebuah looping. Tapi muncul sebuah masalah…
Read more…

Categories: C++, DirectX, Tutorial