Newbye simple question abuot camera and viewports

luke14free

05-09-2007 10:30:01

Hello, I'm a newbye of python-ogre. I was trying to project my first simple application but I'm not able to handle one thing.
I would like to create a game where you see the shoulder of your robot ( as like as crash banicoot 3 and many others game) and you are able to move on a simple terrain.
I wonder what i have to do to put the camera always beyhond my pg. I've tryed to:

create a node with an entity(the robot of the examples)

create a framelistener that let's you move the entity(using up,down,left and so on,,)

create a camera that has the same position of the node [and this doesn't work, but no error occurred]

create an auto tracking camera on the node[and this doesn't worked too]

create a camera and set it lookAt the shoulder of the pg[guess what?it doesn't work:-)]

What could I do? Thanks for help

SiWi

06-09-2007 08:59:27

I haven´t done this myself yet, but I think there is a tutorial for RPG like camera handling. Search for RPG. The problem about it is that it´s in C++. If you don´t know how to bring this to PythonOgre, I will take a look at it for you sometimes.

luke14free

06-09-2007 10:14:45

Oh yes, I saw it...Yes well, I could try to port it...I don't know c++ very well but the basic sintax is not so different from other languages that derives from it(W python :-) ).
If you could do it, it would be a very nice thing to do, and I want to thank you, sir.
By the way. Couldn't i do something like that:

Create a sceneNode where i put the pg (A)

Create a sceneNode where i put the floor(B)

Create a sceneNode where i put the cam(C)

Then i set C to be positioned at 0,B[y]+10,0;
I set C to autotrack A and C to be positioned at A[x],A[y],A[z]+10;

The problem that i have now is that:

A is not visualized in the screen

until B is a 'stand alone node' and is not a child of A it looks like a convex sky without floor

C is very slow moving

this is the code i used (from cameratracking demo):

import Ogre as ogre
import SampleFramework

class TutorialFrameListener(SampleFramework.FrameListener):
def __init__(self, renderWindow, camera, sceneManager):
SampleFramework.FrameListener.__init__(self, renderWindow, camera)

def frameStarted(self, evt):
return SampleFramework.FrameListener.frameStarted(self, evt)

class TutorialApplication(SampleFramework.Application):
def _createScene(self):
sceneManager = self.sceneManager

sceneManager.setAmbientLight ( (0.7, 0.7, 0.7) )
# sceneManager.setSkyBox (True, "Examples/CloudySky") ## AJM THIS FAILS FOR SOME REASON?
sceneManager.setSkyDome (True, "Examples/CloudySky")

light = sceneManager.createLight('MainLight')
light.setPosition (20, 80, 50)


plane = ogre.Plane()
plane.normal = ogre.Vector3.UNIT_Y
plane.d = 200
mm = ogre.MeshManager.getSingleton()
mm.createPlane('FloorPlane', 'General', plane, 200000.0, 200000.0,
20, 20, True, 1, 200.0, 200.0, (0, 0, 1),
ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY, ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY,
True,True )


entity = sceneManager.createEntity('floor', 'FloorPlane')
entity.setMaterialName('Examples/RustySteel')
sceneManager.getRootSceneNode().createChildSceneNode().attachObject(entity)

# create head entity
entity = sceneManager.createEntity('head', 'ogrehead.mesh')
sceneManager.getSceneNode("HeadNode").createChildSceneNode().attachObject(entity)
sceneManager.getSceneNode("HeadNode").setPosition(ogre.Vector3(20,20,20))




def _createCamera(self):
sceneManager = self.sceneManager
self.camera = sceneManager.createCamera("Camera1")
self.camera.nearClipDistance = 5
cn=self.sceneManager.createSceneNode("CamNode")
hn=self.sceneManager.createSceneNode("HeadNode")
self.cameraNode=sceneManager.getSceneNode("CamNode").createChildSceneNode().attachObject(self.camera)
sceneManager.getSceneNode("CamNode").setPosition(sceneManager.getSceneNode("HeadNode").getPosition())
self.camera.setAutoTracking(True,sceneManager.getSceneNode("HeadNode"))

def _createFrameListener(self):
self.frameListener = TutorialFrameListener(self.renderWindow, self.camera, self.sceneManager)
self.root.addFrameListener(self.frameListener)

if __name__ == '__main__':
try:
ta = TutorialApplication()
ta.go()
except ogre.OgreException, e:
print e


SiWi

06-09-2007 10:39:03

I understand what you mean. Taking a quick look at your code I see you give the camera the same position of the HeadNode. Could that be the problem?

luke14free

06-09-2007 10:52:01

mmm...but that's what i want...same x same y but different z, i mean different depth, and then the headnode has to translate in the space toghether with the camera one...

SiWi

06-09-2007 12:08:50

but where do you set the different z?

luke14free

06-09-2007 20:11:42

Here it is...same problem as before...

import Ogre as ogre
import SampleFramework1 as SampleFramework

class TutorialFrameListener(SampleFramework.FrameListener):
def __init__(self, renderWindow, camera, sceneManager):
SampleFramework.FrameListener.__init__(self, renderWindow, camera)

def frameStarted(self, evt):
return SampleFramework.FrameListener.frameStarted(self, evt)

class TutorialApplication(SampleFramework.Application):
def _createScene(self):
sceneManager = self.sceneManager

sceneManager.setAmbientLight ( (0.7, 0.7, 0.7) )
# sceneManager.setSkyBox (True, "Examples/CloudySky") ## AJM THIS FAILS FOR SOME REASON?
sceneManager.setSkyDome (True, "Examples/CloudySky")

light = sceneManager.createLight('MainLight')
light.setPosition (20, 80, 50)


plane = ogre.Plane()
plane.normal = ogre.Vector3.UNIT_Y
plane.d = 200
mm = ogre.MeshManager.getSingleton()
mm.createPlane('FloorPlane', 'General', plane, 200000.0, 200000.0,
20, 20, True, 1, 200.0, 200.0, (0, 0, 1),
ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY, ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY,
True,True )


entity = sceneManager.createEntity('floor', 'FloorPlane')
entity.setMaterialName('Examples/RustySteel')
sceneManager.getRootSceneNode().createChildSceneNode().attachObject(entity)

# create head entity
entity = sceneManager.createEntity('head', 'ogrehead.mesh')
sceneManager.getSceneNode("HeadNode").createChildSceneNode().attachObject(entity)
sceneManager.getSceneNode("HeadNode").setPosition(ogre.Vector3(20,20,20))




def _createCamera(self):
sceneManager = self.sceneManager
self.camera = sceneManager.createCamera("Camera1")
self.camera.nearClipDistance = 5
cn=self.sceneManager.createSceneNode("CamNode")
hn=self.sceneManager.createSceneNode("HeadNode")
self.cameraNode=sceneManager.getSceneNode("CamNode").createChildSceneNode().attachObject(self.camera)
sceneManager.getSceneNode("CamNode").setPosition(sceneManager.getSceneNode("HeadNode").getPosition())
self.camera.setAutoTracking(True,sceneManager.getSceneNode("HeadNode"))
cn.setPosition((hn.getPosition()[0],hn.getPosition()[1],hn.getPosition()[2]-10))

def _createFrameListener(self):
self.frameListener = TutorialFrameListener(self.renderWindow, self.camera, self.sceneManager)
self.root.addFrameListener(self.frameListener)

if __name__ == '__main__':
try:
ta = TutorialApplication()
ta.go()
except ogre.OgreException, e:
print e

luke14free

07-09-2007 07:55:11

Maybe is better not to contine in that way...
I am translating the code from c++. But i'll need someone to correct my work, if possible, because i am unable to do it myself :o
After that the code could be also put in the python-ogre wiky,couldn't it?

luke14free

07-09-2007 09:40:19

Rewritten in python, of coure with some errors, because I am not an expert of python-orge...Could someone please correct it?
Thanks!

# Generic Character class
import Ogre as ogre
import OIS
import SampleFramework as sf
import random
class Character:##c++ ported
def __init__(self):
self.mMainNode=ogre.SceneNode()
self.mSightNode=ogre.SceneNode()
self.mCameraNode=ogre.SceneNode()
self.mEntity=ogre.Entity()
self.mSceneMgr=ogre.SceneManager()
def getSightNode(self):
return self.mSightNode
def getCameraNode(self):
return self.mCameraNode
def getMainNode(self):
return self.mMainNode.getWorldPosition()


class OgreCharacter:
def __init__ (self,name,SceneManager):
self.mName = name
self.mSceneMgr = SceneManager
self.mMainNode = self.mSceneMgr.getRootSceneNode().createChildSceneNode(self.mName)
self.mSightNode = self.mMainNode.createChildSceneNode (self.mName + "_sight", ogre.Vector3 (0, 0, 100))
self.mCameraNode = self.mMainNode.createChildSceneNode (self.mName + "_camera", ogre.Vector3 (0, 50, -100))
self.mEntity = self.mSceneMgr.createEntity (self.mName, "OgreHead.mesh")
self.mMainNode.attachObject(self.mEntity)
def _OgreCharacter(self):
self.mMainNodedetachAllObjects()
del self.mEntity
self.mMainNode.removeAndDestroyAllChildren()
self.mSceneMgr.destroySceneNode(self.mName)

def update (self,elapsedTime, inputDevice):
if inputDevice.isKeyDown(OIS.KC_W):
self.mMainNode.translate (self.mMainNode.getOrientation () * ogre.Vector3 (0, 0, 100 * elapsedTime))
if inputDevice.isKeyDown(OIS.KC_S):
self.mMainNode.translate (self.mMainNode.getOrientation () * ogre.Vector3 (0, 0, -50 * elapsedTime))
if inputDevice.isKeyDown(OIS.KC_A):
self.mMainNode.yaw(Radian (2 * elapsedTime))
if inputDevice.isKeyDown (OIS.KC_D):
self.mMainNode.yaw(Radian (-2 * elapsedTime))

def setVisible(self,visible):
self.mMainNode.setVisible(visible)
class ExtendedCamera:
'''
mTargetNode=ogre.SceneNode()
mCameraNode=ogre.SceneNode()
mCamera=ogre.Camera()
mSceneMgr=ogre.SceneManager()
mName=None#string
mOwnCamera=None#bool
mTightness=None#real'''

def __init__(self,name, SceneManager, Camera= 0):

self.mName = name
self.mSceneMgr = SceneManager
self.mCameraNode = self.mSceneMgr.getRootSceneNode().createChildSceneNode (self.mName)
self.mTargetNode = self.mSceneMgr.getRootSceneNode().createChildSceneNode (self.mName + "_target")
self.mCameraNode.setAutoTracking (True, self.mTargetNode)
self.mCameraNode.setFixedYawAxis (True)
if Camera == 0:
self.mCamera = self.mSceneMgr.createCamera (self.mName)
self.mOwnCamera = True

else:
self.mCamera = Camera
self.mCamera.setPosition(0.0,0.0,0.0)
self.mOwnCamera = False
self.mCameraNode.attachObject (self.mCamera)
self.mTightness = 0.01

def _ExtendedCamera(self):##What does the wave char means? i've replaced it with "_"
self.mCameraNode.detachAllObjects()
if self.mOwnCamera==True:
del self.mCamera
self.mSceneMgr.destroySceneNode (self.mName)
self.mSceneMgr.destroySceneNode (self.mName + "_target")
def setTightness(self,tightness):
self.mTightness = tightness
def getTightness(self):
return self.mTightness
def getCameraPosition(self):
return self.mCameraNode.getPosition()
def instantUpdate (self, cameraPosition, targetPosition):
self.mCameraNode.setPosition(cameraPosition)
self.mTargetNode.setPosition(targetPosition)
def update (self,elapsedTime, cameraPosition, targetPosition):
displacement=(0,0,0)##Is that correct??
displacement=(cameraPosition - self.mCamera.NodegetPosition ()) * self.mTightness
self.mCameraNode=self.mCameraNode.translate (displacement)##Is that correct??

displacement = (targetPosition - self.mTargetNode.getPosition ()) * self.mTightness
self.mTargetNode=self.mCameraNode.translate (displacement)##Is that correct??

class SampleListener(sf.FrameListener):
def __init__(self,win, cam):
ogre.FrameListener.__init__(self)
self.mChar = 0
self.mExCamera = 0
self.mMode = 0
def setCharacter(self,character):
self.mChar = character
def setExtendedCamera(self,cam):
self.mExCamera = cam
def frameStarted(self, evt):
inputDevice = self.inputDevice
self.mKeyboard=inputDevice.capture()
if self.mChar:
self.mChar.update (evt.timeSinceLastFrame, mKeyboard)
if self.mExCamera==0:
self.mExCamera.update (evt.timeSinceLastFrame, self.mChar.getCameraNode().getWorldPosition(),self.mChar.getSightNode().getWorldPosition())
if self.mExCamera==1:
self.mExCamera.update (evt.timeSinceLastFrame,ogre.Vector3 (0, 200, 0),self.mChar.getSightNode ().getWorldPosition ())
if self.mExCamera==2:
self.mExCamera.update (evt.timeSinceLastFrame,self.mChar.getWorldPosition (),self.mChar.getSightNode ().getWorldPosition ())
if mKeyboard.isKeyDown(OIS.KC_F1):
mMode = 0
if self.mChar:##if self.mChar what?? if is set self.mChar?? bho!
self.mChar.setVisible(true)
if self.mExCamera:
if self.mChar:
self.mExCamera.instantUpdate (self.mChar.getCameraNode().getWorldPosition(), self.mChar.getSightNode().getWorldPosition ())
self.mExCamera.setTightness (0.01)
if mKeyboard.isKeyDown(OIS.KC_F2):
mMode=1
if self.mChar:
self.mChar.setVisible(true)
if self.mExCamera:
if self.mChar:
self.mExCamera.instantUpdate (ogre.Vector3(0, 200, 0), self.mChar.getSightNode().getWorldPosition())
self.mExCamera.setTightness(0.01)
if (mKeyboard.isKeyDown (OIS.KC_F3)):
mMode = 2
if self.mChar:
self.mChar.setVisible(false)
if self.mExCamera:
if self.mChar:
self.mExCamera.instantUpdate(self.mChar.getWorldPosition (), self.mChar.getSightNode().getWorldPosition ())
self.mExCamera.setTightness (1.0)
if mKeyboard.isKeyDown(OIS.KC_ESCAPE):
return False
return True


class SampleApplication(sf.Application):
def _createScene(self):
sceneManager = self.sceneManager
sceneManager.ambientLight = ogre.ColourValue(1, 1, 1)
self.mCamera = sceneManager.createCamera("PlayerCam")
l = sceneManager.createLight("MainLight")
l.setType(ogre.Light.LT_DIRECTIONAL)
l.setDirection(-0.5, -0.5, 0)
self.mCamera.setPosition (0, 0, 0)
for i in range(30):
razorNode = sceneManager.getRootSceneNode().createChildSceneNode (str(i), ogre.Vector3 (random.randrange(-1000, 1000), 0, random.randrange (-1000, 1000)))
razorEntity = sceneManager.createEntity(str(i), "razor.mesh")
razorNode.attachObject(razorEntity)
the_ogre = OgreCharacter ("Ogre 1", sceneManager)##cannot give a var a module name!! ;)
exCamera = ExtendedCamera ("Extended Camera", sceneManager, self.mCamera)
self.mFrameListener = SampleListener(self.renderWindow, self.mCamera)
self.mFrameListener.setCharacter(the_ogre)##static cast?? Hope it'll work
self.mFrameListener.setExtendedCamera(exCamera)

def destroyScene(self):
pass


def _createFrameListener(self):
self.mFrameListener=SampleListener(self.renderWindow, self.mCamera)##is renderWindow a predefined constant??
self.root.addFrameListener(self.mFrameListener)


if __name__=="__main__":
SampleApplication().go()

SiWi

07-09-2007 09:45:24

Good Work. I´m no PythonOgre expert, but I will take a look at it.

luke14free

07-09-2007 10:33:13

Ok sir, thank you. Maybe we could ask to some Python - Ogre developer, because, after all, is not just an help for me but for all the comunity...

SiWi

08-09-2007 15:25:40

Yeah thats right. I wonder where they are. Normally they are answering every thread. Maybe they just work so hard on the next relelase... :D

luke14free

08-09-2007 20:03:56

I'll be busy for some time, but maybe in one or two week I'll be able to work on it, sir. I am happy because the most of the work has been done yet, now i'we just to correct my own code.
If someone could help please do so, i'd be pleased.
Greetings,
luke

luke14free

09-09-2007 09:11:11

I've tried to add an input manager...Result? the input created is None type...
Here you are the code:

# Generic Character class
import Ogre as ogre
import OIS as ois
import SampleFramework as sf
import random
class Character:##c++ ported
def __init__(self):
self.mMainNode=ogre.SceneNode()
self.mSightNode=ogre.SceneNode()
self.mCameraNode=ogre.SceneNode()
self.mEntity=ogre.Entity()
self.mSceneMgr=ogre.SceneManager()
def getSightNode(self):
return self.mSightNode
def getCameraNode(self):
return self.mCameraNode
def getMainNode(self):
return self.mMainNode.getWorldPosition()


class OgreCharacter:
def __init__ (self,name,SceneManager):
self.mName = name
self.mSceneMgr = SceneManager
self.mMainNode = self.mSceneMgr.getRootSceneNode().createChildSceneNode(self.mName)
self.mSightNode = self.mMainNode.createChildSceneNode (self.mName + "_sight", ogre.Vector3 (0, 0, 100))
self.mCameraNode = self.mMainNode.createChildSceneNode (self.mName + "_camera", ogre.Vector3 (0, 50, -100))
self.mEntity = self.mSceneMgr.createEntity (self.mName, "OgreHead.mesh")
self.mMainNode.attachObject(self.mEntity)
def _OgreCharacter(self):
self.mMainNodedetachAllObjects()
del self.mEntity
self.mMainNode.removeAndDestroyAllChildren()
self.mSceneMgr.destroySceneNode(self.mName)

def update (self,elapsedTime, inputDevice):
if inputDevice.isKeyDown(ois.KC_W):
self.mMainNode.translate (self.mMainNode.getOrientation () * ogre.Vector3 (0, 0, 100 * elapsedTime))
if inputDevice.isKeyDown(ois.KC_S):
self.mMainNode.translate (self.mMainNode.getOrientation () * ogre.Vector3 (0, 0, -50 * elapsedTime))
if inputDevice.isKeyDown(ois.KC_A):
self.mMainNode.yaw(Radian (2 * elapsedTime))
if inputDevice.isKeyDown (ois.KC_D):
self.mMainNode.yaw(Radian (-2 * elapsedTime))

def setVisible(self,visible):
self.mMainNode.setVisible(visible)
class ExtendedCamera:
'''
mTargetNode=ogre.SceneNode()
mCameraNode=ogre.SceneNode()
mCamera=ogre.Camera()
mSceneMgr=ogre.SceneManager()
mName=None#string
mOwnCamera=None#bool
mTightness=None#real'''

def __init__(self,name, SceneManager, Camera= 0):

self.mName = name
self.mSceneMgr = SceneManager
self.mCameraNode = self.mSceneMgr.getRootSceneNode().createChildSceneNode (self.mName)
self.mTargetNode = self.mSceneMgr.getRootSceneNode().createChildSceneNode (self.mName + "_target")
self.mCameraNode.setAutoTracking (True, self.mTargetNode)
self.mCameraNode.setFixedYawAxis (True)
if Camera == 0:
self.mCamera = self.mSceneMgr.createCamera (self.mName)
self.mOwnCamera = True

else:
self.mCamera = Camera
self.mCamera.setPosition(0.0,0.0,0.0)
self.mOwnCamera = False
self.mCameraNode.attachObject (self.mCamera)
self.mTightness = 0.01

def DDExtendedCamera(self):##What does the wave char means? i've replaced it with "_"
self.mCameraNode.detachAllObjects()
if self.mOwnCamera==True:
del self.mCamera
self.mSceneMgr.destroySceneNode (self.mName)
self.mSceneMgr.destroySceneNode (self.mName + "_target")
def setTightness(self,tightness):
self.mTightness = tightness
def getTightness(self):
return self.mTightness
def getCameraPosition(self):
return self.mCameraNode.getPosition()
def instantUpdate (self, cameraPosition, targetPosition):
self.mCameraNode.setPosition(cameraPosition)
self.mTargetNode.setPosition(targetPosition)
def update (self,elapsedTime, cameraPosition, targetPosition):
displacement=(0,0,0)##Is that correct??
displacement=(cameraPosition - self.mCamera.NodegetPosition ()) * self.mTightness
self.mCameraNode=self.mCameraNode.translate (displacement)##Is that correct??

displacement = (targetPosition - self.mTargetNode.getPosition ()) * self.mTightness
self.mTargetNode=self.mCameraNode.translate (displacement)##Is that correct??

class SampleListener(sf.FrameListener):
def __init__(self,win, cam, inp, sc):
ogre.FrameListener.__init__(self)
self.mChar = 0
self.mExCamera = 0
self.mMode = 0
self.inp=inp
def setCharacter(self,character):
self.mChar = character
def setExtendedCamera(self,cam):
self.mExCamera = cam
def frameStarted(self, evt):
mKeyboard=self.inp.capture()
if self.mChar:
self.mChar.update (evt.timeSinceLastFrame, mKeyboard)
if self.mMode==0:
self.mExCamera.update (evt.timeSinceLastFrame, self.mChar.getCameraNode().getWorldPosition(),self.mChar.getSightNode().getWorldPosition())
if self.mMode==1:
self.mExCamera.update (evt.timeSinceLastFrame,ogre.Vector3 (0, 200, 0),self.mChar.getSightNode ().getWorldPosition ())
if self.mMode==2:
self.mExCamera.update (evt.timeSinceLastFrame,self.mChar.getWorldPosition (),self.mChar.getSightNode ().getWorldPosition ())
if mKeyboard.isKeyDown(ois.KC_F1):
mMode = 0
if self.mChar:##if self.mChar what?? if is set self.mChar?? bho!
self.mChar.setVisible(true)
if self.mExCamera:
if self.mChar:
self.mExCamera.instantUpdate (self.mChar.getCameraNode().getWorldPosition(), self.mChar.getSightNode().getWorldPosition ())
self.mExCamera.setTightness (0.01)
if mKeyboard.isKeyDown(ois.KC_F2):
mMode=1
if self.mChar:
self.mChar.setVisible(true)
if self.mExCamera:
if self.mChar:
self.mExCamera.instantUpdate (ogre.Vector3(0, 200, 0), self.mChar.getSightNode().getWorldPosition())
self.mExCamera.setTightness(0.01)
if (mKeyboard.isKeyDown (ois.KC_F3)):
mMode = 2
if self.mChar:
self.mChar.setVisible(false)
if self.mExCamera:
if self.mChar:
self.mExCamera.instantUpdate(self.mChar.getWorldPosition (), self.mChar.getSightNode().getWorldPosition ())
self.mExCamera.setTightness (1.0)
if mKeyboard.isKeyDown(ois.KC_ESCAPE):
return False
return True

class InputManager(ois.KeyListener, ois.MouseListener):
def __init__(self, app, hnd):
ois.KeyListener.__init__(self)
ois.MouseListener.__init__(self)
self.app = SampleApplication
self.input_mgr = ois.createPythonInputSystem([("WINDOW", str(hnd))])

# Setup Unbuffered Keyboard and Buffered Mouse Input
self.keyboard = \
self.input_mgr.createInputObjectKeyboard(ois.OISKeyboard,True)
self.keyboard.setEventCallback(self)
#self.mouse = \
# self.input_mgr.createInputObjectMouse(ois.OISMouse, True)
#self.mouse.setEventCallback(self)

def capture(self):
self.keyboard.capture()
#self.mouse.capture()


def keyPressed(self, evt):
# evt.device is a reference to the device that emitted this signal
# evt.key is an OIS.KeyCode object (e.g. KC_SPACE)
# evt.text appears to be a decimal keycode (e.g. 115)
print "DOWN: %s" % evt.key
self.app.key_down(evt.key)

def keyReleased(self, evt):
print "UP: %s" % evt.key
self.app.key_up(evt.key)

def mouseMoved(self, evt):
return True

def mousePressed(self, evt, button):
print evt, button
return True

def mouseReleased(self, evt, button):
print evt, button
return True

def shutdown(self):
#self.input_mgr.destroyInputObjectMouse(self.mouse)

self.input_mgr.destroyInputObjectKeyboard(self.keyboard)

ois.InputManager.destroyInputSystem(self.input_mgr)

class SampleApplication(sf.Application):
def _createScene(self):
sceneManager = self.sceneManager
sceneManager.ambientLight = ogre.ColourValue(1, 1, 1)
self.window = self.root.createRenderWindow("Woot", 800, 600,False)
self.mCamera = sceneManager.createCamera("PlayerCam")
l = sceneManager.createLight("MainLight")
l.setType(ogre.Light.LT_DIRECTIONAL)
l.setDirection(-0.5, -0.5, 0)
self.mCamera.setPosition (0, 0, 0)
window_hnd = self.window.getCustomAttributeInt("WINDOW")
self.input_manager = InputManager(self, window_hnd)
for i in range(30):
razorNode = sceneManager.getRootSceneNode().createChildSceneNode (str(i), ogre.Vector3 (random.randrange(-1000, 1000), 0, random.randrange (-1000, 1000)))
razorEntity = sceneManager.createEntity(str(i), "razor.mesh")
razorNode.attachObject(razorEntity)
the_ogre = OgreCharacter ("Ogre 1", sceneManager)##cannot give a var a module name!! ;)
exCamera = ExtendedCamera ("Extended Camera", sceneManager, self.mCamera)
self.mFrameListener = SampleListener(self.renderWindow, self.mCamera, self.input_manager, self.sceneManager)
self.mFrameListener.setCharacter(the_ogre)##static cast?? Hope it'll work
self.mFrameListener.setExtendedCamera(exCamera)

def destroyScene(self):
pass

def key_down(self, key):
if key == ois.KC_LEFT:
self.ninja.start_spinning(-1)
elif key == ois.KC_RIGHT:
self.ninja.start_spinning(1)
def key_up(self, key):
if key == ois.KC_LEFT:
self.ninja.stop_spinning()
elif key == ois.KC_RIGHT:
self.ninja.stop_spinning()
elif key == ois.KC_ESCAPE:
self.window.destroy()
def _createFrameListener(self):
window_hnd = self.window.getCustomAttributeInt("WINDOW")
self.input_manager = InputManager(self, window_hnd)
#self.mFrameListener=SampleListener(self.renderWindow, self.mCamera, self.input_manager, self.sceneManager)##is renderWindow a predefined constant??
self.root.addFrameListener(self.mFrameListener)


if __name__=="__main__":
SampleApplication().go()

dermont

09-09-2007 09:33:45

From your original post(s) the reason your scenenode is not visualized in the screen is that createSceneNode does not add the SceneNode to the scene hierarchy:

http://www.ogre3d.org/docs/api/html/cla ... nager.html

You need to do that yourself:

self.sceneManager.getRootSceneNode().addChild(hn)

dermont

09-09-2007 09:36:54

This is a version of the wiki entry I had lying about. It may help but probably needs some corrections / tweaking.

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

## -------------------------
## Generic Character class
## -----------------------
class Character(object):
def __init__(self, sceneManager):

self.sceneManager = sceneManager
self.mMainNode = None ## Main character node
self.mSightNode = None ## Sight node - The character is supposed to be looking here
self.mCameraNode = None ## Node for the chase camera
self.mEntity = None ## Character entity

def update (elapsedTime, Keyboard):
pass

def getSightNode(self):
return self.mSightNode

def getCameraNode(self):
return self.mCameraNode

def getWorldPosition(self):
return self.mMainNode.getWorldPosition()


## --------------------------------------------------------
## Specialization of the Character class - Our dear Ogre :D
## --------------------------------------------------------
class OgreCharacter(Character):
def __init__(self, name, sceneManager):
Character.__init__(self, sceneManager)

self.mName = name

## Setup basic node structure to handle 3rd person cameras
self.mMainNode = self.sceneManager.getRootSceneNode ().createChildSceneNode(name)
self.mSightNode = self.mMainNode.createChildSceneNode (name + "_sight", ogre.Vector3 (0, 0, 100))
self.mCameraNode = self.mMainNode.createChildSceneNode(name + "_camera", ogre.Vector3 (0, 50, -100))
## Give this character a shape :)
self.mEntity = self.sceneManager.createEntity(name, "ogrehead.mesh")
self.mMainNode.attachObject(self.mEntity)

def __del__(self):
print "Deleting Ogre Character"
self.mMainNode.detachAllObjects()
self.sceneManager.destroyEntity(self.mEntity)
del self.mEntity
self.mMainNode.removeAndDestroyAllChildren()
self.sceneManager.destroySceneNode(self.mName)
print "Deleted Ogre Character"

def update(self, elapsedTime, Keyboard):

## Handle movement
if (Keyboard.isKeyDown(OIS.KC_W)):
self.mMainNode.translate(self.mMainNode.getOrientation() * ogre.Vector3 (0, 0, 100 * elapsedTime))

if (Keyboard.isKeyDown(OIS.KC_S)):
self.mMainNode.translate( self.mMainNode.getOrientation() * ogre.Vector3 (0, 0, -50 * elapsedTime))
if (Keyboard.isKeyDown(OIS.KC_A)):
self.mMainNode.yaw(ogre.Radian(2 * elapsedTime))
if (Keyboard.isKeyDown (OIS.KC_D)):
self.mMainNode.yaw(ogre.Radian (-2 * elapsedTime))

def setVisible(self, visible):
self.mMainNode.setVisible(visible)


## --------------------------------------------------------
## Our extended camera class
## --------------------------------------------------------
class ExtendedCamera(object):

def __init__(self, name, sceneManager, camera = None):

self.mTargetNode = None ## camera target node
self.mCameraNode = None ## camera node

self.mSceneMgr = sceneManager
self.mCamera = None
self.mName = name

self.mOwnCamera = False ## Camera binding created outside or inside of this class
self.mTightness = 0.01 ## Camera Movement none(0) tight (1)

## Create the camera's node structure
self.mCameraNode = self.mSceneMgr.getRootSceneNode().createChildSceneNode(name)
self.mTargetNode = self.mSceneMgr.getRootSceneNode().createChildSceneNode(name + "_target")

## The camera will always look at the camera target
self.mCameraNode.setAutoTracking(True, self.mTargetNode)
## Needed because of auto tracking
self.mCameraNode.setFixedYawAxis(True)

##Create our camera if it wasn't passed as a parameter
if (camera is None):
self.mCamera = self.mSceneMgr.createCamera(name)
self.mOwnCamera = True
else:
self.mCamera = camera
## just to make sure that mCamera is set to 'origin'
## (same position as the mCameraNode)
self.mCamera.setPosition(0.0,0.0,0.0)
self.mOwnCamera = False

## attach Ogre camera to the camera node
self.mCameraNode.attachObject(self.mCamera)


def __del__(self):
print "Deleting Extended Camera"
self.mCameraNode.detachAllObjects()
if (self.mOwnCamera):
del self.mCamera
self.mSceneMgr.destroySceneNode(self.mName)
self.mSceneMgr.destroySceneNode (self.mName + "_target")
print "Deleted Extended Camera"


def setTightness(self, tightness):
self.mTightness = tightness

def getTightness(self):
return self.mTightness

def getCameraPosition(self):
return self.mCameraNode.getPosition()

def instantUpdate (self, cameraPosition, targetPosition):
self.mCameraNode.setPosition(cameraPosition)
self.mTargetNode.setPosition(targetPosition)

def update(self, elapsedTime, cameraPosition, targetPosition):
## Handle movement
displacement = (cameraPosition - self.mCameraNode.getPosition ()) * self.mTightness
self.mCameraNode.translate(displacement)
displacement = (targetPosition - self.mTargetNode.getPosition ()) * self.mTightness
self.mTargetNode.translate (displacement)


## -------------
## FrameListener
## -------------
class TutorialFrameListener(sf.FrameListener):
def __init__(self, renderWindow, camera):
sf.FrameListener.__init__(self, renderWindow, camera)

## Camera mode
## (0) 1st person
## (1) 3rd person (chasing)
## (2) 3rd person (fixed)
self.mMode = 0

def setCharacter(self, character):
self.mChar = character

def setExtendedCamera (self, cam):
self.mExCamera = cam

def setVisibility(self, visible):
if (not self.mChar is None):
self.mChar.setVisible(visible)

def instantUpdate(self, mode, tightness):

if (not self.mExCamera is None):
if (not self.mChar is None):
if mode==0:
cameraPosition = self.mChar.getCameraNode().getWorldPosition()
targetPosition = self.mChar.getSightNode().getWorldPosition()
if mode==1:
cameraPosition = ogre.Vector3 (0, 200, 0)
targetPosition = self.mChar.getSightNode().getWorldPosition()
if mode==2:
cameraPosition = self.mChar.getWorldPosition()
targetPosition = self.mChar.getSightNode().getWorldPosition()

self.mExCamera.instantUpdate(cameraPosition, targetPosition)
self.mExCamera.setTightness(tightness)


def frameStarted(self, evt):

if(self.renderWindow.isClosed()):
return False

self.Keyboard.capture()
self.Mouse.capture()

if (not self.mChar is None):
self.mChar.update (evt.timeSinceLastFrame, self.Keyboard)

if (not self.mExCamera is None):
if self.mMode==0:
##3rd person chase
self.mExCamera.update( evt.timeSinceLastFrame,
ogre.Vector3 (0, 200, 0),
self.mChar.getSightNode().getWorldPosition())
## 3rd person fixed
if self.mMode==1:
self.mExCamera.update( evt.timeSinceLastFrame,
self.mChar.getCameraNode().getWorldPosition(),
self.mChar.getSightNode().getWorldPosition())
## 1st person
if self.mMode==2:
self.mExCamera.update( evt.timeSinceLastFrame,
self.mChar.getWorldPosition(),
self.mChar.getSightNode().getWorldPosition())
## 3rd Person - Chase Camera
if (self.Keyboard.isKeyDown(OIS.KC_F1)):
self.mMode = 0
self.setVisibility(True)
self.instantUpdate(self.mMode, 0.01)

## 3rd Person - Fixed Camera
if (self.Keyboard.isKeyDown(OIS.KC_F2)):
self.mMode = 1
self.setVisibility(True)
self.instantUpdate(self.mMode, 0.01)

## 1st Person
if (self.Keyboard.isKeyDown(OIS.KC_F3)):
self.mMode = 2
self.setVisibility(False)
self.instantUpdate(self.mMode, 0.01)

## Exit if we press Esc
if(self.Keyboard.isKeyDown(OIS.KC_ESCAPE)):
return False
return True

class TutorialApplication(sf.Application):

def __init__(self):
sf.Application.__init__(self)
self.ogreCharacter = None
self.exCamera = None

def _createScene(self):
sceneManager = self.sceneManager

## Set ambient light
sceneManager.setAmbientLight(ogre.ColourValue(0.2, 0.2, 0.2))

## LIGHTS!!
## Create a point light
l = sceneManager.createLight("MainLight")
l.setType(ogre.Light.LT_DIRECTIONAL)
l.setDirection(-0.5, -0.5, 0)

## CAMERA!!
## Required or else the camera will have an offset
self.camera.setPosition(0, 0, 0)

## ACTION!!!
## Fill the scene with some razors
for i in range(30):
razorNode = sceneManager.getRootSceneNode().createChildSceneNode (str(i), ogre.Vector3(ogre.Math.RangeRandom(-1000, 1000), 0, ogre.Math.RangeRandom(-1000, 1000)))
razorEntity = sceneManager.createEntity(str(i), "razor.mesh")
razorNode.attachObject(razorEntity)

## Main character
ogreCharacter = OgreCharacter("Ogre", self.sceneManager)
exCamera = ExtendedCamera("Extended Camera", self.sceneManager, self.camera)

## Frame listener to manage both character and camera updating and
## different camera modes. Need to create it here as we want to change
## some parameters here, thus avoiding defining ogre and exCamera as
## member variables
self.frameListener = TutorialFrameListener(self.renderWindow, self.camera)
self.frameListener.setCharacter(ogreCharacter)
self.frameListener.setExtendedCamera(exCamera)


def _createFrameListener(self):
self.root.addFrameListener(self.frameListener)

if __name__ == '__main__':
try:
ta = TutorialApplication()
ta.go()
except ogre.OgreException, e:
print e

luke14free

09-09-2007 21:10:07

Thank you.
Yours,
Luke