OpenGL C++ Bài 12 : Demo Moving On Ground
Hi Chào mừng các bạn đến với chủ đề Học Lập Trình OpenGL Tại blog: Phattrienphanmem123az.com
Hôm nay, chúng ta sẽ cùng tổng kết lại những kiến thức đã học được trong 11 bài lập trình opengl c++ đã qua bằng một demo nhỏ.
Chúng ta sẽ cùng demo một khu vực bao gồm:
+ Một mặt đất ground với màu sắc tùy ý và kích thước rộng tùy ý.
+ Trên ground, hãy vẽ các đối tượng Cube
+ Sử dụng texture cho cube
+ Vẽ một teapot dạng wire frame đặt trên cube.
+ Có sử dung lighting
+ Sử dụng mouse và keydown để di chuyển cameral trong vùng ground.
Như hình minh họa sau
II. Các Step cơ bản
1. Vẽ Ground:
Sử dụng hàm tạo box có sẵn trong lớp BasicCad.
BasicCad::MakeBox(SIZE_GROUND, SIZE_GROUND, 0.5); // Xem lại bài số 7
SIZE_GROUND được định nghĩa theo giá trị mình mong muốn
Ở đây tôi đặt giá trị là : 500.0
2. Vẽ các khối cube tuần tự theo hai chiều dọc và ngang. Vẽ teapot đi kèm với cube
Ví dụ theo trục x là 8 phần tử và trục y cũng là 8 phần tử thì ta có 64 phần tử.
for(int i = -4; i < 4; i++) { for(int j=-4; j < 4; j++) { glPushMatrix(); glTranslatef(i*50.0, 5.5, j * 50.0); SetMaterialColor(K_MAT_WHITE); glBindTexture(GL_TEXTURE_2D, texture); glCallList(g_box); glDisable(GL_TEXTURE_2D); glPushMatrix(); glTranslatef(0.0, 8, 0.0); SetMaterialColor(K_MAT_BLUE); glCallList(g_tearpot); glPopMatrix(); glEnable(GL_TEXTURE_2D); glPopMatrix(); } }
3. Xử lý Cameral
Trong hàm glutlookat chúng ta thực hiện như sau:
lx, lz được khai báo mới để tùy chỉnh điểm nhìn của cameral vào vật
gluLookAt(x, 20.0f, z,
x+lx, 20.0f, z+lz,
0.0f, 1.0f, 0.0f);
tại vị trí A camera nhìn vào vật cách A một khoảng là lx, lz
Khi camera move sang vị trí B thì nó sẽ nhìn sang điểm mới cách B vẫn là khoảng các lx, lz.
Xử lý khi nhấn key Up và key Down
Hãy cùng xem hình minh họa sau
Do đó áp dụng vào demo tôi sẽ có như sau:
//Phattrienphanmem123az.com case GLUT_KEY_UP : deltaMove = 1.5f; break; case GLUT_KEY_DOWN : deltaMove = -1.5f; void computePos(float deltaMove) { x = deltaMove * lx; z = deltaMove * lz; }
Khi ấn right hoặc left
Cameral không di chuyển mà tự quay quanh mình nó một góc xác định
case GLUT_KEY_LEFT : deltaAngle = -0.03f; break; case GLUT_KEY_RIGHT : deltaAngle = 0.03f;
Như vậy giá trị lx, lz sẽ được tính toán theo góc thay đổi
mỗi lần quay, góc mới sẽ được cộng vào góc hiện tại để giữ đúng vị trị của cameral hiện tại
void computeDir(float deltaAngle) { angle += deltaAngle; lx = sin(angle); lz = -cos(angle); }
Ok. Đó là những step chính trong demo MovingOnGround
Linkdown load project: Click here