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
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:
- Luận văn Tìm hiểu về Lập trình đồ họa trên Symbian.pdf