YAY! (or not...)
I found it! I took this example, copy-pasted it, compiled... it works, so OK. Let's start adding things one by one so that it get's like my code until it stops working...
it stopped working after I set the speed (i mean the value which multiplies the vector which is checked and then added to the resultant) to 0.2
here is the code, the SPEED is set to 1 and it works, but if you change it to 0.2 (should be bigger than moveDamp) it stops working (oh, and BTW, I changed the renderer to OpenGL and made a camera on the back of the cube)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import com.threed.jpct.*;
import com.threed.jpct.util.*;
public class CollisionDemo {
private static float moveDamp = 0.1f;
private static float SPEED = 1f;
private static float MAXSPEED = 1f;
private Graphics g = null;
private KeyMapper keyMapper = null;
private FrameBuffer fb = null;
private World world = null;
private Object3D plane = null;
private Object3D ramp = null;
private Object3D cube = null;
private Object3D cube2 = null;
private Object3D sphere = null;
private SimpleVector moveRes = new SimpleVector(0, 0, 0);
private boolean up = false;
private boolean down = false;
private boolean left = false;
private boolean right = false;
private boolean doloop = true;
private SimpleVector ellipsoid = new SimpleVector(2, 2, 2);
public CollisionDemo() {
Config.glFullscreen=false;
}
private void initStuff() {
//keyMapper = new KeyMapper(this);
fb = new FrameBuffer(1024, 768, FrameBuffer.SAMPLINGMODE_NORMAL);
world = new World();
fb.enableRenderer(IRenderer.RENDERER_SOFTWARE);
fb.enableRenderer(IRenderer.RENDERER_OPENGL, IRenderer.MODE_OPENGL);
fb.disableRenderer(IRenderer.RENDERER_SOFTWARE);
keyMapper = new KeyMapper();
plane = Primitives.getPlane(20, 10);
ramp = Primitives.getCube(20);
ramp.setAdditionalColor(Color.BLUE);
plane.setAdditionalColor(Color.GREEN);
sphere=Primitives.getSphere(30);
sphere.setAdditionalColor(Color.CYAN);
sphere.translate(-50,10,50);
cube2=Primitives.getCube(20);
cube2.setAdditionalColor(Color.ORANGE);
cube2.translate(60,-20,60);
plane.rotateX((float) Math.PI / 2f);
ramp.rotateX((float) Math.PI / 2f);
cube = Primitives.getCube(2);
plane.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
ramp.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
sphere.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
cube2.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
cube.setCollisionMode(Object3D.COLLISION_CHECK_SELF);
world.addObject(plane);
world.addObject(ramp);
world.addObject(cube);
world.addObject(sphere);
world.addObject(cube2);
cube.translate( -50, -10, -50);
Light light = new Light(world);
light.setPosition(new SimpleVector(0, -80, 0));
light.setIntensity(40, 25, 22);
world.buildAllObjects();
}
private void move() {
KeyState ks = null;
while ((ks = keyMapper.poll()) != KeyState.NONE) {
if (ks.getKeyCode() == KeyEvent.VK_UP) {
up = ks.getState();
}
if (ks.getKeyCode() == KeyEvent.VK_DOWN) {
down = ks.getState();
}
if (ks.getKeyCode() == KeyEvent.VK_LEFT) {
left = ks.getState();
}
if (ks.getKeyCode() == KeyEvent.VK_RIGHT) {
right = ks.getState();
}
if(ks.getKeyCode() == KeyEvent.VK_ESCAPE) {
doloop = false;
}
}
// move the cube
if (up) {
SimpleVector t = cube.getZAxis();
t.scalarMul(SPEED);
//t = cube.checkForCollisionEllipsoid(t, ellipsoid, 5);
//cube.translate(t);
moveRes.add(t);
}
if (down) {
SimpleVector t = cube.getZAxis();
t.scalarMul(-SPEED);
//t = cube.checkForCollisionEllipsoid(t, ellipsoid, 5);
//cube.translate(t);
moveRes.add(t);
}
if (left) {
cube.rotateY((float)Math.toRadians(-1));
}
if (right) {
cube.rotateY((float)Math.toRadians(1));
}
// finally apply the gravity:
SimpleVector t=new SimpleVector(0,1,0);
t=cube.checkForCollisionEllipsoid(t,ellipsoid,1);
cube.translate(t);
//avoid too high speed
if(moveRes.length()>MAXSPEED) {
moveRes.makeEqualLength(new SimpleVector(0,0,MAXSPEED));
}
moveRes = cube.checkForCollisionEllipsoid(moveRes, ellipsoid, 5);
cube.translate(moveRes);
//damping
if(moveRes.length()>moveDamp) {
moveRes.makeEqualLength(new SimpleVector(0,0,moveDamp));
} else {
moveRes = new SimpleVector(0,0,0);
}
}
private void doIt() throws Exception {
Camera cam = world.getCamera();
cam.moveCamera(Camera.CAMERA_MOVEOUT, 100);
cam.moveCamera(Camera.CAMERA_MOVEUP, 100);
cam.lookAt(ramp.getTransformedCenter());
while(doloop) {
move();
cam.setPositionToCenter(cube);
cam.align(cube);
cam.rotateCameraX((float)Math.toRadians(30));
cam.moveCamera(Camera.CAMERA_MOVEOUT, 50);
fb.clear(Color.RED);
world.renderScene(fb);
world.draw(fb);
fb.update();
fb.displayGLOnly();
}
fb.disableRenderer(IRenderer.RENDERER_OPENGL);
System.exit(0);
}
public static void main(String[] args) throws Exception {
CollisionDemo cd = new CollisionDemo();
cd.initStuff();
cd.doIt();
}
}