Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Bullet, DynamicCharacterController

Bullet, DynamicCharacterController

Поделиться

Страницы: 1 2 Следующая

ENGineПостоялецwww19 авг. 201418:20#0
Парни, столкнулся вот с такой проблемой:

Есть Буллетовский класс:

class btCharacterControllerInterface : public btActionInterface
{
public:
  btCharacterControllerInterface () {};
  virtual ~btCharacterControllerInterface () {};
  
  virtual void  setWalkDirection(const btVector3& walkDirection) = 0;
  virtual void  setVelocityForTimeInterval(const btVector3& velocity, btScalar timeInterval) = 0;
  virtual void  reset ( btCollisionWorld* collisionWorld ) = 0;
  virtual void  warp (const btVector3& origin) = 0;

  virtual void  preStep ( btCollisionWorld* collisionWorld) = 0;
  virtual void  playerStep (btCollisionWorld* collisionWorld, btScalar dt) = 0;
  virtual bool  canJump () const = 0;
  virtual void  jump () = 0;

  virtual bool  onGround () const = 0;
  virtual void  setUpInterpolate (bool value) = 0;
};

Я делаю следующее (для упрощения убрал всю реализацию):

class DynamicCharacterController : public btCharacterControllerInterface
{
public:
  DynamicCharacterController ();
  ~DynamicCharacterController ();
  
   void  setWalkDirection(const btVector3& walkDirection);
  void  setVelocityForTimeInterval(const btVector3& velocity, btScalar timeInterval) ;
   void  reset ( btCollisionWorld* collisionWorld ) ;
  void  warp (const btVector3& origin) ;
   void  preStep ( btCollisionWorld* collisionWorld) ;
   void  playerStep (btCollisionWorld* collisionWorld, btScalar dt);
  bool  canJump () const ;
   void  jump () ;
  
  bool  onGround () const ;
   void  setUpInterpolate (bool value) ;
};

DynamicCharacterController::DynamicCharacterController ()
{
  
}

DynamicCharacterController::~DynamicCharacterController ()
{
}

void  DynamicCharacterController::setWalkDirection(const btVector3& walkDirection) {
  
}
void  DynamicCharacterController::setVelocityForTimeInterval(const btVector3& velocity, btScalar timeInterval) {
  
}
void  DynamicCharacterController::reset ( btCollisionWorld* collisionWorld ) {
  
}
void  DynamicCharacterController::warp (const btVector3& origin) {
  
}

void  DynamicCharacterController::preStep ( btCollisionWorld* collisionWorld) {
  
}
void  DynamicCharacterController::playerStep (btCollisionWorld* collisionWorld, btScalar dt){
  
}
bool  DynamicCharacterController::canJump () const {
  return true;
}
void  DynamicCharacterController::jump () {
  
}

bool  DynamicCharacterController::onGround () const {
  return true;
}
void  DynamicCharacterController::setUpInterpolate (bool value) {
  
}

Дальше пытаюсь создать экземпляр:

DynamicCharacterController* m_character = new DynamicCharacterController ();

Но получаю вот такую ошибку:
Allocating an object of abstract class type 'DynamicCharacterController'

mdkПостоялецwww19 авг. 201419:11#1
ENGine
не переопределил методы из класса btActionInterface ?
  virtual void updateAction( btCollisionWorld* collisionWorld, btScalar deltaTimeStep)=0;
  virtual void debugDraw(btIDebugDraw* debugDrawer) = 0;
ENGineПостоялецwww20 авг. 201410:06#2
Спасибо, после переопределения этих методов все заработало!
MisanthropeПостоялецwww1 авг. 201712:48#3
спрошу тут, что бы не плодить темы.
почему метод getLinearVelocity() у rigidBody возвращает иногда какие-то странные числа, если тело стоит на месте.
к примеру если брать значение каждый кадр, то какртина примерно такая:
btVector3(0, 0, 0)
btVector3(0, 0, 0)
btVector3(0, 0, 0)
btVector3(0, 360, 0)
btVector3(0, 0, 0)
btVector3(0, 0, 0)
btVector3(0, 0, 0)
btVector3(0, 355, 0)
btVector3(0, 0, 0)

складывается впечатление, что тело на самом деле не статично и слегка подпрыгивает, и видимо в такие моменты  у него  Velocity не ноль.
я угадал? Это можно пофиксить?

DimichПостоялецwww1 авг. 201715:07#4
Misanthrope
> Это можно пофиксить?
Написать свой солвер) А если серьёзно, делать апдейт физики несколько раз за кадр.
DimichПостоялецwww1 авг. 201715:10#5
А зачем тебе велосити?
MisanthropeПостоялецwww1 авг. 201715:11#6
Dimich
> делать апдейт физики несколько раз за кадр
а зачем? O_o
Попробую конечно, но чота я думал, что для физики можно апдейты реже делать, как раз таки.
Ну там обычно когда FPS 60 то для физики хватает 24.
DimichПостоялецwww1 авг. 201715:12#7
Misanthrope
> реже делать, как раз таки.
И будут баги дикие. Физика в реалтайме ппц какая неточная. Слышал про итеративное выталкивание?
MisanthropeПостоялецwww1 авг. 201715:13#8
Dimich
> А зачем тебе велосити?
я персонажа пинаю по сцене, ну и что-бы не перетереть ему предыдущее ускорение, я прибавляю к предыдущему новое, и вроде бы всё ок.
но иногда проскакивает странное значение, и он подпрыгивает.
MisanthropeПостоялецwww1 авг. 201715:13#9
Dimich
> Слышал про итеративное выталкивание?
неа, я физику особо не вертел еще)
DimichПостоялецwww1 авг. 201715:15#10
Misanthrope
> но иногда проскакивает странное значение, и он подпрыгивает.
Такое бывает, когда мир очень маленький, погрешность вычислений. Видел такую хрень в BGE.
MisanthropeПостоялецwww1 авг. 201715:35#11
Dimich
апдейт не помог в общем (
причем такая шляпа и при applyForce() и при applyImpulse() и с аналогичными.
так как оно там внутри этот сраный велосити учитывает

Правка: 1 авг. 2017 15:40

iKestПостоялецwww1 авг. 201715:50#12
А timestep физики фиксированный? Иногда такие баги проявляются, если шаг скачет между 30 и 60 fps.
MisanthropeПостоялецwww1 авг. 201715:52#13
iKest
> А timestep физики фиксированный?
в теории да, но по факту может быть и нет.
а если предположить что нет, то как тогда пофиксить?
DimichПостоялецwww1 авг. 201718:53#14
Misanthrope
> апдейт не помог в общем (
А размер мира?

Страницы: 1 2 Следующая

/ Форум / Программирование игр / Физика

2001—2017 © GameDev.ru — Разработка игр