nasirus1983
01-01-2009 20:06:24
Hi,
I've problem with my ogre mesh and created body. Problem is that my mesh is in middle of cube, capsule etc of body. Look what I mean on attached picture.
I'm creating the body and entity using those two functions:
void MyCharacter::createCharacter()
{
static const Ogre::Real mesh_scale = 1;
mEntity = mSceneMgr->createEntity(ENTITY_NAME, MESH_NAME);
mSceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(NODE_NAME);
mSceneNode->attachObject(mEntity);
mSceneNode->scale(Vector3::UNIT_SCALE * mesh_scale);
mSceneNode->setPosition(Vector3(0,-20,0));
createPhysicCharacter();
}
void MyCharacter::createPhysicCharacter()
{
static const Ogre::Real physics_scale = 0.2;
nrp.setToDefault();
nrp.mIdentifierUsage = NxOgre::NodeRenderableParams::IU_Use;
nrp.mIdentifier = mSceneNode->getName();
actorParams.setToDefault();
actorParams.mMass = 80;
actorParams.mLinearVelocity.set(0,0,0);
//myCharacterBody = mNxScene->createBody<Body>(BODY_NAME, new NxOgre::Cube(1,20,1), Ogre::Vector3::ZERO, nrp, actorParams);
myCharacterBody = mNxScene->createBody<Body>(BODY_NAME, new NxOgre::Cube(physics_scale), mSceneNode->getPosition(), nrp, actorParams);
In 3ds Max before exporting I'm making box position trick, to reset orientation matrix.
Please help.
betajaen
01-01-2009 20:15:53
Hmm, your node stuff looks right. There isn't any NxOgre code, but I assume you didn't change the localPose in the shapeParams.
Perhaps you can "reset" it using MeshMagick.
nasirus1983
01-01-2009 20:19:20
My character class is:
#include <Ogre.h>
#include <NxOgre.h>
#include <MyCharacter.h>
using namespace Ogre;
using namespace NxOgre;
#define MESH_NAME "Human.mesh"
#define ENTITY_NAME "MyMesh_Entity"
#define NODE_NAME "MyMesh_node"
#define BODY_NAME "MyMesh_body"
MyCharacter::MyCharacter(RenderWindow *win, Camera* cam, SceneManager* sceneMgr, World* nxWorld, Scene* nxScene) : OgreBaseListener(win, cam, sceneMgr, nxWorld, nxScene)
{
mSceneMgr = sceneMgr;
mNxScene = nxScene;
mNxWordl = nxWorld;
mRotX = 0;
mRotY = 0;
}
MyCharacter::~MyCharacter(){}
void MyCharacter::createCharacter()
{
static const Ogre::Real mesh_scale = 1;
mEntity = mSceneMgr->createEntity(ENTITY_NAME, MESH_NAME);
mSceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(NODE_NAME);
mSceneNode->attachObject(mEntity);
mSceneNode->scale(Vector3::UNIT_SCALE * mesh_scale);
mSceneNode->setPosition(Vector3(0,20,0));
//mSceneNode->yaw(Degree(-45.0));
//mSceneNode->lookAt(Vector3(0,0,-100),Ogre::Node::TS_LOCAL,Vector3::NEGATIVE_UNIT_Z);
createPhysicCharacter();
}
void MyCharacter::createPhysicCharacter()
{
static const Ogre::Real physics_scale = 0.2;
nrp.setToDefault();
nrp.mIdentifierUsage = NxOgre::NodeRenderableParams::IU_Use;
nrp.mIdentifier = mSceneNode->getName();
actorParams.setToDefault();
actorParams.mMass = 80;
actorParams.mLinearVelocity.set(0,0,0);
myCharacterBody = mNxScene->createBody<Body>(BODY_NAME, new NxOgre::Capsule(1,1), mSceneNode->getPosition(), nrp, actorParams);
}
Entity* MyCharacter::getEntity()
{
return mEntity;
}
Actor* MyCharacter::getActor()
{
return myCharacterBody;
}
void MyCharacter::moveCharacter(Vector3 vec)
{
}
void MyCharacter::rotCharacter()
{
//int mRotXT = myCharacterBody->getGlobalPositionAsOgreVector3().x;
//int mRotYT = myCharacterBody->getGlobalPositionAsOgreVector3().y;
//mRotX = Degree(-mRotXT * 0.13);
//mRotY = Degree(-mRotYT * 0.13);
}
bool MyCharacter::frameStarted(const FrameEvent& evt)
{
if(mMouse)
mMouse->capture();
if(mKeyboardB)
mKeyboardB->capture();
Quaternion quat = myCharacterBody->getGlobalOrientationAsOgreQuaternion();
Vector3 x = quat.xAxis();
Vector3 y = quat.yAxis();
Vector3 z = quat.zAxis();
myCharacterBody->setGlobalOrientation(Quaternion(x, Vector3::UNIT_Y,z));
myCharacterBody->setAngularVelocity(Vector3(0,0,0));
return true;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool MyCharacter::processUnbufferedKeyInput(const FrameEvent& evt)
{
Radian mRotXT;
Radian mRotYT;
mRotXT = 0;
if (mKeyboard->isKeyDown(OIS::KC_A))
{
mSceneNode->yaw(Degree(0.2));
myCharacterBody->setGlobalOrientation(mSceneNode->getOrientation());
}
if (mKeyboard->isKeyDown(OIS::KC_D))
{
mSceneNode->yaw(Degree(-0.2));
myCharacterBody->setGlobalOrientation(mSceneNode->getOrientation());
}
if (mKeyboard->isKeyDown(OIS::KC_W))
{
Vector3 direction = Vector3(0, 0, -0.01);
Vector3 moveVector = mSceneNode->getOrientation() * direction;
mSceneNode->translate(moveVector);
myCharacterBody->setGlobalPosition(mSceneNode->getPosition());
}
if (mKeyboard->isKeyDown(OIS::KC_S))
{
/*Vector3 vecS = myCharacterBody->getGlobalPositionAsOgreVector3();
vecS.z += 0.01;
myCharacterBody->setGlobalPosition(vecS);
myCharacterBody->setGlobalOrientation(mSceneNode->getOrientation());*/
Vector3 direction = Vector3(0, 0, 0.01);
Vector3 moveVector = mSceneNode->getOrientation() * direction;
mSceneNode->translate(moveVector);
//myCharacterBody->setGlobalOrientation(mSceneNode->getOrientation());
myCharacterBody->setGlobalPosition(mSceneNode->getPosition());
}
if (mKeyboard->isKeyDown(OIS::KC_Q))
{
Vector3 vecA = myCharacterBody->getGlobalPositionAsOgreVector3();
vecA.x -= 0.01;
myCharacterBody->setGlobalPosition(vecA);
myCharacterBody->setGlobalOrientation(mSceneNode->getOrientation());
}
if (mKeyboard->isKeyDown(OIS::KC_E))
{
Vector3 vecD = myCharacterBody->getGlobalPositionAsOgreVector3();
vecD.x += 0.01;
myCharacterBody->setGlobalPosition(vecD);
myCharacterBody->setGlobalOrientation(mSceneNode->getOrientation());
}
if(mKeyboard->isKeyDown(OIS::KC_LEFT))
mTranslateVector.x = -mMoveScale; // Move camera left
if(mKeyboard->isKeyDown(OIS::KC_RIGHT))
mTranslateVector.x = mMoveScale; // Move camera RIGHT
if(mKeyboard->isKeyDown(OIS::KC_UP))
mTranslateVector.z = -mMoveScale; // Move camera forward
if(mKeyboard->isKeyDown(OIS::KC_DOWN))
mTranslateVector.z = mMoveScale; // Move camera backward
if(mKeyboard->isKeyDown(OIS::KC_PGUP))
mTranslateVector.y = mMoveScale; // Move camera up
if(mKeyboard->isKeyDown(OIS::KC_PGDOWN))
mTranslateVector.y = -mMoveScale; // Move camera down
if(mKeyboard->isKeyDown(OIS::KC_RIGHT))
mCamera->yaw(-mRotScale);
if(mKeyboard->isKeyDown(OIS::KC_LEFT))
mCamera->yaw(mRotScale);
if( mKeyboard->isKeyDown(OIS::KC_ESCAPE))
return false;
if( mKeyboard->isKeyDown(OIS::KC_F) && mTimeUntilNextToggle <= 0 )
{
mStatsOn = !mStatsOn;
showDebugOverlay(mStatsOn);
mTimeUntilNextToggle = 1;
}
if( mKeyboard->isKeyDown(OIS::KC_T) && mTimeUntilNextToggle <= 0 )
{
switch(mFiltering)
{
case TFO_BILINEAR:
mFiltering = TFO_TRILINEAR;
mAniso = 1;
break;
case TFO_TRILINEAR:
mFiltering = TFO_ANISOTROPIC;
mAniso = 8;
break;
case TFO_ANISOTROPIC:
mFiltering = TFO_BILINEAR;
mAniso = 1;
break;
default: break;
}
MaterialManager::getSingleton().setDefaultTextureFiltering(mFiltering);
MaterialManager::getSingleton().setDefaultAnisotropy(mAniso);
showDebugOverlay(mStatsOn);
mTimeUntilNextToggle = 1;
}
if(mKeyboard->isKeyDown(OIS::KC_SYSRQ) && mTimeUntilNextToggle <= 0)
{
std::ostringstream ss;
ss << "screenshot_" << ++mNumScreenShots << ".png";
mWindow->writeContentsToFile(ss.str());
mTimeUntilNextToggle = 0.5;
mDebugText = "Saved: " + ss.str();
}
if(mKeyboard->isKeyDown(OIS::KC_R) && mTimeUntilNextToggle <=0)
{
mSceneDetailIndex = (mSceneDetailIndex+1)%3 ;
switch(mSceneDetailIndex) {
case 0 : mCamera->setPolygonMode(PM_SOLID); break;
case 1 : mCamera->setPolygonMode(PM_WIREFRAME); break;
case 2 : mCamera->setPolygonMode(PM_POINTS); break;
}
mTimeUntilNextToggle = 0.5;
}
static bool displayCameraDetails = false;
if(mKeyboard->isKeyDown(OIS::KC_P) && mTimeUntilNextToggle <= 0)
{
displayCameraDetails = !displayCameraDetails;
mTimeUntilNextToggle = 0.5;
if (!displayCameraDetails)
mDebugText = "";
}
if(displayCameraDetails)
mDebugText = "P: " + StringConverter::toString(mCamera->getDerivedPosition()) +
" " + "O: " + StringConverter::toString(mCamera->getDerivedOrientation());
return true;
}
bool MyCharacter::keyPressed(const OIS::KeyEvent& evt)
{
switch(evt.key)
{
case OIS::KC_SPACE:
myCharacterBody->addForce(Vector3(0,10,0), NxForceMode::NX_SMOOTH_VELOCITY_CHANGE);
break;
}
return true;
}
bool MyCharacter::keyReleased(const OIS::KeyEvent &evt)
{
switch(evt.key)
{
case OIS::KC_SPACE:
myCharacterBody->addForce(Vector3(0,-10,0));
break;
}
return true;
}
And functions creating physics:
void OgreApp::createPhysicWorld()
{
PhysXParams params;
params.mTimeController = PhysXParams::TC_OGRE;
params.mUseLog = true;
mNxWorld = new World(params);
if(DEBUG_REMOTE_RENDERER)
mNxWorld->getPhysXDriver()->createDebuggerConnection();
if(DEBUG_RENDERER)
mNxWorld->createDebugRenderer(mSceneMgr);
}
void OgreApp::createPhysicScene()
{
SceneParams params;
params.mRenderer = SceneParams::RN_OGRE;
params.mGravity.set(0, -9.8, 0);
params.mFloor = true;
if(mNxWorld)
mNxScene = mNxWorld->createScene("NxScene_1", params);
}
betajaen
01-01-2009 20:42:06
Yep. Your mesh isn't centered.
nasirus1983
01-01-2009 21:14:30
Could you tell me what is wrong or what I should to do ?
- NxOgre and Ogre are still new things for me.
betajaen
01-01-2009 21:39:42
It's not Ogre or NxOgre. It's your mesh, you haven't centered it properly. You can use your modeller, or use the MeshMagick command line application correctly center it.
nasirus1983
01-01-2009 22:20:08
Thanx,
I've used MeshMagick and it helped me. If anyone have the same problem I give the command I've used:
>> MeshMagick.exe transform -xalign=center human.mesh
>> MeshMagick.exe transform -yalign=center human.mesh
>> MeshMagick.exe transform -zalign=center human.mesh