Trang 1 trên tổng số 4 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 38 kết quả

Đề tài: Nền tảng của đồ họa 3D - 3D Math

  1. #1
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Mặc định Nền tảng của đồ họa 3D - 3D Math

    Giới thiệu

    Hôm nay mình sẽ giới thiệu một chủ đề mới mà mình nghĩ nó rất cần thiết cho các bạn yêu thích lập trình đồ họa. Đặc biệt là đồ họa 3D.

    3D Math là cách sử dụng các phép tính toán học để áp dụng vào xử lý đồ họa lẫn cả lập trình Game nữa. Và rõ ràng đây là một kiến thức không thể thiếu cho những ai yêu thích DevGame.

    Mình thấy rất nhiều bạn rất thích GameDev vì lập trình Game vẫn thường thú vị hơn những cái console.

    Và hôm nay mình sẽ giới thiệu về vấn đề này. Hy vọng sẽ giúp ích cho mọi người.

    Để dễ dàng cho bạn theo dõi, mình post trước cái mục lục:

    Index Code:
    1. PHẦN 1: Quy trình biến đổi
    2.    I. Ma trận
    3.    II. Ma trận biến đổi (ModelView)
    4.          1.  Tịnh tiến
    5.          2.  Tỷ lệ
    6.          3.  Quay  
    7.          4.  Tổng hợp biến đổi
    8.          5.  Coding (các module tịnh tiến, tỷ lệ...)
    9.          6.  Chương trình minh họa ModelView
    10.               a. Biểu diễn Vertex
    11.               b. Graphics 3D
    12.               c. Download chương trình
    13.    III. Ma trận chiếu (Projection)
    14.          1.  Phép chiếu song song
    15.          2.  Phép chiếu phối cảnh
    16.               a. Ma trận chiếu phối cảnh
    17.               b. Trường hợp render lỗi
    18.          3.  Coding
    19.               a. Ortho
    20.               b. Frustum
    21.               c. Draw Polygon 3D
    22.               d. Download chương trình


    PHẦN 1: QUY TRÌNH BIẾN ĐỔI TỌA ĐỘ

    Bài toán đặt ra như thế này:

    Bạn có tập hợp các tọa độ 3D. Làm cách nào để bạn vẽ chúng lên cửa sổ mà cửa sổ bạn lại ở tọa độ 2D (x,y).

    Đây là một bài toán mà người ta đã giải quyết nó ở thập niên 95 và mở đầu cho công nghệ 3D.

    Họ đã cho ra 1 quy trình biến đổi như sau:



    - Ban đầu từ tọa độ 3D sẽ được chuyển thành tọa độ 4D (x,y,z,w)
    - Sau đó nó nhân cho ma trận biến đổi (Quay, tịnh tiến…). (Modelview Matrix)
    - Tiếp tục tới ma trận chiếu (Projection Matrix)
    - Sau đó là cắt xén những đa giác có thể không thấy được (Division)
    - Chuyển tọa độ 4D thành tọa độ 3D
    - Chuyển tiếp 3D thành 2D (loại bỏ z)
    - Biến đổi trên 2D (viewport transformation, quy định gốc tọa độ, co giãn 2D…)
    - Vẽ ra của sổ.

    Trong quy trình này thì Viewport Transformation đã được GDI xử lý.
    Và mình tạm thời bỏ qua giai đoạn Division. Và tuturial này sẽ đi hết các phần còn lại.

    I. MA TRẬN

    Nếu như trong đồ họa 2D thì từng bit thể hiện màu sắc cho pixel là linh hồn thì ở đồ họa 3D Ma trận cũng tương tự như vậy.

    Bây giờ bạn xét công thức sau :

    Code:
    x' = ax + by + cz + d
    y’ = ex + fy + gz + h
    z’ = ix + jy + kz + l
    Sẽ được biểu diễn trên ma trận như sau:

    Code:
                                [ a  e  i  0 ]
    [x’ y’ z’ 1] = [x y z 1] x  [ b  f  j  0 ]
                                [ c  g  k  0 ]
                                [ d  h  l  1 ]
    Ở trên là tích 1 của ma trận 4 x 1 (4 hàng 1 cột) và 1 ma trận 4 x 4. (rất dễ nhớ. Bạn cứ lấy thứ tự hàng của ma trận 1 cộng với cột của ma trận 2) thì sẽ có kết quả x’ y’ z’.

    Ví dụ nhé:
    Bạn có tọa độ 1 vertex ( 100, 200, 300, 1 ) . Bạn sẽ nhân cho ma trận M sau

    Code:
    [1   0   0   0 ]
    [0   1   0   0 ]
    [0   0   1   0 ]
    [0   0   0   1 ]
    Biểu diễn bằng ma trận.

    Code:
    P’ = P x M
    
                                     [1   0   0   0 ]
    [x’ y’ z’ 1] = [100 200 300 1] x [0   1   0   0 ]
                                     [0   0   1   0 ]
                                     [0   0   0   1 ]
    Ta có
    Code:
    x' =  100*1 + 200*0 + 300*0 + 1*0 = 100
    y’ =  100*0 + 200*1 + 300*0 + 1*0 = 200
    z’ =  100*0 + 200*0 + 300*1 + 1*0 = 300
    Bạn thấy đó. x' = x và y’ = y và z’ = z.
    Đó là điều hiển nhiên vì ma trận M mà bạn vừa nhân là 1 ma trận đặc biệt và tên của nó là Identity Matrix (Ma trận đơn vị).

    Như vậy khi Vertex được nhân cho ma trận đơn vị thì kết quả vẫn là Vertex đó. Và Ma trận đơn vị vẫn được xem là ma trận mặc định (không có sự biến đổi).

    Bây giờ chúng ta sẽ CODE.

    Ta có thể biểu diễn 1 Vertex bằng 1 mảng float [4] và matrix là float[4][4].

    Một câu hỏi là liệu sử dụng float với double có khác nhau hay không ??
    Trả lời :
    - Với float thì độ chính xác sẽ thấp hơn double
    - Nhưng với float nếu sau này sử dụng các công nghệ lập trình SIMD thì tốc độ sẽ nhanh hơn double gấp đôi. Ví nếu sử dụng thanh ghi xmm128 thì có thể nhân 1 lúc 4 kết quả float (vì float 32bit). Nhưng 1 lúc chỉ nhân được 2 kết quả double (64bit).

    Vì vậy chọn float hay double cũng phải cân nhắc rất kỹ.
    Dĩ nhiên, nếu lập trình trên .NET thì gì thì cũng không cần phải bận tâm.

    C++ Code:
    1. // Chuyen Ma Tran Thanh Ma Tran Don Vi
    2. void Matrix_Identity(float *pMatran)
    3. {
    4.     #define M(m,row,col)    m[(col<<2) + row]
    5.  
    6.     memset( (void*) pMatran, 0, 16 * sizeof(float) );
    7.  
    8.     M(pMatran,0,0) = 1;
    9.     M(pMatran,1,1) = 1;
    10.     M(pMatran,2,2) = 1;
    11.     M(pMatran,3,3) = 1;
    12.  
    13.     #undef M
    14. }
    15.  
    16. // Nhan Ma Tran 4x1 voi Ma Tran 4x4
    17. void Matrix_Mul4(float *A,float *B, float *KQ)
    18. {
    19.     #define mA(row,col) A[(col<<2) + row]  
    20.    
    21.     KQ[0] = B[0]* mA(0,0) + B[1]* mA(1,0) + B[2]* mA(2,0) + B[3]* mA(3,0); 
    22.     KQ[1] = B[0]* mA(0,1) + B[1]* mA(1,1) + B[2]* mA(2,1) + B[3]* mA(3,1);
    23.     KQ[2] = B[0]* mA(0,2) + B[1]* mA(1,2) + B[2]* mA(2,2) + B[3]* mA(3,2);
    24.     KQ[3] = B[0]* mA(0,3) + B[1]* mA(1,3) + B[2]* mA(2,3) + B[3]* mA(3,3);
    25.  
    26.     #undef mA
    27. }

    Hôm nay thì như vậy thôi. Mình sẽ tiếp tục sau…
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 07-11-2008 lúc 11:19 PM.

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Cứ từ từ... mèo à!

    II. MA TRẬN BIẾN ĐỔI (Model View)

    1. Tịnh tiến

    Giả sử cho đoạn thẳng qua 2 điểm A(10, 10, 0) và B (30, 30, 0).
    Bây giờ nếu tịnh tiến đoạn thẳng này với vector (100,200,300) thì ta sẽ có tọa độ mới là A’B’:
    A’B’ = AB + v

    Hay
    Code:
    xA’ = xA + 100
    yA’ = yA + 200
    zA’ = zA + 300
    
    xB’ = xB + 100
    yB’ = yB + 200
    zB’ = zB + 300
    Chúng ta có viết dưới dạng sau để suy ra Ma Trận Tịnh Tiến.

    Code:
    xA’ = 1*xA  + 0*yA + 0*zA + tx
    yA’ = 0*xA  + 1*yA + 0*zA + ty
    zA' = 0*xA  + 0*yA + 1*zA + tz
    
    Tương tự với xB' yB' zB'
    Và Ma Trận tịnh tiến như sau :
    Code:
    [ 1   0   0   0 ]
    [ 0   1   0   0 ]
    [ 0   0   1   0 ]
    [ tx  ty  tz  1 ]
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 15-10-2008 lúc 11:48 AM.

  3. #3
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    2. Tỷ lệ

    Cho vector A(100,100,200). Bây giờ hãy phóng lớn Vector này ra 2 lần.
    Chúng ta sẽ có A’B’ = AB*2
    Code:
    xA’ = xA*2
    xA’ = xA*2
    xA’ = xA*2
    Hay tổng quát như sau:
    Code:
    xA’ = k1*xA + 0*yA  + 0*zA  + 0
    yA’ = 0*xA  + k2*yA + 0*zA  + 0
    zA’ = 0*xA  + 0*yA  + k3*zA + 0
    Và Ma Trận Tỷ Lệ như sau :
    Code:
    [ k1  0   0   0 ]
    [ 0   k2  0   0 ]
    [ 0   0   k3  0 ]
    [ 0   0   0   1 ]
    Lưu ý :
    - Với k < 0 là bạn đang đối xứng Vertex qua các trục tọa độ.

  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    3. Quay quanh gốc tọa độ

    Trước khi tìm Ma Trận Quay, chúng ta sẽ nghiên cứu lại 1 vấn đề mà chắc ít có ai để ý tới trong đại số đó là « Đường Tròn Lượng Giác » .
    - Đường tròn lượng giác là đường tròn có bán kính = 1.
    - Mọi điểm trên đường tròn đó sẽ có tọa độ là A (cos(α),sin(α) ). Với α là góc tạo bởi tia OA và Ox.
    Bạn xem hình phía dưới nhé :

    Vậy, điểm A trên hình vẽ bên trên cũng có nghĩa là điểm B(1,0) quay một góc α.

    Tuy nhiên với trường hợp B(x,y). Lúc này đường tròn trên không còn là đường tròn lượng giác có bán kính 1 nữa mà sẽ có bán kính là k
    Vấn đề bây giờ là tính A(x’,y’) theo tọa độ B(x,y ). Biết A là B quay 1 góc α quanh O.



    Code:
    Gọi k là bán kính của đường tròn (k*k = xB*xB + yB*yB)
    Ta có:
    		x' = k*Cos(α + β) 
    		y’ = k*Sin(α + β)
    		
    		x’ = k* ( Cos(α)*Cos(β) – Sin(α)*Sin(β) )
    		y’ = k* ( Sin(α)*Cos(β) + Cos(α)*Sin(β) )
    
    		
    	Mà theo đường tròn lượng giác:
    	- xB = k*Cos(β) => Cos(β) = xB/k
    	- yB = k*Sin(β) => Sin(β) = yB/k
    		
    	Nên:
    		x’ = k* ( Cos(α)*xB/k – Sin(α)*yB/k )
    		y’ = k* ( Sin(α)*xB/k + Cos(α)*yB/k )
    	Cuối cùng (nhân k vào)
    		x’ = Cos(α)*xB – Sin(α)*yB
    		y’ = Sin(α)*xB + Cos(α)*yB
    Vậy với B(x,y) thì công thức tổng quát hơn để tính tọa độ A:
    A (x*Cos(α) - y*Sin(α), x*Sin(α) + x*Cos(α) )
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 18-10-2008 lúc 01:06 PM.

  5. #5
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Công thức trên là một công thức mà mình tự chứng mình ra và nó chỉ áp dụng cho không gian 2D.

    Bây giờ ta xét không gian 3D
    Quay quanh trục Z
    Khi quay quanh trục Z thì giá trị của X và Y sẽ thay đổi (Trường hợp của đường tròn lượng giác bên trên).
    Code:
    xA’ =  xA*Cos(α) – yA*Sin(α)
    yA’ =  xA*Sin(α) + yA*Cos(α)
    zA’ =  zA
    Hay ma trận sau

    Code:
     Cos(α)    Sin(α)     0       0
    -Sin(α)    Cos(α)     0       0
      0         0         1       0
      0         0         0       1
    Quay quanh trục X

    Khi quay quanh trục X thì giá trị của Y và Z sẽ thay đổi (tức là lấy đường tròn lượng giác ở trên. Thay trục 0x thành 0z).

    Code:
    xA’ =  xA
    yA’ =  yA*Cos(α) – zA*Sin(α)
    zA’ =  yA*Sin(α) + zA*Cos(α)
    Hay ma trận sau
    Code:
    1    0         0       0
    0   Cos(α)    Sin(α)   0
    0 - Sin(α)    Cos(α)   0
    0    0         0       1
    Quay quanh trục Y
    Khi quay quanh trục Y thì giá trị của X và Z sẽ thay đổi (tức là lấy đường tròn lượng giác ở trên. Thay trục 0y thành 0x và 0x thành 0z).

    Code:
    xA’ =  xA*Cos(α) + zA*Sin(α)  (thay x = công thức tính y)
    yA’ =  yA
    zA’ =  zA*Cos(α) – xA*Sin(α)  (thay z = công thức tính x)
    Hay ma trận sau
    Code:
    Cos(α)   0   -Sin      0
    0        0     0       0
    Sin(α)   0    Cos(α)   0
    0        0     0       1

  6. #6
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Mặc định Nền tảng của đồ họa 3D - 3D Math

    Quay quanh trục Vector(a,b,c)

    Đây là phép quay tổng hợp của 3 phép quay quanh trục Ox, Oy, Oz trên.
    Hiện tại mình chưa chứng minh được công thức này. Tui nhiên chúng ta có thể áp dụng Ma Trận Sau :
    Code:
    [txx + c    txy – sz     txz + sy   0]
    [txy + sz   tyy + c      tyz – sx   0]
    [txz + sy   tyz + sx     tzz + c    0]
    [    0          0            0      1]
    
    Với : 
    c = cos(a)
    s = sin(a)
    t = 1 – cos(a)
    x,y,z phải là Vector đơn vị !
    Toán học đã chứng minh như vậy rồi thì… phải sử dụng thôi.

    4. Tổng hợp biến đổi
    - Mình đã giới thiệu xong ma trận Tịnh tiến, Tỷ Lệ, và Quay…

    Tuy nhiên vấn đề thế này :
    Code:
    Bây giờ nếu mình không quay đối tượng quanh gốc tọa độ nữa 
    mà sẽ quay quanh 1 điểm x,y,z bất kỳ. 
    Để làm được điều này :
    
    - Ta phải tịnh tiến đối tượng theo vector (-x,-y,-z) để nó về gốc tọa độ.
    - Và quay quanh gốc tọa độ.
    - Tịnh tiến lại vector(x,y,z) để trở lại vị trí ban đầu.
    
    Như vậy đầu tiên ta sẽ tìm Ma Trận Tịnh Tiến (-x,-y,-z) và Ma Trận Quay, 
    Nhân chúng với nhau tạo thành 1 Ma Trận. 
    Sau đó Nhân Ma Trận này tiếp với Ma Trận Tịnh Tiến (x,y,z).
    Kết quả sẽ là tổng hợp của phép biến đổi trên !
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 14-10-2008 lúc 06:44 PM.

  7. #7
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    5. Coding…

    Nhân 2 Ma Trận 4x4 A và B và kết quả là KQ
    C++ Code:
    1. // Nhan Ma Tran 4x4 voi Ma Tran 4x4
    2. void Matrix_Mul16(float *A,float *B, float *KQ )
    3. {
    4.     #define mKQ(row,col)    KQ[(col<<2) + row]
    5.     #define mA(row,col) A[(col<<2) + row]
    6.     #define mB(row,col) B[(col<<2) + row]
    7.  
    8.     int i;
    9.     for (i = 0; i<4; i++)
    10.     {
    11.         mKQ(i, 0) = mA(i,0)*mB(0,0) + mA(i,1)*mB(1,0) + mA(i,2)*mB(2,0) + mA(i,3)*mB(3,0);
    12.         mKQ(i, 1) = mA(i,0)*mB(0,1) + mA(i,1)*mB(1,1) + mA(i,2)*mB(2,1) + mA(i,3)*mB(3,1);
    13.         mKQ(i, 2) = mA(i,0)*mB(0,2) + mA(i,1)*mB(1,2) + mA(i,2)*mB(2,2) + mA(i,3)*mB(3,2);
    14.         mKQ(i, 3) = mA(i,0)*mB(0,3) + mA(i,1)*mB(1,3) + mA(i,2)*mB(2,3) + mA(i,3)*mB(3,3);
    15.     }  
    16.  
    17.     #undef mKQ
    18.     #undef mA
    19.     #undef mB
    20. }

    Tịnh tiến Ma Trận
    Ma trận hiện hành là A. Kết quả của function sẽ nhân A với ma trận tịnh tiến (x,y,z).
    C++ Code:
    1. void Matrix_Translate(float *A, float x, float y, float z)
    2. {  
    3.     float TranslateMatrix[16];
    4.     float Result[16];
    5.  
    6.     Matrix_Identity(TranslateMatrix);
    7.    
    8.     TranslateMatrix[3] = x;
    9.     TranslateMatrix[7] = y;
    10.     TranslateMatrix[11] = z;
    11.  
    12.     Matrix_Mul16(A, TranslateMatrix ,Result);  
    13.     memcpy( (void*) A, (void*) Result, sizeof( Result ) );
    14. }

    Tỷ lệ Ma Trận
    Ma trận hiện hành là A. Kết quả của function sẽ nhân A với ma trận tỷ lệ(x,y,z).
    C++ Code:
    1. void Matrix_Scale(float *A, float x, float y, float z)
    2. {  
    3.     float ScaleMatrix[16];
    4.     float Result[16];
    5.  
    6.     Matrix_Identity(ScaleMatrix);
    7.    
    8.     ScaleMatrix[0] = x;
    9.     ScaleMatrix[5] = y;
    10.     ScaleMatrix[10] = z;
    11.  
    12.     Matrix_Mul16(A, ScaleMatrix ,Result);  
    13.     memcpy( (void*) A, (void*) Result, sizeof( Result ) );
    14. }

    Quay Ma Trận

    Kết quả sẽ nhân Ma Trận hiện hành A với Ma Trận quay.

    C++ Code:
    1. #define DEGTORAD 0.0174533
    2.  
    3. void Matrix_Rotation(float *A, float fGoc, float x, float y, float z)
    4. {  
    5.     float RotationMatrix[16];
    6.     float Result[16];
    7.  
    8.     Matrix_Identity(RotationMatrix);
    9.  
    10.  
    11.     // Khong xoay
    12.     if (x == y && y == x && y == z &&  z == 0)
    13.         return;
    14.  
    15.     #define M(m,row,col) m[ (col<<2) + row]
    16.  
    17.     float s = (float)sin(fGoc * DEGTORAD);
    18.     float c = (float)cos(fGoc * DEGTORAD);
    19.    
    20.     // Xoay quanh truc Z
    21.     //  Cos  Sin  0   0
    22.     // -Sin  Cos  0   0
    23.     //   0    0   1   0
    24.     //   0    0   0   1
    25.     if (x == 0 && y == 0)
    26.     {
    27.         M(RotationMatrix,0,0) =  c;
    28.         M(RotationMatrix,0,1) =  s;
    29.         M(RotationMatrix,1,0) = -s;
    30.         M(RotationMatrix,1,1) =  c;
    31.     }
    32.    
    33.     // Xoay quanh truc Y
    34.     //  Cos   0 -Sin   0
    35.     //   0    1   0    0
    36.     //  Sin   0  Cos   0
    37.     //   0    0   0    1
    38.     else if (x == 0 && z == 0)
    39.     {
    40.         M(RotationMatrix,0,0) =  c;
    41.         M(RotationMatrix,0,2) = -s;
    42.         M(RotationMatrix,2,0) =  s;
    43.         M(RotationMatrix,2,2) =  c;
    44.     }
    45.  
    46.     // Xoay quanh truc X
    47.     //   1   0     0   0
    48.     //   0  Cos   Sin  0
    49.     //   0 -Sin   Cos  0
    50.     //   0   0     0   1
    51.     else if (y == 0 && z == 0)
    52.     {
    53.         M(RotationMatrix,1,1) =  c;
    54.         M(RotationMatrix,1,2) =  s;
    55.         M(RotationMatrix,2,1) = -s;
    56.         M(RotationMatrix,2,2) =  c;
    57.     }
    58.    
    59.     // Xoay tren ca 3 truc (cong thuc da duoc chung minh nhu sau)
    60.     else
    61.     {      
    62.         // Chuyen vector(x,y,z) thanh vector don vi
    63.         float d = (float)sqrt(x*x + y*y + z*z);
    64.        
    65.         // Qua nho -> khong xoay ma tran
    66.         if (d <= 1.0e-4)
    67.             return;
    68.  
    69.         x = x/d;
    70.         y = y/d;
    71.         z = z/d;
    72.  
    73.         float xx = x * x;
    74.         float yy = y * y;
    75.         float zz = z * z;
    76.         float xy = x * y;
    77.         float yz = y * z;
    78.         float zx = z * x;
    79.         float xs = x * s;
    80.         float ys = y * s;
    81.         float zs = z * s;
    82.         float one_c = (float)1.0 - c;
    83.  
    84.         M(RotationMatrix,0,0) = (one_c * xx) + c;
    85.         M(RotationMatrix,0,1) = (one_c * xy) - zs;
    86.         M(RotationMatrix,0,2) = (one_c * zx) + ys;
    87.  
    88.         M(RotationMatrix,1,0) = (one_c * xy) + zs;
    89.         M(RotationMatrix,1,1) = (one_c * yy) + c;
    90.         M(RotationMatrix,1,2) = (one_c * yz) - xs;
    91.  
    92.         M(RotationMatrix,2,0) = (one_c * zx) - ys;
    93.         M(RotationMatrix,2,1) = (one_c * yz) + xs;
    94.         M(RotationMatrix,2,2) = (one_c * zz) + c;
    95.     }
    96.    
    97.     Matrix_Mul16(A, RotationMatrix ,Result);   
    98.     memcpy( (void*) A, (void*) Result, sizeof( RotationMatrix ) );
    99.  
    100.     #undef M
    101. }

    Còn tiếp...
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 21-10-2008 lúc 01:07 PM.

  8. #8
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    6. CHƯƠNG TRÌNH MINH HỌA

    a. Biểu diễn Vertex

    C++ Code:
    1. typedef struct TagVertex3D
    2. {
    3.     float x;
    4.     float y;
    5.     float z;   
    6. }ZVertex3D;

    Đó là 1 điểm 3D. Vậy 1 khối hộp 3D chúng ta sẽ có mảng sau :
    C++ Code:
    1. static ZVertex3D faceFront[]={
    2.     {-100,-100,100},
    3.     { 100,-100,100},
    4.     { 100, 100,100},
    5.     {-100, 100,100},
    6. };
    7. static ZVertex3D faceBack[]={
    8.     {-100,-100,-100},
    9.     { 100,-100,-100},
    10.     { 100, 100,-100},
    11.     {-100, 100,-100},
    12. };
    13. static ZVertex3D faceTop[]={
    14.     { 100,100, 100},
    15.     {-100,100, 100},
    16.     {-100,100,-100},
    17.     { 100,100,-100},
    18. }; 
    19. static ZVertex3D faceBottom[]={
    20.     { 100,-100, 100},
    21.     {-100,-100, 100},
    22.     {-100,-100,-100},
    23.     { 100,-100,-100},
    24. };

    Vậy để vẽ khối hộp trên ta có thể code « tạm thời » như thế này :
    C++ Code:
    1. m_pGraphics3D->Draw_Polygon( faceFront, 4 );
    2. m_pGraphics3D->Draw_Polygon( faceTop, 4 );
    3. m_pGraphics3D->Draw_Polygon( faceBack, 4 );
    4. m_pGraphics3D->Draw_Polygon( faceBottom, 4 );

    Dĩ nhiên đây chỉ là cách code tạm thời để vẽ lên 1 khối hộp 3D. Sau này khi giới thiệu đến phần Object 3D mình sẽ hướng dẫn “cấu trúc dữ liệu Mesh” để load các Object từ 3D Max . Lúc đó thì mọi thứ ta sẽ làm chuyên nghiệp hơn.
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 21-10-2008 lúc 01:16 PM.

  9. #9
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    b. Graphics 3D

    Nhưng ở đây m_pGraphics3D là cái gì?

    Nó sẽ là đối tượng của lớp đối tượng ZGraphics3D

    C++ Code:
    1. class ZGraphics3D
    2. {
    3. protected:
    4.     float m_ModelViewMatrix[16];
    5.     float m_ProjectionMatrix[16];
    6.     float m_ViewportMatrix[4];
    7.  
    8.     ZGraphics   *m_pRender;
    9.     ZGraphics   *m_pBuffer;
    10.  
    11. public:
    12.     ZGraphics3D( ZGraphics *pGraphics, int w, int h );
    13.     ~ZGraphics3D(void);
    14.    
    15.     …
    16.     …
    17.  
    18.     // Cac module Ve
    19.     void Clear_Screen();
    20.     void Draw_Polygon( ZVertex3D *aVertex, int nCount );
    21.     void Swap_Buffer();
    22.     void Draw_Text( LPWSTR lpString, int x, int y, ZColor c );
    23.  
    24.     // Cac module bien doi
    25.     void Load_Identity(int nIndex);
    26.     void Rotate(float fDeg, float x, float y, float z);
    27.     void Translate(float x, float y, float z);
    28.     void Scale(float x, float y, float z);
    29.    
    30.     // Cac module lien quan ma tran
    31.     void Set_Viewport( float x, float y, float w, float h );
    32.     void Get_Matrix( float *m, int nIndex);
    33.     void Set_Matrix( float *m, int nIndex);
    34. };
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 21-10-2008 lúc 01:16 PM.

  10. #10
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Trong đó :
    Code:
    - ModelViewMatrix	Ma trận biến đổi.
    - ProjectionMatrix	Ma trận chiếu (mình sẽ nói đến sau).
    - ViewportMatrix	Mảng lưu tọa độ khung nhìn.
    Và đối tượng đồ họa 2D ZGraphics.
    Code:
    - ZGraphics 	Đây là đối tượng vẽ 2D. 
    		+ Nếu MFC thì là CDC
    		+ Nếu trên .NET hay Java thì là Graphics …
    Tác dụng chính cũng chỉ là vẽ các đường thẳng.
    + m_pRender : Là vùng màn hình thật.
    + m_pBuffer : Là vùng đệm.

    Để tránh hiện tượng nhấp nháy thì mọi thứ ta sẽ vẽ trên 1 tờ giấy trước (m_pBuffer) Sau khi hoàn chỉnh ta sẽ tráo tờ giấy này thành tờ giấy thật trên màn hình bằng hàm Swap_Buffer();
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 18-10-2008 lúc 01:25 PM.

Các đề tài tương tự

  1. Bài tập C++ Phép tính +-*/ không sử dụng thư viện math.h
    Gửi bởi tazihaza trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 29-03-2012, 08:51 PM
  2. Lập trình C Định nghĩa lại các toán tử +, -, x, /...và thư viện math.h
    Gửi bởi nakamurra trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 24-03-2012, 12:16 PM
  3. Hỏi về hàm Math.pow
    Gửi bởi Batchuoc_09 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 6
    Bài viết cuối: 03-08-2009, 09:04 PM
  4. Cho hỏi về hàm Math.Sin() và Math.Asin()
    Gửi bởi BuithiHa trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 12-07-2007, 10:28 PM
  5. Cho mình hỏi về một chút về math.h
    Gửi bởi nokia5510vn trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 13-05-2007, 01:45 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn