Tutorial Melayu

OpenGL: Pergerakan dan putaran

Introduction

user

Fairuz

System Engineer (Texas Instruments France), Masters in Electronics , Embedded System Engineering,


LATEST POSTS

Nota: git alias yang biasa digunakan 05th December, 2013

Nota: Android .gitignore 23rd February, 2013

OpenGL

OpenGL: Pergerakan dan putaran

Posted on .

Dalam artikel kali ini kita akan melihat bagaimana untuk melakukan pergerakan atau putaran ke atas objek yang telah diposisikan di dalam ruangan 3D. Untuk memahami bagaimana pergerakan dan putaran ini dilakukan, anda boleh melihat tentang transformation and rotation matrix. Proses ini melibatkan banyak operasi matematik terutamanya perkiraan matrix. Dengan menggunakan fungsi OpenGL, hampir semua perkiraan ini dilakukan oleh OpenGL.

Pergerakan dan putaran boleh dilakukan di dalam ruangan 3D. Jadi kita boleh membuat pergerakan/putaran pada kesemua paksi x, y dan z. Gabungan pergerakan dan putaran dipanggil transformasi.

Putaran (rotation)
Setiap objek boleh berputar di paksi x, y atau z. Putaran diukur dengan unit darjah ataupun radian.

Pergerakan (translation)
Dalam OpenGL, pergerakan ke kiri adalah pergerakan pada paksi x jika kamera memandang ke hadapan dan dari segi jarak kita hanya menggunakan unit yang tidak mempunyai persamaan dalam unit metrik. Secara umumnya, pengatur cara menganggap 1 unit bersamaan dengan 1 meter tetapi ini bergantung sepenuhnya pada setiap pengatur cara.

Ok, pertama sekali kita akan menggunakan tiga pembolehubah untuk menyimpan arah, lokasi dan sudut semasa.

bool naik = false;   // arah
float lokasi_y = 0.0f; // lokasi pada paksi y
float sudut_y = 0.0f;  // sudut pada paksi y

Kemudian dalam main, kita akan menambah satu callback untuk mengemas kini pembolehubah-pembolehubah kita tadi. Untuk memudahkan artikel ini, saya akan menggunakan semula fungsi papar.

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
 
	glutInitDisplayMode (GLUT_SINGLE);
 
	glutInitWindowSize (500, 500); 
	glutInitWindowPosition (100, 100);
	glutCreateWindow ("Tetingkap pertama saya");
 
	glutDisplayFunc(papar); 
	glutIdleFunc(papar);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(tekanKekunci);
        glutKeyboardUpFunc(lepasKekunci);
 
	glutMainLoop();
	return 0;  
}

Seterusnya, untuk mengemas kini pembolehubah tadi dalam fungsi papar. Kod di bawah boleh diletakkan di atas sekali dalam fungsi papar.

        if (naik) // arah ke atas
		lokasi_y -= 0.0005f; // gerak ke atas pada paksi y  
	else  // arah ke bawah  
		lokasi_y += 0.0005f; // gerak ke bawah pada paksi y  
	  
	if (lokasi_y < -3.0f) // had atas  
		naik = false; // tukar arah 
	else if (lokasi_y > 3.0f) // had bawah 
		naik = true; // tukar arah 
	  
	sudut_y += 0.005f; // putaran 
	if (sudut_y > 360.0f) // jika lebih 360 darjah, tolak 360  
		sudut_y -= 360.0f; 

Ok, jadi sekarang untuk melakukan pergerakan dan putaran ini, kita akan menggunakan fungsi OpenGL glTranslatef dan juga glRotatef. Kita akan meletakkan kedua-dua panggilan fungsi ini antara glTranslatef dan glWireSphere (di dalam fungsi papar).

void papar(void){
	if (naik) // arah ke atas
		lokasi_y -= 0.0005f; // gerak ke atas pada paksi y  
	else  // arah ke bawah  
		lokasi_y += 0.0005f; // gerak ke bawah pada paksi y  
	  
	if (lokasi_y < -3.0f) // had atas  
		naik = false; // tukar arah 
	else if (lokasi_y > 3.0f) // had bawah 
		naik = true; // tukar arah 
	  
	sudut_y += 0.005f; // putaran 
	if (sudut_y > 360.0f) // jika lebih 360 darjah, tolak 360  
		sudut_y -= 360.0f; 

	glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Tukar background kepada warna merah
	glClear(GL_COLOR_BUFFER_BIT); // Kosongkan buffer warna
	glLoadIdentity(); // 
	glTranslatef(0.0f, 0.0f, -5.0f);  // alihkan kamera menjauhi paksi z 
 	//binaPrimitif();   // Bina bentuk primitif
	
	glTranslatef(0.0f, lokasi_y, 0.0f);   
	glRotatef(sudut_y, 0.0f, 1.0f, 0.0f);

	glutWireSphere(1.0f, 8.0f, 8.0f);
	glFlush(); // Hantar buffer ke tetingkap
}

