วันพุธที่ 19 พฤศจิกายน พ.ศ. 2551

PyOgre Beginner Tutorial 1 - Part 6


SceneNodes more in Depth

Class SceneNode เป็น Class ที่มีความซับซ้อนมาก มีหลายอย่างที่เราสามารถที่จะทำกับ SceneNode ได้ ดังนั้นเราจะกล่าวถึงเพียงในส่วนที่มีการใช้เป็นประโยชน์มากที่สุดและบ่อย
คุณสมบัติ ‘position’ สามารถใช้ในการตั้งค่าหรือขอค่า ตำแหน่งของ SceneNode (สัมพันธ์กับ SceneNode ที่เป็นหลัก) คุณสามารถที่จะเคลื่อน วัตถุสัมพันธ์กับตำแหน่งปัจจุบัน โดยใช้ translate method
                SceneNodes ไม่เพียงจัดการแค่ตำแหน่ง แต่สามารถจะจัดการทั้ง การขยาย (scale) วัถตุโดยใช้ฟังก์ชั่น scaleBy และการหมุน (rotation) ของวัตถุ สามารถที่จะทำโดยใช้ฟังก์ชั่น yaw, roll, และ pitch เมื่อเราต้องการให้ค่าที่เราได้ทำการเปลี่ยนแปลงไปนั้นกลับมาเป็นเหมือนเดิม เราก็ให้ฟังก์ชั่น resetOrientation และเรายังสามารถที่จะใช้คุณสมบัติ ‘orientation’ ในการที่จะดูค่า หรือเซตค่าได้เหมือนกัน
                เราได้เห็นการให้งานฟังก์ชั่น attachObject จากโค้ดโปรแกรมที่ผ่านมาแล้ว ยังมีอีกหลายฟังก์ชั่นและหลายคุณสมบัติที่จะช่วยให้เราสามารถที่จะจัดการ กับวัตถุที่ถูกผูกติดไว้กับ SceneNode เช่นคุณสมบัติ numAttachedObjects ฟังก์ชั่น getAttachedObject (มีหลายเวอร์ชั่น สำหรับฟังก์ชั่นนี้), detachObject(มีหลายเวอร์ชั่นเหมือนกัน), detachAllObjects ซึ่งทั้งหมดสามารถช่วยจัดการ SceneNodes ได้เป็นอย่างดี


                เมื่อเรารู้ว่าการเปลี่ยนแปลงตำแหน่ง การเคลื่อนย้าย มีความสัมพันธ์ กับตัวโหนดหลัก (parent) ของ SceneNode  เราจึงสามารถที่จะทำให้ SceneNode สองอันเคลื่อนย้ายไปด้วยกันโดยง่ายตามโค้ดนี้

ent1 = sceneManager.createEntity('Robot','robot.mesh')
node1 = sceneManager.getRootSceneNode().createChildSceneNode('RobotNode')
node1.attachObject (ent1) 

ent2 = sceneManager.createEntity ('Robot2','robot.mesh')
node2 = sceneManager.getRootSceneNode().createChildSceneNode('RobotNode2',(50,0,0))
node2.attachObject (ent2)

ถ้าเราเป็นโค้ดจากเดิม

node2 = sceneManager.getRootSceneNode().createChildSceneNode('RobotNode2',(50,0,0))

ไปเป็น

node2 = node1.createChildSceneNode('RobotNode2',(50,0,0))

ดังนั้นแล้วเราได้ทำให้ RobotNode2 เป็นโหนดลูกของ RobotNode เมื่อมีการเคลื่อนย้าย node1 ก็จะย้าย node2 ตามไปด้วย แต่การเคลื่อนย้าย node2 ไม่มีผลใดๆกับ node1 ตัวอย่างโค้ดถ้าเคลื่อนย้าย RobotNode2 อย่างเดียว:

node2.translate((0,50,0))

ตัวอย่างโค้ดถ้าเคลื่อนย้าย RobotNode แล้ว RobotNode2 จะย้ายตาม:

node1.translate((0,50,0))


ถ้ามีปัญหากับสิ่งที่กล่าวมานี้ให้ลองไล่เริ่มที่ root SceneNode ลงไปเริ่มจาก

ถ้าเราให้ node1 เริ่มที่ (0,0,0) และย้ายไปที่ (25,0,0) ตำแหน่งใหม่ของ node1 จะกลายเป็น (25,0,0)

ถ้าเราให้ node2 เริ่มที่ (50,0,0) และย้ายไปที่ (10,0,10) ตำแหน่งใหม่ของ node2 จะกลายเป็น (60,0,10)

แต่สิ่งที่เกิดขึ้นจริงคือ เริ่มที่ root SceneNode ซึ่งตำแหน่งของมันจะมีค่า (0,0,0) ตลอด แล้วเราให้

node1 มีตำแหน่งคือ (root+node1)(0,0,0)+(25,0,0) = (25,0,0)

