Luận văn Tìm hiểu về Lập trình đồ họa trên Symbian

MỤC LỤC

Mở đầu . 4

CHƢƠNG 1: Tổng quan về hệ điều hành Symbian và điện thoại thông

minh Series 60 . .5

1.1 Giới thiệu hệ điều hành Symbian . 5

1.2 Các mô hình thiết bị sử dụng hệ điều hành Symbian . 6

1.3 Các tiến trình và tiểu tiến trình trong Symbian . 7

1.3.1 Tiến trình . 7

1.3.2 Tiểu trình. . 7

1.3.3 Tiến trình và tiểu trình nhân . 7

1.3.4 Quản lí và điều phối tiến trình . 8

CHƢƠNG 2: Kĩ thuật lập trình C++ trên Symbian . 9

2.1 Các kiểu dữ liệu cơ bản . 9

2.2 Quản lí lỗi . 10

2.2.1 Cơ chế bắt lỗi cơ bản mà Symbian hỗ trợ gồm: . 10

2.2.2 Hàm Cleanup stack . 12

2.2.3 Hàm dựng 2 pha . 14

CHƢƠNG 3: OPENGL ES . 18

3.1 Giới thiệu về OpenGL ES . 18

3.2 Nhập dữ liệu từ phím (Keyboard Input) . 18

3.3 Dựng (Rendering) . 19

3.4 Phép chiếu trực giao (Orthographic Projection) . 20

3.5 Màu sắc và đánh bóng (Color and Shading) . 22

3.6 Phép biến đổi (Transformations) . 24

3.7 Chiều sâu (Depth) . 27

3.8 Hình phối cảnh (Perspective ) . 29

3.9 Hình khối (Solid Shapes) . 33

3.10 Bộ lọc mặt sau (Backface Culling) . 35

3

3.11 Ánh sáng (Lighting) . 36

3.12 Định hướng ánh sáng (Directional Lighting). 39

3.13 Dán chất liệu (Texture Mapping) . 41

3.14 Hàm chất liệu (Texture Functions) . 50

3.15 Pha trộn (Blending) . 53

3.16 Minh bạch đối tượng (Transparency) . 58

3.17 Hiệu ứng sương mù (Fog) . 60

CHƢƠNG 4: Áp dụng OpenGL ES để tạo ứng dụng đồ họa 3D . 64

4.1 Phát biểu bài toán ứng dụng . 64

4.2 . 64

4.2.1 . 64

4.2.2 . 65

4.2.3 Xây dựng đối tượng, bắt nút và di chuyển đối tượng. . 66

4.3 Một số hình ảnh trong Games . 70

4.4 Cách tạo file sis để cài đặt lên thiết bị di động . 72

Kết luận . 73

Tài liệu tham khảo . 74

pdf75 trang | Chuyên mục: Lập Trình Đồ Họa | Chia sẻ: dkS00TYs | Lượt xem: 1434 | Lượt tải: 1download
Tóm tắt nội dung Luận văn Tìm hiểu về Lập trình đồ họa trên Symbian, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
g 
sương mù thông qua cờ GL_FOG của hàm glEnable. 
Bây giờ ta có thể kích hoạt và khởi chạy Fog trong hàm init, chúng ta có thể 
hiển thị chúng trên Display. Thay vì sử dụng chức năng ugluLookAtf chúng 
ta có thể dich chuyển ma trận modelview. 
Phần cuối cùng là thay đổi chức năng menu, khi chế độ Fog được lựa chọn, 
chúng ta muốn thay đổi chế độ sương mù, điều này được thực hiện bằng các 
sử dụng mảng fogTypes đã được xác định ở phần đầu của hướng dẫn. 
 64 
CHƢƠNG 4: Áp dụng OpenGL ES để tạo ứng dụng đồ họa 
3D 
4.1 Phát biểu bài toán ứng dụng 
Qua tìm hiểu về lý thuyết một số kỹ thuật đồ họa 3D của OpenGL ES, Vận 
dụng các kiến thức đã thu thập được để sử dụng các kĩ thuật đồ họa 3D trong 
bộ thư viện mã nguồn mở, làm nền tảng bước đầu cho việc thiết kế một trò 
chơi 3D trên di động. 
Chương trình tạo ra một trò chơi 3D đơn giản nơi bạn có thể điều khiển một 
chiếc ô tô xung quanh một khoảng đất rộng. 
4.2 
4.2.1 
- vấn đề: 
 Như đã trình bày ở phần OpenGL ES các đối tượng đồ họa được 