Kompil kod ini dan anda akan melihat sfera yang dilukis pada artikel lepas bergerak dan berputar pada paksi y. Jika anda mahu melihat ia hanya berputar dan tidak bergerak, tukar glTranslatef(0.0f, lokasi_y, 0.0f) kepada glTranslatef(0.0f, 0.0f, 0.0f). Selamat mencuba!

main.cpp

#include 
#include 

bool naik = false;   // arah
float lokasi_y = 0.0f; // lokasi pada paksi y
float sudut_y = 0.0f;  // sudut pada paksi y

void binaPrimitif(void){
	glBegin(GL_QUADS);
	glColor3f(0.0f, 0.0f, 1.0f); // bucu berwarna biru
	glVertex3f(-1.0f, -1.0f, 0.0f);
	glColor3f(1.0f, 0.0f, 0.0f); // bucu berwarna merah
	glVertex3f(-1.0f, 1.0f, 0.0f);
	glColor3f(0.0f, 1.0f, 0.0f); // bucu berwarna hijau
	glVertex3f(1.0f, 1.0f, 0.0f);
	glColor3f(1.0f, 1.0f, 0.0f); // bucu berwarna kuning
	glVertex3f(1.0f, -1.0f, 0.0f);
	glEnd();
}
 
void tekanKekunci(unsigned char key, int x, int y) {
	switch (key) {
		case 27:  // Keluar dari program
			exit(0) ;
			break ;
		default:
			break ;
	}
}
 
void lepasKekunci(unsigned char key, int x, int y) {

}
 
void papar(void){
	if (naik) // arah ke atas
		lokasi_y -= 0.0005f; // gerak ke atas pada paksi y  
	else  // arah ke bawah  
		lokasi_y += 0.0005f; // gerak ke bawah pada paksi y  
	  
	if (lokasi_y < -3.0f) // had atas  
		naik = false; // tukar arah 
	else if (lokasi_y > 3.0f) // had bawah 
		naik = true; // tukar arah 
	  
	sudut_y += 0.005f; // putaran 
	if (sudut_y > 360.0f) // jika lebih 360 darjah, tolak 360  
		sudut_y -= 360.0f; 

	glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Tukar background kepada warna merah
	glClear(GL_COLOR_BUFFER_BIT); // Kosongkan buffer warna
	glLoadIdentity(); // 
	glTranslatef(0.0f, 0.0f, -5.0f);  // alihkan kamera menjauhi paksi z 
 	//binaPrimitif();   // Bina bentuk primitif
	
	glTranslatef(0.0f, lokasi_y, 0.0f);   
	glRotatef(sudut_y, 0.0f, 1.0f, 0.0f);

	glutWireSphere(1.0f, 8.0f, 8.0f);
	glFlush(); // Hantar buffer ke tetingkap
}
 
void reshape(int width, int height){
	glViewport(0, 0, (GLsizei)width, (GLsizei)height); // 
	glMatrixMode(GL_PROJECTION); // Tukar kepada projection matrix
	glLoadIdentity(); //   
	gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 100.0); // fov, aspect ratio, near and far plane 
	glMatrixMode(GL_MODELVIEW); // Tukar semula ke modelview matrix  	
}
 
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
 
	glutInitDisplayMode (GLUT_SINGLE);
 
	glutInitWindowSize (500, 500); 
	glutInitWindowPosition (100, 100);
	glutCreateWindow ("Tetingkap pertama saya");
 
	glutDisplayFunc(papar); 
	glutIdleFunc(papar);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(tekanKekunci);
    glutKeyboardUpFunc(lepasKekunci);
 
	glutMainLoop();
	return 0;   
}
profile

Fairuz

http://www.tutorialmelayu.com

System Engineer (Texas Instruments France), Masters in Electronics , Embedded System Engineering,

There are no comments.

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

View Comments (0) ...
Navigation