วันศุกร์ที่ 30 มกราคม พ.ศ. 2552

PyOgre Beginner Tutorial 2 - Part 3 Light&Shadows

เนื่องจาก การเขียนอธิบายหลายๆ อย่างมันค่อนข้างทำให้ เนื้อหายาว จากนี้ไปก็จะเขียนอธิบายแบบสั้นๆ  เพราะว่าเขียนยาวๆ จะมีคนอ่านรึเปล่าก็ไม่รู้ เริ่มเลยละกัน

Lights and Shadows

Shadow Types that Ogre Supports
Ogre ในเวอชั่นน์ขณะนี้ สนับสนุนชนิดของเงาอยู่ 3 ชนิด:

Modulative Texture Shadows (SHADOWTYPE_TEXTURE_MODULATIVE) เป็นชนิดที่ น่าสนใจน้อยที่สุดใน 3 ชนิด โดยเงาชนิดนี้จะเป็นการสร้าง เงาขาวและดำให้ปรากฏบนพื้นผิว ที่ต้องการให้ปรากฏในฉาก

Modulative Stencil Shadows (SHADOWTYPE_STENCIL_MODULATIVE) เทคนิคนี้เป็นการเรนเดอร์เงาทั้งหมดผสมรวมกัน หลังจากที่วัตถุที่ไม่โปร่งใสในฉากได้ถูกเรนเดอร์แล้ว

Additive Stencil Shadows (SHADOWTYPE_STENCIL_ADDITIVE) เป็นเทคนิคในการเรนเดอร์ แหล่งกำเนิดแสงแต่ละจุด ทีละดวงๆ ใช้การ์ดกราฟฟิคที่หนัก แต่ได้แสงเงาที่สวย


สำหรับตัวของเอนจิ้นของ Ogre เองนั้นไม่มีการสนับสนุน soft shadow ในตัวมันเอง แต่สามารถที่จะเขียนเองได้ผ่าน vertex และ fragment programs
*คำเตือนการใช้เงาบางชนิด จำเป็นต้องเซตสีให้เป็น 32 bits



import ogre.renderer.OGRE as ogre
import SampleFramework as sf

class TutorialApplication(sf.Application):

def _createScene(self):
sceneManager = self.sceneManager
#ตั้งค่า ambient light ให้มืดสนิท
sceneManager.ambientLight = (0, 0, 0)
sceneManager.shadowTechnique = ogre.SHADOWTYPE_STENCIL_ADDITIVE

# สร้างตัวละครจาก Mesh ที่มีอยู่แล้ว
ent = sceneManager.createEntity('Ninja', 'ninja.mesh')
ent.castShadows = True
sceneManager.getRootSceneNode().createChildSceneNode().attachObject(ent)

# สร้างพื้นเป็นที่รับเงาที่ทอดจาก ตัวละคร
plane = ogre.Plane ((0, 1, 0), 0)
meshManager = ogre.MeshManager.getSingleton ()
meshManager.createPlane ('Ground', 'General', plane,
1500, 1500, 20, 20, True, 1, 5, 5, (0, 0, 1))
ent = sceneManager.createEntity('GroundEntity', 'Ground')
sceneManager.getRootSceneNode().createChildSceneNode ().attachObject (ent)
ent.setMaterialName ('Examples/Rockwall')
ent.castShadows = False

#สร้างตัวกำเนิดแสงเป็นแบบ point light
light = self.sceneManager.createLight ('PointLight')
light.type = ogre.Light.LT_POINT
light.position = (150, 300, 150)
light.diffuseColour = (.5, .0, .0)    # Red
light.specularColour = (.5, .0, .0)

# ตั้งค่า distant directional light
light = sceneManager.createLight ('DirectionalLight')
light.type = ogre.Light.LT_DIRECTIONAL
light.diffuseColour = (.5, .5, .0)    # yellow
light.specularColour = (.75, .75, .75)
light.direction = (0, -1, 1)

# ตั้งค่า spot light
light = sceneManager.createLight ('SpotLight')
light.type = ogre.Light.LT_SPOTLIGHT
light.diffuseColour = (0, 0, .5)    # Blue
light.specularColour = (0, 0, .5)
light.direction = (-1, -1, 0)
light.position = (300, 300, 0)
light.setSpotlightRange (ogre.Degree (35), ogre.Degree (50))

def _createCamera (self):
self.camera =  self.sceneManager.createCamera ('PlayerCam')
self.camera.position = (0, 150, -500)
self.camera.lookAt ((0, 0, 0))
self.camera.nearClipDistance = 5

def _createViewports (self):
viewport = self.renderWindow.addViewport (self.camera)
viewport.backGroundColor = (0, 0, 0)
self.camera.aspectRatio = float (viewport.actualWidth) / float (viewport.actualHeight)

if __name__ == '__main__':
ta = TutorialApplication ()
ta.go ()

ภาพที่ได้



หลังจากจบบทที่สองนี้แล้ว คิดว่าคงไม่แปลต่อละไงก็ไปดูต้นฉบับได้ที่ Pyogre wiki นะครับ จะได้เวลาลงมือเขียนโปรแกรมจริงจังซะที

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

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