Камера jBullet "Держатель" не движется
Я использую jBullet с OpenGL для создания базового игрового движка. Я создал два класса с именем ObjectSurface
а также ObjectEntity
, По сути, ObjectSurface не имеют массы, поэтому они не двигаются, а ObjectEntity может двигаться при столкновении или гравитации.
Я создал камеру с объектом ObjectEntity с именем cameraHolder
так что он может упасть и столкнуться и все.
Проблема в том, что cameraHolder
должен двигаться, когда нажата конкретная клавиша WASD, но он двигается только на одну единицу и больше не двигается. Когда кнопка отпущена, она перемещается на одну единицу в противоположном направлении, так что вы находитесь в том же месте. И после cameraHolder
перемещает XYZ камеры установлены в координаты XYZ cameraHolder
,
Тем не менее, движение работает для движения, вызванного jBullet, который падает из-за силы тяжести.
И когда я не использую обновления jBullet, cameraHolder движется нормально. Так что проблема должна быть с обновлениями jBullet. Я буду показывать это в коде.
Вопрос: почему cameraHolder перемещается только на 1 единицу, а затем назад, когда нажаты определенные кнопки WASD?
Вот код для движения в Camera.java
учебный класс:
public void move(float amount, float direction) {
if(!still){
if (direction == MOVE_BACKWARD) {
//MOVE BACKWARDS (CODE NOT NEEDED, WORKS WITHOUT CAMERA CARRIER)
}
if (direction == MOVE_FORWARD) {
//MOVE FORWARD
}
if (direction == MOVE_LEFT) {
//MOVE LEFT
}
if (direction == MOVE_RIGHT) {
//MOVE RIGHT
}
}
}
public void carryCamera() {
if(!still){
x = cameraHolder.pos.x;
y = cameraHolder.pos.y;
z = cameraHolder.pos.z;
}
}
Вот как ObjectEntity
создано:
private void createShape() {
DefaultMotionState fallMotionState = new DefaultMotionState(new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(pos.x, pos.y, pos.z), 1.0f)));
Vector3f fallInertia = new Vector3f(0,0,0);
shape.calculateLocalInertia(mass,fallInertia);
RigidBodyConstructionInfo fallRigidBodyCI = new RigidBodyConstructionInfo(mass,fallMotionState,shape,fallInertia);
body = new RigidBody(fallRigidBodyCI);
Engine.getDynamicsWorld().addRigidBody(body);
}
Вот как создается Мир Физики:
private static void initPhysics() {
BroadphaseInterface broadphase = new DbvtBroadphase();
DefaultCollisionConfiguration collisionConfiguration = new DefaultCollisionConfiguration();
CollisionDispatcher dispatcher = new CollisionDispatcher(collisionConfiguration);
SequentialImpulseConstraintSolver solver = new SequentialImpulseConstraintSolver();
dynamicsWorld = new DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
dynamicsWorld.setGravity(Game.gravity);
}
Как получить информацию и обновить физику (В ЭТОЙ ЧАСТИ УДОБНЫЙ КОД):
public static Vector3f gravity = new Vector3f(0, -10, 0); //GRAVITY
private ArrayList<Object> objects; //ALL THE OBJECTS IN THE GAME (CAMERAHOLDER IS IN HERE)
//GETTING INPUT, USING move() METHOD IN CAMERA CLASS TO MOVE HOLDER.
public void getInput() {
if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL))
speedMultiplier = 3;
if (Keyboard.isKeyDown(Keyboard.KEY_W))
cam.move(cam.getMoveSpeed() * speedMultiplier, Camera.MOVE_FORWARD);
if (Keyboard.isKeyDown(Keyboard.KEY_S))
cam.move(cam.getMoveSpeed() * speedMultiplier, Camera.MOVE_BACKWARD);
if (Keyboard.isKeyDown(Keyboard.KEY_A))
cam.move(cam.getMoveSpeed() * speedMultiplier, Camera.MOVE_LEFT);
if (Keyboard.isKeyDown(Keyboard.KEY_D))
cam.move(cam.getMoveSpeed() * speedMultiplier, Camera.MOVE_RIGHT);
cam.carryCamera(); //MOVES THE ACTUAL CAMERA TO THE HOLDER.
speedMultiplier = 1;
}
public void update() {
applyJBullet();
}
//AND JBULLET PHYSICS ARE APPLIED HERE (SUSPICIOUS CODE!!!)
public void applyJBullet(){
Engine.getDynamicsWorld().stepSimulation(1/60.f, 10); //SIMULATES NEXT FRAME
for (Object o : objects) {
if(o.getMass() >= 1){ //ALL THE OBJECTS WITH MASS ARE FOUND
Transform trans = new Transform(); //CREATING A NEW TRANSFORM
o.getBody().getMotionState().getWorldTransform(trans); //GET THE SIMULATED LOCATION
//It still doesn't work when I do: "trans.origin.x+=2" here. The same problem occurs.
o.setPos(trans.origin); //AND SET IT AS THE OBJECTS POSITION
}
}
}
1 ответ
Я думаю, что лучше, чем просто использовать форму коробки, иметь кинематическое тело. Чтобы превратить корпус камеры в "кинематическое тело" (предпочтительнее одностороннее столкновение, перемещаемое пользователем), вызовите следующее:
body.setCollisionFlags(body.getCollisionFlags() | CollisionFlags.KINEMATIC_OBJECT);
body.setActivationState(CollisionObject.DISABLE_DEACTIVATION);