Main Menu

Noch ein paar Fragen

Started by Shadow-Phönix, July 16, 2010, 03:55:14 PM

Previous topic - Next topic

Shadow-Phönix

Hallo,

Ich hätte noch ein paar Fragen:

1. Ich habe die Kamera nun um ein Objekt gedreht. Wie kann ich es (das Objekt) nach vorne bewegen?
2. Ich habe ein Objekt, das auf einem Boden stehen soll. Wie mache ich es, dass es den Boden nicht durchdringen kann und immer darauf steht? (Der Boden ist uneben...)
3. Wie kann ich einen Text ausgeben?

lg,
 Shadow-Phönix

EgonOlsen

1.) z.B. mittels Object3D.translate(....). Die Bewegungsrichtung, die du angeben musst, um das Objekt nach vorne (d.h. in Richtung der Kamera) zu bewegen, ist im Prinzip die invertierte Richtung der Kamera. Aber letztendlich hängt der richtige Vektor auch von deiner Anwendung ab...das lässt sich pauschal schlecht beantworten.

2.) z.B. mit einer Kollisionsberechung. Das car-example macht sowas für das "Auto". Es gibt verschiedene Kollisionsalgorithmen in jPCT. Beschrieben sind die hier: http://www.jpct.net/wiki/index.php/Collision_detection

3.) Im Prinzip durch Blitting. Was genau die beste Lösung ist, hängt von der Art und nötigen Flexibilität ab. Ändert sich der Text immer oder ist er statisch über die Laufzeit? Am einfachsten geht es mit Raft GLFont-Klasse: http://www.jpct.net/forum2/index.php/topic,1074.0.html


Shadow-Phönix

#2
Danke für die Antwort^^

Bei 1. will ich eine Figur (einen Spieler) mit den Pfeiltasten drehen können. Dann soll er geradeaus laufen können. Object3D.translate(...) funktioniert. Gibt es aber eine Möglichkeit, das Objekt nicht so weit zu bewegen? (also langsamer)

Zu 3. : Der Text wird gebraucht um einzelne Figuren des Spiels "sprechen" zu lassen. Er verändert sich also. Und dann wird er auch noch für ein Menü gebraucht, das per Tastendruck erscheinen soll.

lg,
 Shadow-Phönix

EgonOlsen

Zu 1.) Hmm...du bist doch frei in der Wahl der Werte für translate...von Stillstand (0,0,0) bis sonstwas...

Zu 3.) Dann guck dir die GLFont-Klasse an. Die ist gut für sowas.

Shadow-Phönix


Shadow-Phönix

Ich experimentiere jetzt schon seit ein paar Tagen mit der CollisionDetection herum und ich versteh's nicht...  :'(

Könnte mir bitte jemand einen Beispielcode geben? Nur mit einem Würfel, Quader, etc. und einem Boden.

lg,
Shadow-Phönix

EgonOlsen

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...

Shadow-Phönix

OK, danke, ich seh's mir mal an^^

Shadow-Phönix

Ich habs mir mal angesehen und selbst einen simplen Code geschrieben. Nur leider funktioniert er nicht...
Der Würfel fällt einfach so durch den Boden...

Hier ist der Code:

public class CollisionDemo {

   World world;
   Object3D cube;
   Object3D ground;
   
   static JFrame      frame;
   static FrameBuffer buffer;
   
   private SimpleVector ellipsoid = new SimpleVector(2, 2, 2);
   
   private void init() {
       world = new World();
       world.setAmbientLight(0, 255, 0);
       
       cube = Primitives.getCube(2);
       cube.setAdditionalColor(Color.BLACK);
       
       ground = Primitives.getBox(30, 0.1f);
       ground.setOrigin(new SimpleVector(0,10,0));
       ground.setAdditionalColor(Color.CYAN);
       
       cube.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
       ground.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
       
       world.addObject(cube);
       world.addObject(ground);
       
       world.buildAllObjects();
       
       world.getCamera().setPosition(new SimpleVector(0,-5,-15));
       world.getCamera().lookAt(cube.getOrigin());
   }
   
   private void run() {
       frame = new JFrame();
       frame.setSize(800, 600);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setVisible(true);
       buffer = new FrameBuffer(800,600,FrameBuffer.SAMPLINGMODE_NORMAL);
       
       while(frame.isShowing()) {
           gravity();
           
           buffer.clear();
           world.renderScene(buffer);
           world.draw(buffer);
           buffer.display(frame.getGraphics());
           buffer.update();
           
           
       }
       
       buffer.dispose();
       frame.dispose();
       System.exit(0);
   }
   
   public void gravity() {
SimpleVector t = new SimpleVector(0, 0.1f, 0);
t = cube.checkForCollisionEllipsoid(t, ellipsoid, 1);
cube.translate(t);
   }
   
   public static void main(String[] args) {
       CollisionDemo demo = new CollisionDemo();
       demo.init();
       demo.run();
   }

}


Weiß irgendjemand, wo der Fehler liegt?

lg,
 Shadow-Phönix

EgonOlsen

Falscher Collision-Mode für den Würfel würde ich so auf den ersten Blick sagen. Er soll ja kollidieren und nicht andere Dinge mit ihm. Probiere für den cube mal Object3D.COLLISION_CHECK_SELF stattdessen.

Shadow-Phönix

Ja, so funktionierts^^
Danke  :)

Shadow-Phönix

#11
Ich hätte noch eine Frage: (Sorry für meine vielen Fragen...)

Ich habe ein Spiel erstellt, in dem man eine Fahne suchen muss, die per Zufallsprinzip irgendwo in das Level gestellt wird. Wenn man sie gefunden hat, wird das aktuelle Level aus der Welt genommen und das nächste eingefügt. Nun würde ich gerne wissen: Wie kann ich den Charakter (eine Kugel) wieder genau in die Mitte der Welt stellen?
EDIT: Ich weiß nun, wie es geht^^ (mit der Funktion Object3D.clearTranslation()...)

Und: Wie kann ich verhindern, dass zwei Objekte mit dem Collision-Mode COLLISION_CHECK_SELF kollidieren? Weil ich will dieser Welt auch noch NPC-Spieler hinzufügen und die dürfen natürlich auch nicht miteinander kollidieren...

lg,
 Shadow-Phönix

EgonOlsen

Ich setze die Objekte, die ich von einer Kollisionsberechnung ausschließen will, immer kurzfristig auf unsichtbar und hinterher wieder zurück. Du könntest auch den collisionMode vorher umschalten...geht auch. Je nachdem, was besser gefällt. Im Ergebnis ist es gleich.

Shadow-Phönix

OK, danke^^
Ich glaub', ich werd' den Collisionsmodus umschalten^^