@Override public void onTick(float dt) { final Client client = (Client) Spout.getEngine(); final Transform playerTransform = client.getPlayer().getPhysics().getTransform(); final PlayerInputState state = client.getPlayer().input(); final float speed = 50f; Vector3f motion = Vector3f.ZERO; if (state.getForward()) { motion = motion.add(playerTransform.forwardVector().mul(speed * -dt)); } if (state.getBackward()) { motion = motion.add(playerTransform.forwardVector().mul(speed * dt)); } if (state.getLeft()) { motion = motion.add(playerTransform.rightVector().mul(speed * -dt)); // TODO getLeftVector } if (state.getRight()) { motion = motion.add(playerTransform.rightVector().mul(speed * dt)); } if (state.getJump()) { motion = motion.add(playerTransform.upVector().mul(speed * dt)); } if (state.getCrouch()) { motion = motion.add(playerTransform.upVector().mul(speed * -dt)); } client .getPlayer() .getPhysics() .setRotation( Quaternionf.fromAxesAnglesDeg( state.pitch(), state.yaw(), playerTransform.getRotation().getAxesAngleDeg().getZ())); if (!motion.equals(Vector3f.ZERO)) { client.getPlayer().getPhysics().translate(motion); } }