Main webboard   »   Irrlicht
 ย้อนกลับ  |  ตั้งกระทู้ใหม่  
Started by
Topic:   บทที่ 4 การโหลดฉากหลัง 3 มิติ  (Read: 2791 times - Reply: 0 comments)   
saruch (Admin)

Posts: 14 topics
Joined: 25/1/2553

บทที่ 4 การโหลดฉากหลัง 3 มิติ
« Thread Started on 26/1/2553 22:26:00 IP : 110.164.88.154 »
 

โดยทั่วไปแล้วฉากหลังของเกมจะแสดงถึงสถานที่ต่างๆอาจจะเป็นสิ่งก่อสร้างหรือสถานที่ตามธรรมชาติเช่นภูเขาหรือน้ำตก ซึ่งสถานที่เล่านี้จะถูกแบ่งออกเป้น 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 ใดๆ จะปรากฏภาพตามด้านล่างครับ


 
   Link to Post - Back to Top

Bookmark and Share

กรุณาเข้าสู่ระบบหรือสมัครสมาชิกก่อนโพสข้อความค่ะ
»
คลิ๊กที่นี่
   Main webboard   »   Irrlicht
 ย้อนกลับ  |  ตั้งกระทู้ใหม่  
Advertising Zone    Close

ด้วยความปราถนาดีจาก "สยามทูเว็บดอทคอม" และเพื่อป้องกันการเปิดเว็บไซต์เพื่อหลอกลวงขายของ โปรดตรวจสอบร้านค้าให้แน่ใจก่อนตัดสินใจซื้อของทุกครั้งนะคะ    อ่านเพิ่มเติม ...