tạo ra từ các mảng chứa các đỉnh của đối tượng. Sẽ là rất khó khăn khi tự tạo 
ra các mảng này vì một đối tượng có rất nhiều các đỉnh khác nhau. 
- Hướng giải quyết: 
Ta sẽ sử dụng 1 phần mềm trung gian để tạo ra các đối tượng này 
như 3DS MAX, MAYA v.v… Và sử dụng bộ công cụ COLLADA để chuyển 
các đối tượng này thành các file đối tượng .h. Các file đối tượng .h này bao 
gồm các giá trị như: số đỉnh, số bề mặt và các tọa độ đỉnh cho đối tượng. 
https://collada.org 
 65 
4.2.2 đồ và giới hạn bản đồ 
- vấn đề: 
Chắc hẳn việc tạo ra một bản đồ đối với bạn là không mấy khó 
khăn, nhưng vấn đề ở đây là làm thế nào để giới hạn bản đồ đó lại. Ví dụ như 
khi bạn điều khiển xe trên đường, tốc độ sẽ nhanh hơn khi bạn đi trên bãi cỏ, 
hay xe sẽ bị dừng lại khi bạn đâm vào các đối tượng khác như là nhà cửa, 
hàng rào v.v… 
- Hướng giải quyết: 
Ta sẽ tạo ra một ma trận tương ứng với bản đồ, và dựa vào ma trận 
này ta sẽ xác định các đối tượng (như nhà cửa, nền đường, bãi cỏ v.v…) sẽ 
được đặt ở đâu trên bản đồ và việc giới hạn bản đồ hay xử lí va chạm cũng 
được thực hiện dựa trên ma trận này. 
Đoạn mã minh họa: trong 3Dobject.h 
Dựa vào ma trận trên ta sẽ sử dụng các giá tị như sau: 
- các giá trị x: đại diện cho bãi cỏ. 
- các giá trị 0: đại diện cho đường. 
- các giá trị a: đại diện cho nhà. 
const TUint8 KMap[16][32]={ 
 "xxxxxxxxxxxxxxxx", 
 "xxxxxxxxxxxxxxxx", 
 "xx00000000000xxx", 
 "xx0xxxx0xxxx0xxx", 
 "xx0x0000000x0xxx", 
 "xx0x0a0a0a0x0xxx", 
 "xx0x0000000x0xxx", 
 "xx000a0a0a000xxx", 
 "xx0x0000000x0xxx", 
 "xx0x0a0a0a0x0xxx", 
 "xx0x0000000x0xxx", 
 "xx0xxxx0xxxx0xxx", 
 "xx00000000000xxx", 
 "xxxxxxxxxxxxxxxx", 
 "xxxxxxxxxxxxxxxx", 
 "xxxxxxxxxxxxxxxx", 
 }; 
 66 
4.2.3 Xây dựng đối tượng, bắt nút và di chuyển đối tượng. 
- Vấn đề: 
Ở đây chúng ta sẽ bàn về cách xây dựng các đối tượng, bắt các 
phím và làm cho chiếc xe của ta di chuyển sao cho tự nhiên nhất. Như việc 
bánh xe chuyển động (khi di chuyển), quay bánh xe và xe hơi bị nghiêng sang 
trái hoặc phải khi vào cua, tốc độ của xe sẽ được tăng dần v.v.. 
- Hương giải quyết: 
Khởi tạo các đối tượng 3D từ dữ liệu đã cho 
Thiết lập chất liệu cho mọi đối tượng 
// nhà 
 i3dHouse = CreateObject( KHouseVertexData, KHouseFaceData, 
KNumHouseVertices, KNumHouseFaces, TPoint( 0,0 ), 1 ); 
// đường 
 i3dRoad = CreateObject( KRoadVertexData, KRoadFaceData, 
KNumRoadVertices, KNumRoadFaces, TPoint( 0,0 ), 1 ); 
// bãi cỏ 
i3dGrass = CreateObject( KGrassVertexData, KGrassFaceData, 
KNumGrassVertices, KNumGrassFaces, TPoint( 0,0 ), 1 ); 
// bánh xe 
 i3dFrontWheel = CreateWheel( KFrontWheelRadius, 50, 6 ); 
i3dRearWheel = CreateWheel( KRearWheelRadius, 150, 6 ); 
// xe 
 i3dCar = CreateObject( KCarVertexData, KCarFaceData, 
KNumCarVertices, KNumCarFaces, TPoint( 0,128 ), 10 ); 
i3dText = CPolygonObject::NewL( i3DBase, 1, 1 ); 
i3dHouse->SetTexture( iGlTexture2 ); 
i3dRoad->SetTexture( iGlTexture ); 
i3dGrass->SetTexture( iGlTexture2 ); 
i3dFrontWheel->SetTexture( iGlTexture ); 
i3dRearWheel->SetTexture( iGlTexture ); 
i3dCar->SetTexture( iGlTexture ); 
i3dText->SetTexture( iGlTextureFont ); 
 67 