ขณะนี้ node2 เป็นโหนดลูกของ node1 ดังนั้นตำแหน่งของมันจะเป็น

 node2 มีตำแหน่งคือ (root+node1+node2)(0,0,0)+(25,0,0)+(60,0,10) = (85,0,0)

นี้เป็นเพียงตัวอย่างที่อธิบายความสัมพันธ์ที่เกี่ยวของตำแหน่งโหนดหลัก และโหนดลูก

ท้ายสุดของ PyOgre Beginner Tutorial 1  นี้จำไว้ว่าเราสามารถเข้าถึงทั้ง SceneNodes และ Entities โดยการเรียกชื่อผ่านฟังก์ชั่น getSceneNode และ getEntity ของ SceneManager ดังนั้นไม่ต้องเก็บตัวชี้ (pointer) กับทุกๆ SceneNode ควรใช้เฉพาะที่ต้องใช้พอ

PyOgre Beginner Tutorial 1 - Part 5

Vectors and ColourValue

ถ้าคุณจิตนาการจะเห็นว่า ภายใน Class จะมีการใช้ Ogre เป็นจำนวนมาก ซึ่งสองอย่างจากทั้งหลายเหล่านั้นก็คือ Vector3 และ ColourValue คุณสามารถทำให้มันง่ายขึ้น เมื่อคุณต้องการใช้ 
Vector3  และ ColourValue คุณสามารถใช้ tuple แทน เช่น Vector3(50,0,0) และ ColourValue(1,1,1) แทนเป็น (50,0,0) และ (1,1,1)แทน ดังโค้ดต่อไปนี้

sceneManager = self.sceneManager

sceneManager.ambientLight = (1, 1, 1)

ent1 = sceneManager.createEntity('Robot', 'robot.mesh')
node1 = sceneManager.rootSceneNode.createChildSceneNode('RobotNode')
node1.attachObject(ent1)

ent2 = sceneManager.createEntity('Robot2', 'robot.mesh')
node2 = sceneManager.rootSceneNode.createChildSceneNode('RobotNode2', (50, 0, 0))
node2.attachObject(ent2)

   
Entities more in Depth


    Entity class เป็น class ที่มีเนื้อหาที่กว้าง เราไม่สามารถที่จะพูดถึงการใช้งานเกี่ยวกับมันได้หมดในขนาดนี้ ต้องศึกษาเอง แต่จะยกตัวอย่างฟังก์ชั่นบางอย่างที่ให้เป็นประโยชน์ได้มาก 2-3 อัน
     คุณสมบัติที่หนึ่ง  “visible” คุณสามารถที่จะตั้งให้ Entity สามารถมองเห็นได้หรือไม่ โดยการตั้งให้มันเป็น True หรือ False แทนการที่จะ ลบและสร้าง Entity ใหม่ในแต่ละครั้งซึ่งจะทำให้ต้องมีการ สร้างโหลดทุกครั้งทำให้ไม่เสียเวลาในการ โหลดใน Memory ทุกครั้ง
     คุณสมบัติ  “name”  จะส่งค่าชื่อของตัว Entity กลับ (ค่าอ่านได้อย่างเดียว เราไม่สามารถเปลี่ยนชื่อได้หลังจากสร้างมันขึ้นมาแล้ว)
 คุณสมบัติ  “parentSceneNode” ส่งค่า SceneNode,entity ที่ผูกติดกลับมัน

PyOgre Beginner Tutorial 1 - Part 4

Coordinates and Vectors
    ก่อนที่เราจะไปไกลกว่านี้ เราจะต้องพูดถึงเรี่ยวกับ screen coordinates and Ogre Vector objects สำหรับ Ogre นั้นก็เหมือนกับ กราฟฟิกเอนจิ้นทั่วๆไป คือ ให้แกน X เป็นแนวนอน Z แกนแนวลึก และ แกน Y เป็นแนวตั้ง เมื่อคุณมองจอคอมพิวเตอร์ขณะนี้ แกน X จะเริ่มจาก ซ้ายไปขวาของจอ โดยด้านขวาจะเป็นทิศทางบวก แกน  Y จะเริ่มจากล่างขึ้นบนของจอ โดยด้านบนจะเป็นทิศทางบวก  แกน Z จะมีทิศเข้าสู่จอและออกจากจอ โดยทิศทางบวกจะเริ่มจากทางนอกจอเข้าสู่จอ
    ถ้าให้ตัวหุ่นยนต์ Robot ในฉากหันหน้าไปตามทิศแกน X ในทิศบวกซึ่งเป็นคุณสมบัติของ Mesh เองที่มันสร้างถูกออกแบบไว้แล้ว Ogre ไม่สามารถที่จะรู้ได้ว่า Model ของคุณนั้นมีทิศหันไปทางไหน ดังนั้นแต่ละตัวที่ถูกโหลดขึ้นมา จะมีการหันทิศทางการหันแตกต่างกันออกไป
    Ogre ใช้ Vector class เป็นตัวแทนของตำแหน่งและทิศทาง (ไม่ใช่ Point class ) ซึ่งการกำหนด Vector จะมีอยู่ 2(Vector2), 3(Vector3), และ 4 (Vector4) มิติ โดยมากแล้ว Vector3 นั้นจะถูกใช้มากกว่า ถ้าคุณไม่คุ้นเคยกับ Vectors ก็ควรจะศึกษาเพิ่มเกี่ยวกับมัน ก่อนที่คุณจะทำอะไรที่ยากขึ้นกับ Ogre เพราะคณิตศาสตร์ของ Vectors จะใช้ประโยชน์ได้ เมื่อคุณทำงานกับโปรแกรมที่ซับซ้อนมากขึ้น



