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

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.