Как я могу создавать кинематические объекты в jBullet?

Я пытаюсь создать игровой движок и хочу, чтобы камера управлялась игроком, а также другими объектами jBullet в Java. Мне предложили использовать кинематические объекты, поэтому я поискал информацию о них. Я не мог найти никакой документации, которую я мог бы понять.

Может ли кто-нибудь объяснить, как настроить и использовать кинематические объекты или хотя бы показать мне, с чего я могу начать?


person Sierox    schedule 23.08.2013    source источник
comment
Почему за это проголосовали?   -  person Prior99    schedule 30.09.2014


Ответы (1)


Документация для KinematicCharacterController, найденная здесь, не слишком полностью полезно, но источник в CharacterDemo может быть. В демо определены два основных свойства.

    public KinematicCharacterController character;
    public PairCachingGhostObject ghostObject;

Призрак можно использовать для динамического обнаружения столкновений, поскольку он не реагирует автоматически на эти события. Персонажа можно перемещать, изменяя Transform.

    //from the source src\com\bulletphysics\demos\character\CharacterDemo.java
    Transform startTransform = new Transform();
    startTransform.setIdentity();
    startTransform.origin.set(0.0f, 4.0f, 0.0f);

    Vector3f worldMin = new Vector3f(-1000f,-1000f,-1000f);
    Vector3f worldMax = new Vector3f(1000f,1000f,1000f);
    AxisSweep3 sweepBP = new AxisSweep3(worldMin, worldMax);

    ghostObject = new PairCachingGhostObject();
    ghostObject.setWorldTransform(startTransform);
    sweepBP.getOverlappingPairCache().setInternalGhostPairCallback(new GhostPairCallback());
    float characterHeight = 1.75f * characterScale;
    float characterWidth = 1.75f * characterScale;
    ConvexShape capsule = new CapsuleShape(characterWidth, characterHeight);
    ghostObject.setCollisionShape(capsule);
    ghostObject.setCollisionFlags(CollisionFlags.CHARACTER_OBJECT);

    float stepHeight = 0.35f * characterScale;
    character = new KinematicCharacterController(ghostObject, capsule, stepHeight);


    dynamicsWorld.addCollisionObject(ghostObject, CollisionFilterGroups.CHARACTER_FILTER, (short)(CollisionFilterGroups.STATIC_FILTER | CollisionFilterGroups.DEFAULT_FILTER));

    dynamicsWorld.addAction(character);

Также было бы разумно расширить класс MotionState, чтобы он содержал преобразование.

   public class MyMotionState extends MotionState {
        private Transform worldTransform;
        public MyMotionState() 
        {
            worldTransform = new Transform();
            worldTransform.setIdentity();
        }

        @Override
        public Transform getWorldTransform(Transform worldTrans) 
        {
            worldTrans.set(worldTransform);
            return worldTrans;
        }

        @Override
        public void setWorldTransform(Transform worldTrans) 
        {
            worldTransform.set(worldTrans);
        }
 }

и связывание Kinematic с RigidBody для применения физики к персонажу и получения информации о рендеринге.

    rigidBody.setCollisionFlags(rigidBody.getCollisionFlags() | CollisionFlags.KINEMATIC_OBJECT);  
    rigidBody.setActivationState(CollisionObject.DISABLE_DEACTIVATION);

Не забывайте обновлять физический движок после каждой итерации игрового цикла.

    Transform transform = new Transform();
    transform.setIdentity();
    transform.origin.set(input.getX(), input.getY(), input.getZ());
    myMotionState.setWorldTransform(transform);
    rigidBody.setCenterOfMassTransform(myMotionState.getWorldTransform());

Если вы предпочитаете, вы можете поместить их в свой класс MainCharacter или как вы его называете (мне нравится это за объектно-ориентированное ощущение и простоту понимания)

    public class MainCharacter implements KeyListener, MouseListener
    {
        private DynamicsWorld world;
        private MyMotionState myMotionState;
        private RigidBody rigidBody;
        private KinematicCharacterController character;
        private ConvexShape shape;
        private Texture texture;
        private GhostObject ghost;
        private Vector3f pos;
        public MainCharacter(DynamicsWorld world, Vector3f initialPosition, ConvexShape shape, Texture texture)
        {
            this.world = world;
            RigidBodyConstructionInfo constructInfo = new RigidBodyConstructionInfo(...);
            this.myMotionState = myMotionState;
            rigidBody = new RigidBody(constructInfo);
            ghost = new GhostObject();
            character = new KinematicCharacterController(ghost,shape,1);
        }
        public void render()
        {
            glBegin(GL_QUADS);
                glVertex3f(...
                ...
            glEnd();
        }
        public void mouseMoved(MouseEvent e)
        {
                //pseudocode
                this.yaw = e.getDX();
                this.pitch = e.getDY();
        }
        public void keyPressed(KeyEvent e)
        {
            Vector3f dPos = null;
            if(e.getKeyChar() == 'W')
            {
                dPos.x = 10;
            }
            else if(e.getKeyChar() == 'S')
            {
                dPos.x = -10;
            }
            etc...

            move(dPos.x,dPos.y,dPos.z);
        }
        public void move(float dx, float dy, float dz) {
            pos.z += dx * (float) Math.cos(Math.toRadians(yaw - 90)) + dz *        Math.cos(Math.toRadians(yaw));
            pos.x -= dx * (float) Math.sin(Math.toRadians(yaw - 90)) + dz * Math.sin(Math.toRadians(yaw));
            pos.y += dy * (float) Math.sin(Math.toRadians(pitch - 90)) + dz * Math.sin(Math.toRadians(pitch));
            //pseudocode
            rigidBody.update(pos);
            world.update(pos);
        }
   }

Надеюсь, я помог вам.

person user2727804    schedule 29.08.2013
comment
Также было бы разумно расширить класс MotionState, чтобы он содержал преобразование. Как мне это сделать? - person Sierox; 29.08.2013
comment
Отредактировано, чтобы показать весь класс MyMotionState. Кроме того, MotionState отправляет свои данные в мир на каждой итерации цикла, поэтому, если у вас есть свои собственные, вы можете изменить его данные (т.е. положение) - person user2727804; 29.08.2013