Vielleicht hilft das hier:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import com.threed.jpct.*;
import com.threed.jpct.util.*;
import com.threed.jpct.procs.*;
public class CollisionDemoSoftware extends JFrame {
private static final long serialVersionUID = 1L;
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 CollisionDemoSoftware() {
Config.useMultipleThreads=true;
Config.useMultiThreadedBlitting=true;
Config.maxNumberOfCores=4;
Config.mtDebug=true;
Config.mipmap=true;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setSize(1024, 768);
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
g = getGraphics();
}
private void initStuff() {
// keyMapper = new KeyMapper(this);
fb = new FrameBuffer(1024, 768, FrameBuffer.SAMPLINGMODE_NORMAL);
world = new World();
fb.enableRenderer(IRenderer.RENDERER_SOFTWARE);
keyMapper = new KeyMapper(this);
plane = Primitives.getPlane(20, 10);
ramp = Primitives.getCube(20);
ramp.setAdditionalColor(Color.WHITE);
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);
TextureManager tm = TextureManager.getInstance();
Texture t1 = new Texture("textures/tex1.jpg");
Texture t2 = new Texture("textures/tex2.jpg");
Texture t3 = new Texture("textures/tex3.jpg");
Texture t4 = new Texture("textures/tex4.jpg");
Texture t5 = new Texture("textures/tex5.jpg");
tm.addTexture("tex1", t1);
tm.addTexture("tex2", t2);
tm.addTexture("tex3", t3);
tm.addTexture("tex4", t4);
tm.addTexture("tex5", t5);
plane.setTexture("tex3");
ramp.calcTextureWrapSpherical();
ramp.setTexture("tex2");
cube2.calcTextureWrapSpherical();
cube2.setTexture("tex2");
sphere.calcTextureWrapSpherical();
sphere.setTexture("tex4");
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_O) {
if (ks.getState()) {
Config.useMultiThreadedBlitting=!Config.useMultiThreadedBlitting;
System.out.println(Config.useMultiThreadedBlitting);
}
}
if (ks.getKeyCode() == KeyEvent.VK_L) {
if (ks.getState()) {
Config.loadBalancingStrategy++;
Config.loadBalancingStrategy%=2;
}
}
if (ks.getKeyCode() == KeyEvent.VK_ESCAPE) {
doloop = false;
}
}
// move the cube
if (up) {
SimpleVector t = cube.getZAxis();
t.scalarMul(SPEED);
moveRes.add(t);
}
if (down) {
SimpleVector t = cube.getZAxis();
t.scalarMul(-SPEED);
moveRes.add(t);
}
if (left) {
cube.rotateY((float) Math.toRadians(-1));
}
if (right) {
cube.rotateY((float) Math.toRadians(1));
}
// avoid high speeds
if (moveRes.length() > MAXSPEED) {
moveRes.makeEqualLength(new SimpleVector(0, 0, MAXSPEED));
}
cube.translate(0, -0.02f, 0);
moveRes = cube.checkForCollisionEllipsoid(moveRes, ellipsoid, 8);
cube.translate(moveRes);
// finally apply the gravity:
SimpleVector t = new SimpleVector(0, 1, 0);
t = cube.checkForCollisionEllipsoid(t, ellipsoid, 1);
cube.translate(t);
// damping
if (moveRes.length() > moveDamp) {
moveRes.makeEqualLength(new SimpleVector(0, 0, moveDamp));
} else {
moveRes = new SimpleVector(0, 0, 0);
}
// try {
// Thread.sleep(10);
// }catch(Exception e) {}
}
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());
IPostProcessor bloom = new BloomGLProcessor();
fb.addPostProcessor(bloom);
world.getLights().setRGBScale(Lights.RGB_SCALE_2X);
long start=System.currentTimeMillis();
long fps=0;
while (doloop) {
move();
cam.setPositionToCenter(cube);
cam.align(cube);
cam.rotateCameraX((float) Math.toRadians(30));
cam.moveCamera(Camera.CAMERA_MOVEOUT, 100);
fb.clear(Color.RED);
world.renderScene(fb);
world.draw(fb);
fb.update();
fb.display(g);
fps++;
if (System.currentTimeMillis()-start>=1000) {
start=System.currentTimeMillis();
System.out.println(fps);
fps=0;
}
}
fb.disableRenderer(IRenderer.RENDERER_SOFTWARE);
System.exit(0);
}
public static void main(String[] args) throws Exception {
CollisionDemoSoftware cd = new CollisionDemoSoftware();
cd.initStuff();
cd.doIt();
}
}
Das ist eine meiner Testklassen für dies und das, also nicht wundern, wenn da irgendein Müll drinsteht, der von einem Test von irgendwas übrig ist...