Koordinatensystem, 3D Array, 3D Projektion auf 2D Bildschirm

Previous topic - Next topic

Baggi

Hi,

ich habe da mal ein paar Fragen zur 3D Programmierung die
wahrscheinlich hauptsächlich an Gernot gehen. Aber vielleicht
interessiert es ja den einen oder anderen, deshalb poste ich sie mal
ins Forum.

1.
Zylinder - oder Polarkoordinaten ?
Benutz man in der 3D Welt Zylinderkoordinaten mit
x=rcos(phi)
z=rsin(phi)
y=y

oder
Polarkoordinaten mit
x=rsin(theta)cos(phi)
z=rsin(theta)sin(phi)
y=rcos(theta)


2.
In einem 2D Spiel besteht die Spieloberfläche oft aus "Kacheln"
also aus einem 2D Array. Damit kann man Positionen von Spielfiguren oder
Hindernissen überblicken, hat also die volle Kontrolle. Entwirft
man sich in der 3D Welt ein 3D Array mit allen Koordinaten - Infos über die Welt ?


3.
Bei einem 3D Ego Shooter befindet sich in der Mitte des Bildschirmes ein
2D Fadenkreuz. Wenn der Held einen Schuss aus seiner Waffe abfeuert, soll
der 3D Gegenstand in der Projektion des 2D Fadenkreuzes getroffen werden.
Gibt es in GLBasic die Möglichkeit abzufragen, welcher 3D Punkt auf welchen
2D Punkt auf dem Bildschirm abgebildet wird ?



4.
Gibt es ein Buch, welches sich mit solchen und ähnlichen Fragen
auseinandersetzt ?





Vielen Dank schonmal und Gruss
Baggi

Kitty Hello

Quote from: Baggi1.
Zylinder - oder Polarkoordinaten ?
Benutz man in der 3D Welt Zylinderkoordinaten mit
x=rcos(phi)
z=rsin(phi)
y=y

oder
Polarkoordinaten mit
x=rsin(theta)cos(phi)
z=rsin(theta)sin(phi)
y=rcos(theta)
GLBasic nutzt Polarkoordinaten. D.h. wenn Du's in zylindrisch willst, musst Du mit x=r*cos(phi); y=r*sin(phi); y=y; arbeiten. Kugelkoordinaten analog.

Quote from: Baggi2.
In einem 2D Spiel besteht die Spieloberfläche oft aus "Kacheln"
also aus einem 2D Array. Damit kann man Positionen von Spielfiguren oder
Hindernissen überblicken, hat also die volle Kontrolle. Entwirft
man sich in der 3D Welt ein 3D Array mit allen Koordinaten - Infos über die Welt ?
Das hab ich bei den "TruckDriver" so gemacht weil:
- die Kollisionsabfrage einfacher ist
- die Level aus einer "2D" Textdatei geladen werden können

Bei Wumbo's Adventure hab ich mir Objekt-ID, X, Y, Z, Rot, gemerkt, weil:
- dadurch viel "freiere" Level möglich sind
- die Objekte nicht an ein Raster gezwungen werden
- "3D" einfacher geht, weil man den Y Wert angeben kann

Das muss man von Prjekt zu Projekt überlegen, was günstiger ist.

Quote from: Baggi3.
Bei einem 3D Ego Shooter befindet sich in der Mitte des Bildschirmes ein
2D Fadenkreuz. Wenn der Held einen Schuss aus seiner Waffe abfeuert, soll
der 3D Gegenstand in der Projektion des 2D Fadenkreuzes getroffen werden.
Gibt es in GLBasic die Möglichkeit abzufragen, welcher 3D Punkt auf welchen
2D Punkt auf dem Bildschirm abgebildet wird ?
Wenn das Fadenkreuz in der Mitte ist, dann hast Du Deine Position und Richtung ja bei X_CAMERA angegeben. Die Abfrage, ob ein Objekt dazwischen ist, kann man mit X_COLLISIONRAY machen. Das geht sehr schnell.

Quote from: Baggi4.
Gibt es ein Buch, welches sich mit solchen und ähnlichen Fragen
auseinandersetzt ?
Sorry, fällt mir keines ein - vielleicht weiß jemand ein gutes Buch?

Gruß,
Gernot

Baggi

Hey danke fuer die Antwort.

Du meinst, du hast dir bei Wumbo die ObjectID, x, y, z und rot gemerkt. Was heisst das genau ?
"Freiere" Level sind dadurch moeglich. Kommen die ObjectID, x, y, z und rot aus der .3ds Datei ?

Also wenn ich mir ein 3D Level mit Huegeln und Taelern bastel, dann muessen diese Koordinateninformationen ja in der .3ds Datei enthalten sein, damit GLBasic sie darstellen kann. Wenn man diese Koordinaten bekommt, waere es echt cool. Aber vielleicht meinst du ja genau das. Wenn ja, wie komme ich an diese Informationen aus der .3ds Datei ?

Gruss
Baggi

Kitty Hello

Also, wenn Dein Level nur aus einer ddd (3ds) Datei besteht, brauchst Du keinen Level-Editor und kein Feld und nix.
Bei Wumbo hab ich aber das Spielfeld aus "Blöcken" zusammengebaut, wobei jeder Block ganz individuell im Raum stehen kann (XYZ und Drehung um Y). Das brauch ich, weil bewegliche Plattformen, Wasser und Süßigkeiten, extra Leben usw... irgendwo platziert werden müssen. Im 3D Raum eben am einfachsten durch XYZ statt in einem Feld:
Code (glbasic) Select
##++####
#++++++#
#####++#
########
Mein Level Editor ist dabei der GLBasic editor, weil ich zu faul war einen Editor zu schreiben - muss ich irgenwann mal machen.

Die Koordinaten der ddd(3ds) Datei bekommst Du nicht, aber Du kannst prüfen, ob Kugeln, Quader oder Linien Sie berühren. (X_COLLISIONxxx)

Hilft das?
Gruß,
Gernot

Baggi

Ja danke, das hilft mir. Dann kann ich meine Spielfigur mit (X_COLLISIONxxx) an Waenden stoppen lassen, ueber Huegel laufen lassen und so weiter. Dann kanns ja weitergehen. :)

Gruss
Baggi