Xây dựng và đặt đối tượng dựa theo ma trận Kmap ở trên 
for( y=0; y<KMapHeight; y++ ) 
 { 
 TUint8* p = (TUint8*)KMap[ y ]; 
 for( x=0; x<KMapWidth; x++ ) 
 { 
 switch( *p++ ) 
 { 
 case '0': 
 { 
 n = iRender->AddObject( i3dRoad ); 
 iRender->SetObjectPosition( n, 
 TVertex( x * KTileSize, 200, y * 
KTileSize ) ); 
 break; 
 case 'a': 
 { 
 n = iRender->AddObject( i3dHouse ); 
 iRender->SetObjectPosition( n, 
 TVertex( x * KTileSize, 200, y * 
KTileSize ) ); 
 break; 
 } 
 case 'x': 
 { 
 n = iRender->AddObject( i3dGrass ); 
 iRender->SetObjectPosition( n, 
 TVertex( x * KTileSize, 200, y * 
KTileSize ) ); 
 break; 
 } 
 } 
 } 
} 
 68 
Di chuyển đối tượng thông qua các phím bằng hàm CGame::Move 
void CGame::Move( TUint8* aKey ) 
 { 
 // kiểm rea phím và cập nhập sự thay đổi 
 TInt carLastSpeed = iCarSpeed; 
 // 
 // chuyển động của xe theo hướng chỉ định bởi tốc độ của 
xe 
 // 
 iCarPositionAdd = TVertex( iCarSpeed,0,0 ); 
 iCarPositionAdd = i3DBase->RotateY( iCarPositionAdd, 
iCarAngle & (KSinTableSize-1) ); 
 iCarPosition += iCarPositionAdd; 
 // có rất nhiều các va chạm xuất hiện từ tilemap 
 TBool collision = EFalse; 
 TInt tileX = ( iCarPosition.iX + KTileSize/2 ) / 
KTileSize; 
TInt tileY = ( iCarPosition.iZ + KTileSize/2 ) / 
KTileSize; 
// đầu tiên kiểm tra vị trí trên bản đồ: 
 if( ( tileX = KMapWidth-1 ) || 
 ( tileY = KMapHeight-1 ) ) 
 { 
 collision = ETrue; 
 } 
 // kiểm tra sự va chạm với các tòa nhà 
 TInt tile = KMap[ tileY ][ tileX ]; 
 if( tile == 'a' ) // nếu tile là một tòa nhà 
 { 
 collision = ETrue; 
 } 
 if( collision ) 
 { 
 // di chuyển ngược lại 
 iCarPosition -= iCarPositionAdd; 
 // và dừng 
 iCarSpeed = 0; 
 } 
// 
 // di chuyển vị trí của xe với tốc độ của nó 
 // vị trí của xe được sử dụng để làm quay các bánh xe 
 // 
 iCarPos += iCarSpeed; 
// 
 // Diều chỉnh tốc độ của xe thông qua các phím 
 // Nhấn phím '1' để tăng tốc 
 // Nhấn phím '4' để giảm tốc độ (lùi lại) 
// 
 69 
 if( aKey[ EStdKeyUpArrow ] || aKey[ '1' ] || aKey[ 
EStdKeyDevice8 ] ) 
 { 
 iThrottle = 1; 
 } 
 else if( aKey[ EStdKeyDownArrow ] || aKey[ '4' ] || aKey[ 
EStdKeyDevice9 ] ) 
 { 
 iThrottle = -1; 
 } 
 else 
 { 
 iThrottle = 0; 
 } 
 // 
 // Rẽ xe cùng với bánh lái 
 // 
 iCarAngleSpeed = ( -iSteerAngle * iCarSpeed ) / 
KCarTurnDivider; 
 iCarAngle += iCarAngleSpeed; 
 // Điều chỉnh bánh lái thông qua các phím 
 // Nhấn phím '5' để rẽ sang trái 
 // Nhấn phím '6' để rẽ sang phải 
 if( aKey[ EStdKeyLeftArrow ] || aKey[ '5' ] || aKey[ 
EStdKeyDevice6 ] ) 
 { 
 iSteerAngle -= KSteeringSpeed; 
 } 
 else if( aKey[ EStdKeyRightArrow ] || aKey[ '6' ] || aKey[ 
EStdKeyDevice7 ] ) 
 { 
 iSteerAngle += KSteeringSpeed; 
 } 
 else 
 { 
 if( iSteerAngle > 0 ) iSteerAngle -= KSteeringSpeed; 
 if( iSteerAngle < 0 ) iSteerAngle += KSteeringSpeed; 
 } 
 // 
 // Điều chỉnh tốc độ bởi throttle 
 // 
 iCarSpeed += iThrottle; 
 if( iCarSpeed > 0 ) 
 { 
 iCarSpeed -= iCarSpeed * iCarSpeed / KFriction; 
 } 
 if( iCarSpeed < 0 ) 
 { 
 iCarSpeed += iCarSpeed * iCarSpeed / KFriction; 
 } 
 70 
4.3 Một số hình ảnh trong Games 
 if( iThrottle == 0 ) 
 { 
 if( iCarSpeed > 0 ) iCarSpeed -= 1; 
 if( iCarSpeed < 0 ) iCarSpeed += 1; 
 } 
 // 
 // Diều chỉnh bánh lái 
 // 
 if( iSteerAngle > KSteerLimit ) iSteerAngle = KSteerLimit; 
 if( iSteerAngle < -KSteerLimit ) iSteerAngle = -KSteerLimit; 
 // 
 // Điều chỉnh độ nghiêng của xe khi thay đổi tốc độ 
 // 
 iCarTilt += ( iCarSpeed - carLastSpeed ) * KCarTiltForce; 
 if( iCarTilt > 0 ) 
 { 
 iCarTilt -= ( iCarTilt * iCarTilt / 
KCarTiltSpringFactor ); 
 if( iCarTilt < 0 ) iCarTilt = 0; 
 } 
 if( iCarTilt < 0 ) 
 { 
 iCarTilt += ( iCarTilt * iCarTilt / 
KCarTiltSpringFactor ); 
 if( iCarTilt > 0 ) iCarTilt = 0; 
 } 
 } 
 71 
Chương trình chạy trên sdk: S60 2nd Edition (S60_2nd_ FP3) được sử 
dụng cho các dòng máy Nokia 6600, Nokia 6630, Nokia 6680, Nokia N70, 
Nokia N90, Nokia 9300 Communicator, and Nokia 9500 Communicator 
v.v… 
 72 
4.4 Cách tạo file sis để cài đặt lên thiết bị di động 
Chọn Project -> Properties -> carbide.c++ -> build configurations 
Chọn add -> browse.. -> Chọn file PKG ->ok 
 73 
Kết luận 
Đứng trước sự phát triển của các thiết bị di động và những đòi hỏi của 
con người trong lĩnh vực giải trí trên các thiết bị di động ngày càng cao. Với 
đề tài “Ngiên cứu lập trình C++ trên Symbian” khóa luận này đã trình bày 
được tổng quan về lập trình trên symbian và các kĩ thuật về lập trình đồ họa 
dựa trên bộ thư viên OpenGL ES. Qua đó xây dựng một mô hình 3D trên 
Symbian để làm nền tảng cho việc thiết kế các games 3D trên di động. 
Trong tương lai em sẽ nghiên cứu thêm về các kĩ thuật đồ họa khác trên 
thiết bị di động và trên nhiều dòng máy khác nhau. Ngoài ra em sẽ tiếp tục 
phát triển mô hình trên thành một game 3D hoàn chỉnh, góp phần vào ngành 
công nghiệp game di động của nước nhà. 
 Tuy nhiên do hạn chế về điều kiện và thời gian, khoá luận sẽ không thể 
tránh khỏi những thiếu sót. Kính mong được sự đóng góp ý kiến của thầy cô 
và các bạn để em có thể hoàn thiện hơn đề tài nghiên cứu của mình trong đợt 
làm khóa luận tốt nghiệp này. 
Trân trọng cảm ơn! 
 74 
Tài liệu tham khảo 
[1]. Symbian OS: 3D Game Engine Example 
[2]. OpenGL_ES_Game_Development_-_2004 – Dave Astle, Dave Durnil 
[3]. Wiley.Symbian.OS.Internals.Real.time.Kernel.Programming.Dec.2005 
[4]. Tìm hiểu và nghiên cứu kĩ thuật phát triển ứng dụng trên môi trường 
Symbian – Đại học khoa học tự nhiên, hồ chí minh. 
[5].  
[6].  
[7].  
[8]. https://collada.org/mediawiki/index.php/Main_Page 

File đính kèm:

  • pdfLuận văn Tìm hiểu về Lập trình đồ họa trên Symbian.pdf
Tài liệu liên quan