โดยทั่วไปแล้วฉากหลังของเกมจะแสดงถึงสถานที่ต่างๆอาจจะเป็นสิ่งก่อสร้างหรือสถานที่ตามธรรมชาติเช่นภูเขาหรือน้ำตก ซึ่งสถานที่เล่านี้จะถูกแบ่งออกเป้น 4 ชนิดใหญ่ๆคือ
1.ฉากก่อสร้างแบบปิด(BSP)
2.ฉากสิ่งก่อสร้างแบบเปิด(Terrain)
3.ฉากท้องฟ้าแบบสกายบอกซ์(Skybox)
4.ฉากท้องฟ้าแบบสกายโดม(Skydome)
1.ฉากสิ่งก่อสร้างแบบปิด(BSP)
ไฟล์ BSP หรือ แมพ ที่เราจะใช้ในการทำโหลดที่นี่ครับ โหลดเสดแล้วโยน .pk3 ลงในโปรเจคนะครับ
สิ่งก่อสร้างแบบปิด คือสถานที่ภายในสิ่งก่อสร้างเช่น ตึก ปราสาท ตึกรามบ้านช่อง ไฟล์ที่เราจะนำมาใช้นั้น นามสกุล.bspโดยเราสามารถนำไฟล์นี้จากเกม Quake3 มาโหลดได้ทันทีด้วยวิธีการดังนี้
*ผมจะไม่เขียนละเอียดเพราะบางส่วนได้อธิบายในบทก่อนหน้าแล้ว หากไม่เข้าใจตรงไหนกรุณากลับไปอ่านบทเก่าๆหากไม่มีแล้วจึงค่อยโพสถามครับ*
ในส่วนการประกาศตัวแปรให้พิมลงไปว่า
ICameraSceneNode* camera;
ประกาศตัวแปรควบคุมกล้อง
IAnimatedMesh* world;
ประกาศตัวแปรสำหรับโหลด BSP
ISceneNode* world_node;
ประกาศตัวแปรสำหรับตัวควบคุมฉาก
มาที่ฟังชั่น Init() ครับ เพิ่มคำสั่งลงไปตามนี้
camera = g_engine.smgr->addCameraSceneNodeFPS( 0, 100, 50 );
ประกาศใช้งานกล้องแบบ FPS ครับ โดย ส่วนค่า 100 และ 50 คือค่าความเร็วในการเคลื่นที่ของคีย์บอร์ดและเม้าตามลำดับครับ
g_engine.device->getFileSystem()->addZipFileArchive("kamq3dm2.pk3");
ไฟล์ที่นำมาจากเกม quake3 ส่วนมากจะมีการบีบอัดมาในสกุลpk3ซึ่งสามารถแตกไฟล์ย่อยออกมาเป็น.bspได้โดยคำสั่งด้านบนครับ
world = g_engine.smgr->getMesh("kamq3dm2.bsp");
เมื่อเราแตกไฟล์pk3แล้ว ขั้นตอนนี้คือการเรียกใช้ไฟล์ .bsp ลงไปในตัวแปร world ครับ
world_node = g_engine.smgr->addOctTreeSceneNode(world->getMesh(0) );
เป็นการนำ world มาใส่ในตัวแปรควบคุมและวาดลงไปในเกมครับ
หลังจากที่ เขียนโค้ดเรียบร้อยแล้วให้กด F5 ครับ หาก ไม่มี Error ใดๆ จะปรากฏภาพตามด้านล่างครับ
2.ฉากสิ่งก่อสร้างแบบเปิด(Terrain)
สิ่งก่อสร้างแบบเปิดนั้นทั่วไปคือฉากสภาพแวดล้อมธรรมชาติเช่นภูเขา
ไฟล์ที่ใช้ทำTerrainโหลดที่นี่ครับ โหลดแล้วโยนลงโปรเจค
ส่วนประกอบของ Terrain มี2ส่วนคือ
1.Height map มีไว้กำหนดความสูงต่ำของพื้นที่
2.Texture หรือพื้นผิวของพื้นที่
ทั้ง2ส่วนนั้นสามารถใช้ได้ทั้งไฟลฺประเภท .bmp .jpg .png .tga อย่างใดอย่างหนึ่งก็ได้โดยมีขั้นตอนดังนี้
*ผมจะไม่เขียนละเอียดเพราะบางส่วนได้อธิบายในบทก่อนหน้าแล้ว หากไม่เข้าใจตรงไหนกรุณากลับไปอ่านบทเก่าๆหากไม่มีแล้วจึงค่อยโพสถามครับ*
ประกาศตัวแปร
ICameraSceneNode* camera; scene::ITerrainSceneNode* terrain;
ประกาศตัวแปรสำหรับโหลดฉาก terrain
ไปที่ Init() ครับ เพิ่มลงไปตามนี้ครับ
camera = g_engine.smgr->addCameraSceneNodeFPS( 0, 100, 1200 ); camera->setPosition(core::vector3df(3800,510,7400));
เป็นการกำหนดตำแหน่งของ Terrain ในแกน XYZ ตามลำดับ
g_engine.device->getCursorControl()->setVisible(false);
ซ่อนเม้าครับ
terrain = g_engine.smgr->addTerrainSceneNode("terrain-heightmap.bmp",0,-1,core::vector3df(0.f,0.f,0.f),core::vector3df(0.f, 0.f,0.f),core::vector3df(40.f,4.4f,40.f),video::SColor ( 255, 255, 255, 255 ),5,scene::ETPS_17,4 );
การโหลดterrainต้องใช้ค่าพารามิเตอร์ทั้งหมดดังนี้ครับ
-terrain-heightmap.bmp คือชื่อภาพที่เราจะใช้กำหนดความสูงต่ำของterrainครับ
-0 คือparent node ไม่ต้องสนใจใส่0ไปเลย
-1 คือnode id ไม่ต้องสนใจครับใส่ -1ไป
-core::vector3df(0.f, 0.f, 0.f) ตัวนี้กำหนดตำแหน่งของterrainครับ
-core::vector3df(0.f, 0.f, 0.f) ตัวนี้เอาไว้กำหนดค่า rotation หรือการหมุนครับ เราใส่ 0 0 0 เพราะให้มันอยู่ในตำแหน่งเดิมไม่หมุนไม่เอียงไปไหน
-core::vector3df(40.f, 4.4f, 40.f) ตัวนี้คือการกำหนดขนาดในแนว XYZ ครับ 1มีค่าเท่ากับปกติ ฉะนั้น 40 คือใหญ่ขึ้น40เท่าครับในแกนX และใหญ่4.4เท่าในแกนY และ40เท่าในแกนZ
-video::SColor ( 255, 255, 255, 255 ) กำหนดสีของพื้นผิวครับ(vertexcolor) ในที่นี้เราใส่เต็มไปเลยครับ
-5 คือ ค่าMAXLOD ยังไม่ต้องสนใจใส่ 5ไปครับ
-scene::ETPS_17 ค่าของpatch size ครับกำหนดเท่านี้ไปก่อน
-4 คือค่า smooth factor ครับ ค่าความเนียนของยอดเขาครับ
terrain->setMaterialFlag(video::EMF_LIGHTING, false);
กำหนดให้ไม่มีการตกกระทบของแสงกับ terrain
terrain->setMaterialTexture(0, g_engine.driver->getTexture("test2.bmp"));
ให้ terrain ไปเรียก test2.bmp มาเป็นพื้นผิวครับ
หลังจากที่ เขียนโค้ดเรียบร้อยแล้วให้กด F5 ครับ หาก ไม่มี Error ใดๆ จะปรากฏภาพตามด้านล่างครับ
3.ฉากท้องฟ้าแบบสกายบอกซ์(Skybox)
คุณจะสังเกตุได้ว่าฉากทั้ง2แบบที่กล่าวไปแล้วนั้นจะไม่มีท้องฟ้าอยู่ทำให้ขาดความสมจริง เราจึงจะมาทำการโหลดท้องฟ้ากันเทคนิคนี่เรียกว่า สกายบ๊อก สาเหตุที่เรียกมันแบบนี้เพราะว่า วิธีนี้คือการนำภาพสี่เหลี่ยม 6ด้านมาเป็นพื้นผิวประกอบกันเป็นกล่องสี่เหลี่ยมนั้นเองมันจึงถูกเรียกว่า Skybox ไฟล์ภาพนั้นจะเป็น .bmp .jpg .png .tga อย่างใดอย่างหนึ่งก็ได้โดยมีวิธีทำดังนี้
ไฟล์สำหรับskyboxครับ เอาภาพไปโยนลงใน folder projectครับ
(ต่อจากข้อ2.)ใน Init() ต่อจาก บรรทัดที่เขียนว่า terrain->setMaterialTexture(0, g_engine.driver->getTexture("test2.bmp")); ) ให้เพิ่มคำสั่งนี้ลงไป
g_engine.smgr->addSkyBoxSceneNode( g_engine.driver->getTexture("content/skybox/top.bmp"), g_engine.driver->getTexture("content/skybox/bottom.bmp"), g_engine.driver->getTexture("content/skybox/left.bmp"), g_engine.driver->getTexture("content/skybox/right.bmp"), g_engine.driver->getTexture("content/skybox/front.bmp"), g_engine.driver->getTexture("content/skybox/back.bmp"));
หลังจากที่ เขียนโค้ดเรียบร้อยแล้วให้กด F5 ครับ หาก ไม่มี Error ใดๆ จะปรากฏภาพตามด้านล่างครับ
4.ฉากท้องฟ้าแบบสกายโดม(Skydome
หากคุณไม่ชอบการใช้textureหลายๆด้าน ลองวิธีสร้างอีกแบบหนึ่งคือ สกายโดม จะเป็นท้องฟ้าแบบพื้นผิวเดียวโดนการสร้างโดมมาครอบฉากหลังเอาไว้ สกายโดมจะประกอบไปด้วยโพลีก้อนรูปโดม และ พื้นผิว 1 ภาพจะเป็น .bmp .jpg .png .tga ก็ได้
โหลดภาพสกายโดมที่นี่ โยนลงโปรเจคเช่นเคย
(ต่อจากข้อ2.)ใน Init() ต่อจาก บรรทัดที่เขียนว่า terrain->setMaterialTexture(0, g_engine.driver->getTexture("test2.bmp")); ) ให้เพิ่มคำสั่งนี้ลงไป
g_engine.smgr->addSkyDomeSceneNode(g_engine.driver->getTexture("space2.bmp"),16,16,1.0f,1.0f);
การเรียกภาพ space2 มาเป็นพื้นผิว 16คือขนาดแนวนอนของโดม(กว้าง) 16ตัวที่สองคือขนาดแนวตั้ง(สูง) 1.0คือ%ของtexture(scale texture) 1.0ตัวต่อมาคือ %ของวงกลม(scale)
หลังจากที่ เขียนโค้ดเรียบร้อยแล้วให้กด F5 ครับ หาก ไม่มี Error ใดๆ จะปรากฏภาพตามด้านล่างครับ
|