Adding another Object
    เมื่อเข้าใจเกี่ยวระบบตำแหน่งแล้ว เราจะกลับมาในส่วนของโค้ด ที่เขียนมาแล้ว ซึ่งโค้ดเราไม่มีการให้ค่าตำแหน่งที่เราต้องการให้ Robot เราแสดงบนจอภาพ แต่ฟังก์ชั่นใน Orge มีค่า Default ให้กับมันแล้ว สำหรับตัวอย่าง เช่น SceneNode.createChildSceneNode ฟังก์ชั่นสมาชิกใน Ogre มีพารามิเตอร์สามตัวประกอบด้วย ชื่อของ SceneNode  ตำแหน่งของ SceneNode ทิศทางการหัน SceneNode  ตำแหน่งนั้นถ้าคุณสังเกต จะเห็นว่ามันเป็นตำแหน่ง (0,0,0) ถ้าเราจะให้ค่าตำแหน่งเริ่มบางตำแหน่งแทนค่าเดิม

ent2 = sceneManager.createEntity('Robot2', 'robot.mesh')
node2 = sceneManager.rootSceneNode.createChildSceneNode('RobotNode2', ogre.Vector3(50, 0, 0))
node2.attachObject(ent2)

จากโค้ดจะคล้ายของเดิมแต่ได้มีการเพิ่มบางอย่างลงไป ขั้นแรก ตั้งชื่อ Entity และ SceneNode เป็นชื่อที่ต่างไปจากเดิม ขั้นสองเราให้ค่าตำแหน่งเริ่มต้น เปลี่ยนไปโดยให้ค่า X เป็น 50 จาก root SceneNode (จำไว้ว่า ทุกตำแหน่งของ SceneNode ทั้งหมดจะสัมพันธ์กับตัวหลัก ) เมื่อทำการทดสอบโค้ดเราจะ เห็น Robot สองตัวอยู่ข้างกัน


วันอังคารที่ 18 พฤศจิกายน พ.ศ. 2551

DirectX 9 Download

ปัญหาที่พบในบางครั้งเมื่อเราจะติดตั้งเกมส์ หรือ Game Engine เพื่อพัฒนาเกมส์ มักจะเจอ Error ที่เกี่ยวข้องกับเวอร์ชั่นของ DirectX ที่ใช้ปัจจุบัน หลายคนที่ไม่รู้ บอกว่า "ก็ DirectX ที่ลงกับ windows XP ก็เวอร์ชั่นใหม่แล้วนิ" คำพูดนี้มันก็ใช่นะแต่ รู้ไหมว่าเจ้า DirectX 9c ที่ลงบน Windows XP นั้นมีการอัพเดตเสริมความสามารถใหม่ตลอด และจะปล่อยเวอร์ชั่นที่ใหม่สุดออกเรื่อย ดังนั้นถ้าเกมส์หรือโปรแกรมที่ใช้งานอ้างอิง DirectX ที่เป็นเวอร์ชั่นใหม่ๆ เขียนขึ้นมาก็จะเกิดปัญหาสำหรับคนที่ยังใช้ DirectX เวอร์ชั่นเก่าอยู่ ดังนั้นมาอัพเดต DirectX กันเถอะครับ

DownLoad DirctX 9.0c

DirectX 9.0c (Nov 08)  <------เวอร์ชั่นใหม่ล่าสุดในขณะที่เขียนโพสนี้

Old Versions
DirectX 9.0c (Aug 08)
DirectX 9.0c (Jun 08)
DirectX 9.0c (Mar 08)
DirectX 9.0c (Nov 07)
DirectX 9.0c (Aug 07)
DirectX 9.0c (Jun 07)
DirectX 9.0c (Apr 07)
DirectX 9.0c (Feb 07)
DirectX 9.0c (Dec 06)
DirectX 9.0c (Oct 06)
DirectX 9.0c (Aug 06)
DirectX 9.0c (Jun 06)
DirectX 9.0c (Apr 06)
DirectX 9.0c (Feb 06)
DirectX 9.0c (Dec 05)
DirectX 9.0c (Oct 05)
DirectX 9.0c (Aug 05)
DirectX 9.0c