Author Topic: Noch ein paar Fragen  (Read 3704 times)

Offline Shadow-Phönix

  • byte
  • *
  • Posts: 11
    • View Profile
Noch ein paar Fragen
« on: July 16, 2010, 03:55:14 pm »
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
« Last Edit: July 16, 2010, 04:01:59 pm by Shadow-Phönix »

Online EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 11776
    • View Profile
    • http://www.jpct.net
Re: Noch ein paar Fragen
« Reply #1 on: July 16, 2010, 09:27:40 pm »
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


Offline Shadow-Phönix

  • byte
  • *
  • Posts: 11
    • View Profile
Re: Noch ein paar Fragen
« Reply #2 on: July 17, 2010, 09:07:18 am »
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
« Last Edit: July 17, 2010, 03:05:54 pm by Shadow-Phönix »

Online EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 11776
    • View Profile
    • http://www.jpct.net
Re: Noch ein paar Fragen
« Reply #3 on: July 17, 2010, 09:55:13 pm »
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.

Offline Shadow-Phönix

  • byte
  • *
  • Posts: 11
    • View Profile
Re: Noch ein paar Fragen
« Reply #4 on: July 19, 2010, 10:17:10 am »
OK, danke^^

Offline Shadow-Phönix

  • byte
  • *
  • Posts: 11
    • View Profile
Re: Noch ein paar Fragen
« Reply #5 on: July 20, 2010, 09:16:23 pm »
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

Online EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 11776
    • View Profile
    • http://www.jpct.net
Re: Noch ein paar Fragen
« Reply #6 on: July 20, 2010, 09:25:20 pm »
Vielleicht hilft das hier:

Code: [Select]
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...

Offline Shadow-Phönix

  • byte
  • *
  • Posts: 11
    • View Profile
Re: Noch ein paar Fragen
« Reply #7 on: July 20, 2010, 10:02:33 pm »
OK, danke, ich seh's mir mal an^^

Offline Shadow-Phönix

  • byte
  • *
  • Posts: 11
    • View Profile
Re: Noch ein paar Fragen
« Reply #8 on: July 21, 2010, 07:57:59 pm »
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:
Code: [Select]
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

Online EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 11776
    • View Profile
    • http://www.jpct.net
Re: Noch ein paar Fragen
« Reply #9 on: July 21, 2010, 08:56:43 pm »
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.

Offline Shadow-Phönix

  • byte
  • *
  • Posts: 11
    • View Profile
Re: Noch ein paar Fragen
« Reply #10 on: July 21, 2010, 09:09:43 pm »
Ja, so funktionierts^^
Danke  :)

Offline Shadow-Phönix

  • byte
  • *
  • Posts: 11
    • View Profile
Re: Noch ein paar Fragen
« Reply #11 on: July 24, 2010, 10:59:17 am »
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
« Last Edit: July 24, 2010, 03:00:06 pm by Shadow-Phönix »

Online EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 11776
    • View Profile
    • http://www.jpct.net
Re: Noch ein paar Fragen
« Reply #12 on: July 24, 2010, 04:17:38 pm »
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.

Offline Shadow-Phönix

  • byte
  • *
  • Posts: 11
    • View Profile
Re: Noch ein paar Fragen
« Reply #13 on: July 26, 2010, 09:29:55 am »
OK, danke^^
Ich glaub', ich werd' den Collisionsmodus umschalten^^