Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ "科学物理";setLinearVelocity“;不动_C++_Bulletphysics - Fatal编程技术网

C++ "科学物理";setLinearVelocity“;不动

C++ "科学物理";setLinearVelocity“;不动,c++,bulletphysics,C++,Bulletphysics,我正在尝试使用OpenGL和BulletPhysics创建一个具有刚体的FPS播放器。唯一的问题是让盒子移动。我用setLinearForce、applyForce和许多其他工具尝试过,但就是不想移动。它仍然对碰撞做出反应,但如果它因为碰撞而移动(我投掷一个球来测试它的物理性能),并且我按下键盘上的任何移动按钮,它就会停止。如果它是静止的,我按下按钮使它移动,它就不会反应(保持静止) 这是运动员的课程 \ifndef PLAYER\u H #定义PLAYER_H #包括 #包括 //子弹物理学

我正在尝试使用OpenGL和BulletPhysics创建一个具有刚体的FPS播放器。唯一的问题是让盒子移动。我用setLinearForce、applyForce和许多其他工具尝试过,但就是不想移动。它仍然对碰撞做出反应,但如果它因为碰撞而移动(我投掷一个球来测试它的物理性能),并且我按下键盘上的任何移动按钮,它就会停止。如果它是静止的,我按下按钮使它移动,它就不会反应(保持静止)

这是运动员的课程

\ifndef PLAYER\u H
#定义PLAYER_H
#包括
#包括
//子弹物理学
#包括“Bullet\src\btBulletDynamicCommon.h”
//SDL与OpenGL
#包含“Link\GLUT\include\GLUT.h”
#包括“链接\GLUT\include\GL.h”
#include“Link\GLUT\include\GLU.h”
#包括“链接\SDL\include\SDL.h”
使用名称空间std;
职业选手
{
公众:
b刚体*体;
btt变换;
b运动状态*运动;
Player();
~Player();
void init(btDynamicsWorld*世界、浮动x、浮动y、浮动z、浮动质量);
无效位置(浮动x、浮动z);
void Render();
void freemory(btDynamicsWorld*world);
};
Player::Player(){}
玩家::~Player(){}
void Player::init(btDynamicsWorld*world,float x,float y,float z,float mass)
{
t、 setIdentity();
t、 setOrigin(btVector3(x,y,z));
btBoxShape*obj=新的btBoxShape(btVector3(3/2.0,7/2.0,3/2.0));
btVector3惯性(0,0,0);
如果(质量!=0.0)
obj->计算校准(质量、惯性);
运动=新的btDefaultMotionState(t);
b刚体::b刚体构造信息(质量、运动、物体、惯性);
body=新的B刚体(信息);
主体->强制激活状态(禁用禁用);
车身->设置角度系数(0.0);
身体->设置睡眠阈值(0.0,0.0);
世界->添加刚体(体);
}
无效玩家::刷新位置(浮动x,浮动z)
{
body->getMotionState()->getWorldTransform(t);
Uint8*状态=SDL_GetKeyState(NULL);
如果(状态[SDLK_w])
{
body->setLinearVelocity(btVector3(x*20,body->getLinearVelocity().y(),z*20));
}
body->getMotionState()->setWorldTransform(t);
body->setCenterOfMassTransform(t);
}
void Player::Render()
{
if(body->getCollisionShape()->getShapeType()!=BOX\u SHAPE\u PROXYTYPE)
返回;
GL3F(0.0,1.0,0.0);
btVector3区段=((btBoxShape*)正文->getCollisionShape())->getHalfExtentsWithMargin();
btt变换;
body->getMotionState()->getWorldTransform(t);
浮垫[16];
t、 getOpenGLMatrix(mat);
glPushMatrix();
glMultMatrixf(mat);
glBegin(GL_QUADS);
glVertex3f(-extent.x(),extent.y(),-extent.z());
glVertex3f(-extent.x(),-extent.y(),-extent.z());
glVertex3f(-extent.x(),-extent.y(),extent.z());
glVertex3f(-extent.x(),extent.y(),extent.z());
格伦德();
glBegin(GL_QUADS);
glVertex3f(extent.x()、extent.y()、-extent.z());
glVertex3f(extent.x(),-extent.y(),-extent.z());
glVertex3f(extent.x(),-extent.y(),extent.z());
glVertex3f(extent.x()、extent.y()、extent.z());
格伦德();
glBegin(GL_QUADS);
glVertex3f(-extent.x(),-extent.y(),-extent.z());
glVertex3f(extent.x(),-extent.y(),-extent.z());
glVertex3f(extent.x(),-extent.y(),extent.z());
glVertex3f(-extent.x(),-extent.y(),extent.z());
格伦德();
glBegin(GL_QUADS);
glVertex3f(-extent.x(),extent.y(),-extent.z());
glVertex3f(extent.x()、extent.y()、-extent.z());
glVertex3f(extent.x()、extent.y()、extent.z());
glVertex3f(-extent.x(),extent.y(),extent.z());
格伦德();
glBegin(GL_QUADS);
glVertex3f(-extent.x(),extent.y(),-extent.z());
glVertex3f(-extent.x(),-extent.y(),-extent.z());
glVertex3f(extent.x(),-extent.y(),-extent.z());
glVertex3f(extent.x()、extent.y()、-extent.z());
格伦德();
glBegin(GL_QUADS);
glVertex3f(-extent.x(),extent.y(),extent.z());
glVertex3f(-extent.x(),-extent.y(),extent.z());
glVertex3f(extent.x(),-extent.y(),extent.z());
glVertex3f(extent.x()、extent.y()、extent.z());
格伦德();
glPopMatrix();
}
void Player::freemory(btDynamicsWorld*world)
{
world->removeCollisionObject(实体);
删除body->getMotionState();
删除body->getCollisionShape();
}
#恩迪夫
好的,这是课堂。请注意,RefreshPosition有两个参数:x和z位置(我不想更改y位置)。这两个变量表示玩家的方向(0到1),并乘以20得到速度(最大值=20)


我希望我给了您足够的信息….

可能对象被停用,然后它就不再移动了。然后必须再次激活它(在文档中搜索如何使用setActivationState()方法激活刚体)


当对象几乎停止时,它们将被停用。然后,它们不会再次激活,直到另一个对象向它们施加力或您以编程方式执行此操作。

您能给出一个更简洁的表示错误的代码片段,或者删除代码中未包含的引用元素,以便我们更容易地对其进行测试吗?唯一的问题是它不起作用(setLinearVelocity)。有时我运行程序,它在开始时只工作30秒,然后停止,不响应键盘。我知道这是一个非常古老的线程,但我遇到了完全相同的问题,当我移动对象时,它移动,但当它停止时,我无法再移动对象。我想知道你是如何解决这个问题的。谢谢