Ogre Mesh + body - collision model (solved)

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