void jump() { if (!isOnGround) return; Vector3f newVelocity = new Vector3f(); owner.getRigidBody().getLinearVelocity(newVelocity); newVelocity.y = JUMP_SPEED; owner.getRigidBody().setLinearVelocity(newVelocity); }
protected Vector3f scaleForce(Vector3f delta) { if (delta.lengthSquared() > DELTA_MAX) { delta.normalize(); delta.scale(MAX_FORCE); } else { delta.scale(MAX_FORCE / DELTA_MAX); } return delta; }
protected void doGroundMovement() { if (!isOnGround) return; // ground movement is as follows, the arrow key dictate the target velocity, and accelleration // is // added to achieve that. If opposing keys are held the target velocity is set to zero. // This is the velocity in the normal plane in the player space Vector3f targetVelocity = new Vector3f(); if (forward) targetVelocity.z += 1; if (backward) targetVelocity.z -= 1; if (left) targetVelocity.x -= 1; if (right) targetVelocity.x += 1; if (forward != backward || left != right) { targetVelocity.normalize(); targetVelocity.scale(MAX_SPEED); } forward = false; backward = false; left = false; right = false; Vector3f forward = new Vector3f(0, 0, 1); QuaternionUtil.quatRotate(owner.getOrientation(), forward, forward); // right = normal x forward // forward = right x normal Vector3f right = new Vector3f(); right.cross(surfaceNormal, forward); forward.cross(right, surfaceNormal); right.normalize(); forward.normalize(); Matrix3f transform = new Matrix3f(); transform.setColumn(0, right); transform.setColumn(1, surfaceNormal); transform.setColumn(2, forward); transform.transform(targetVelocity); Vector3f delta = new Vector3f(); owner.getRigidBody().getLinearVelocity(delta); delta.sub(targetVelocity, delta); // feet can't pull and don't need to push for now // Ds = D - N(N.D) Vector3f parComp = new Vector3f(surfaceNormal); parComp.scale(surfaceNormal.dot(delta)); delta.sub(delta, parComp); owner.getRigidBody().applyCentralForce(scaleForce(delta)); }