Posted: Wed Dec 23, 2009 10:18 am
I don't have any code for fluid physics at all... sio2 did that on his own and didn't share the source code...
Official forum of the Irrlicht Engine
https://irrlicht.sourceforge.io/forum/
Code: Select all
//
//character controller player class
//
class CPlayer
{
public:
CPlayer(
CCharacterManager * charManager,
IPhysxManager * physxManager,
ICameraSceneNode * playerCamera,
vector3df position,
NxReal r,
NxReal h)
: m_cManager(charManager), m_pManager(physxManager), m_Camera(playerCamera), m_radius(r), m_height(h)
{
//init character physics
m_bPushCharacter = false;
m_DefaultGravity = NxVec3(0, G, 0);
m_CharacterVec = NxVec3(0,0,0);
m_fCharacterSpeed = 20;
m_bJump = false;
//create character
m_charCapsuleController =
new MyCharacterController(
charManager->getManager(),
physxManager->getScene(),
NxVec3(position.X, position.Y, position.Z),
r, h);
}
~CPlayer()
{
if(m_charCapsuleController)
NX_DELETE_SINGLE(m_charCapsuleController);
}
void StartJump(NxF32 v0)
{
if (m_bJump) return;
m_fJumpTime = 0.0f;
m_V0 = v0;
m_bJump = true;
}
void StopJump()
{
m_bJump = false;
}
void UpdateCharacter(NxReal deltaTime)
{
NxVec3 disp = m_DefaultGravity;
//camera & character sync
m_cameraTarget = m_Camera->getTarget() - m_Camera->getPosition();
m_cameraTarget.normalize();
if (m_bPushCharacter)
{
NxVec3 horizontalDisp = m_CharacterVec;
horizontalDisp.y = 0.0f;
horizontalDisp.normalize();
disp += horizontalDisp * m_fCharacterSpeed;
}
disp *= deltaTime;
NxF32 height = GetHeight(deltaTime); // compute height(Y) in jumping
if (height != 0.0f)
{
disp.y += height;
}
NxU32 collisionFlags;
m_charCapsuleController->Move(disp, collisionFlags);
if (collisionFlags & NXCC_COLLISION_DOWN)
StopJump();
m_cManager->getManager()->updateControllers();
//update camera position
NxExtendedVec3 pos = m_charCapsuleController->GetCharacterPos();
m_Camera->setPosition(vector3df(pos.x, pos.y + m_height, pos.z));
}
void PushCharacter(bool bPush)
{
m_bPushCharacter = bPush;
}
void moveForward()
{
m_CharacterVec = NxVec3(m_cameraTarget.X, m_cameraTarget.Y, m_cameraTarget.Z);
}
void moveBackward()
{
m_CharacterVec = NxVec3(m_cameraTarget.X, m_cameraTarget.Y, m_cameraTarget.Z);
m_CharacterVec = -m_CharacterVec;
}
void moveRight()
{
//???
}
void moveLeft()
{
//???
}
void setSpeed(NxReal newSpeed)
{
m_fCharacterSpeed = newSpeed;
}
private:
vector3df m_cameraTarget;
bool m_bPushCharacter;
NxVec3 m_DefaultGravity;
NxF32 m_V0;
NxVec3 m_CharacterVec;
NxF32 m_fJumpTime;
NxF32 m_fCharacterSpeed;
bool m_bJump;
NxReal m_radius;
NxReal m_height;
CCharacterManager * m_cManager;
IPhysxManager * m_pManager;
MyCharacterController * m_charCapsuleController;
ICameraSceneNode * m_Camera;
private:
NxF32 GetHeight(NxF32 elapsedTime)
{
if (!m_bJump) return 0.0f;
NxF32 Vt = m_V0 + G*m_fJumpTime; // Vt = Vo + GT
m_fJumpTime += elapsedTime;
return Vt*elapsedTime + 1/2*G*elapsedTime*elapsedTime; // S = VtT + 1/2GT^2
}
};
Code: Select all
// Preload our texture animators
c8 tmp[64]; sprintf_s
for (s32 i = 1 ; i <= 10 ; ++i) {
sprintf_s(tmp, "../media/explosion/%02d.jpg", i);
explosionTextures.push_back(smgr->getVideoDriver()->getTexture(tmp));
}
for (s32 i = 1 ; i <= 6 ; ++i) {
sprintf_s(tmp, "../media/impact/%02d.jpg", i);
impactTextures.push_back(smgr->getVideoDriver()->getTexture(tmp));
}
Code: Select all
c8 tmp[64]; sprintf_s
for..
Code: Select all
//
//character controller player class
//
class CPlayer
{
public:
CPlayer(
CCharacterManager * charManager,
IPhysxManager * physxManager,
ICameraSceneNode * playerCamera,
vector3df position,
NxReal r,
NxReal h)
: m_cManager(charManager), m_pManager(physxManager), m_Camera(playerCamera), m_radius(r), m_height(h)
{
//init character physics
m_bPushCharacter = false;
m_DefaultGravity = NxVec3(0, G, 0);
m_CharacterVec = NxVec3(0,0,0);
m_fCharacterSpeed = 20;
m_bJump = false;
//create character
m_charCapsuleController =
new MyCharacterController(
charManager->getManager(),
physxManager->getScene(),
NxVec3(position.X, position.Y, position.Z),
r, h);
}
~CPlayer()
{
if(m_charCapsuleController)
NX_DELETE_SINGLE(m_charCapsuleController);
}
void StartJump(NxF32 v0)
{
if (m_bJump) return;
m_fJumpTime = 0.0f;
m_V0 = v0;
m_bJump = true;
}
void StopJump()
{
m_bJump = false;
}
void UpdateCharacter(NxReal deltaTime)
{
NxVec3 disp = m_DefaultGravity;
//camera & character sync
m_cameraTarget = m_Camera->getTarget() - m_Camera->getPosition();
m_cameraTarget.normalize();
if (m_bPushCharacter)
{
NxVec3 horizontalDisp = m_CharacterVec;
horizontalDisp.y = 0.0f;
horizontalDisp.normalize();
disp += horizontalDisp * m_fCharacterSpeed;
}
disp *= deltaTime;
NxF32 height = GetHeight(deltaTime); // compute height(Y) in jumping
if (height != 0.0f)
{
disp.y += height;
}
NxU32 collisionFlags;
m_charCapsuleController->Move(disp, collisionFlags);
if (collisionFlags & NXCC_COLLISION_DOWN)
StopJump();
m_cManager->getManager()->updateControllers();
//update camera position
NxExtendedVec3 pos = m_charCapsuleController->GetCharacterPos();
m_Camera->setPosition(vector3df(pos.x, pos.y + m_height, pos.z));
}
void PushCharacter(bool bPush)
{
m_bPushCharacter = bPush;
}
void moveForward()
{
m_CharacterVec = NxVec3(m_cameraTarget.X, m_cameraTarget.Y, m_cameraTarget.Z);
}
void moveBackward()
{
m_CharacterVec = NxVec3(m_cameraTarget.X, m_cameraTarget.Y, m_cameraTarget.Z);
m_CharacterVec = -m_CharacterVec;
}
void moveRight()
{
//???
}
void moveLeft()
{
//???
}
void setSpeed(NxReal newSpeed)
{
m_fCharacterSpeed = newSpeed;
}
private:
vector3df m_cameraTarget;
bool m_bPushCharacter;
NxVec3 m_DefaultGravity;
NxF32 m_V0;
NxVec3 m_CharacterVec;
NxF32 m_fJumpTime;
NxF32 m_fCharacterSpeed;
bool m_bJump;
NxReal m_radius;
NxReal m_height;
CCharacterManager * m_cManager;
IPhysxManager * m_pManager;
MyCharacterController * m_charCapsuleController;
ICameraSceneNode * m_Camera;
private:
NxF32 GetHeight(NxF32 elapsedTime)
{
if (!m_bJump) return 0.0f;
NxF32 Vt = m_V0 + G*m_fJumpTime; // Vt = Vo + GT
m_fJumpTime += elapsedTime;
return Vt*elapsedTime + 1/2*G*elapsedTime*elapsedTime; // S = VtT + 1/2GT^2
}
};
Code: Select all
void moveForward()
{
m_CharacterVec = NxVec3(m_cameraTarget.X, m_cameraTarget.Y, m_cameraTarget.Z);
}
void moveBackward()
{
m_CharacterVec = NxVec3(m_cameraTarget.X, m_cameraTarget.Y, m_cameraTarget.Z);
m_CharacterVec = -m_CharacterVec;
}
void moveRight()
{
m_CharacterVec = NxVec3(m_cameraTarget.X, m_cameraTarget.Y, m_cameraTarget.Z);
m_CharacterVec = m_CharacterVec.rotateXZBy(90);
//i think this is the right way may be -90
}
void moveLeft()
{
m_CharacterVec = NxVec3(m_cameraTarget.X, m_cameraTarget.Y, m_cameraTarget.Z);
m_CharacterVec = m_CharacterVec.rotateXZBy(-90);
//once again this may be the wrong direction try opposite if its wrong
}
Code: Select all
void moveForward()
{
m_CharacterVec = m_cameraTarget;
}
void moveBackward()
{
m_CharacterVec = m_cameraTarget;
m_CharacterVec = -m_CharacterVec;
}
void moveRight()
{
/// Wrong !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// nothing happen
m_CharacterVec = m_cameraTarget;
m_CharacterVec.rotateXZBy(90, m_CharacterVec);
}
void moveLeft()
{
//???
}