วันพุธที่ 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 ควรใช้เฉพาะที่ต้องใช้พอ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น