erste gehversuche mit 3d

Previous topic - Next topic

Metamorphose

hallo.
Ich habe in ac3d ein model gebaut das folgend aussieht: einen boden (rasen), dann noch 4 mauern am ende des bodens. also von oben gesehen eine schachtel ohne deckel. dies mit ac3d eingefärbt und in glbasic geladen konvertiert als ddd und geladen.
mit den pfeiltasten dreht er sich links, rechts und geht voraus (noch nicht relativ zu links/rechts rotation).
das wäre alles.
doch wenn er sich links dreht (oder rechts) hört es ab einem gewissen punkt praktisch auf. er dreht sich dann extrem langsam bis praktisch nicht.
dazu kommt, dass ich es nicht kapiere, dass vorwärts einfach relativ zu der richtung ist, in die man sieht.
war nicht besonders gut in mathe, das rächt sich wohl.

hier mal der code:

Code (glbasic) Select

GLOBAL x#, y#, z#, px#, py#, pz#, ma#, mb#
x#=1
y#=1
px#=-10

X_LOADOBJ "world.ddd", 0


WHILE TRUE

X_MAKE3D 1, 50, 45
X_CAMERA x#, y#, z#, px#, py#, pz#
X_DRAWOBJ 0, 0

IF KEY(200)=TRUE; x#=x#-0.1; ENDIF
IF KEY(203)=TRUE; pz#=pz#+1; ENDIF
IF KEY(205)=TRUE; pz#=pz#-1; ENDIF

SHOWSCREEN

WEND
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

kanonet

Zuerst einmal: GLBs 3D Befehle sind wie die 2D Befehle: wie ein Sprite lädst du ein 3D Objekt ein mal und kannst es dann so oft zeichnen wie du willst. Es gibt weder bei Sprites, noch bei 3D Objekten wirkliche Bewegungen, die Illusion einer Bewegung entstehen nur dadurch, dass du das Sprite/3D Objekt in jedem Frame an eine etwas andere Stelle zeichnest als im vorherigen Frame. Bei 3D gibt es nun nicht nur X- und Y-Achse sondern mit der Z-Achse noch eine dritte - die Mathematik wird dadurch zwar etwas komplizierter, jedoch bleibt das Grundprinzip gleich.
Quote from: Metamorphose on 2013-May-22dazu kommt, dass ich es nicht kapiere, dass vorwärts einfach relativ zu der richtung ist, in die man sieht.
Es gibt kein vorwärts oder Rückwärts Bewegen, du änderst in deinem Code lediglich die X-Achse, also Bewegt sich das Objekt (hier die Kamera) auch nur auf der X-Achse. Ist doch das gleich in 2D, wenn du nur eine Achse änderst, ist wird das Sprite auch nur auf dieser Achse rumgeschoben, ebal wie es gedreht ist. Willst du das die Rotation beachtet wird musst du das manuell mit Winkelfunktionen errechnen und entsprechend beide Achsen ändern. Das selbe ist es bei 3D du musst entweder mit Winkelfunktionen alle Achsen beeinflussen, oder gleich mit Matrixmanipulationen anfangen, oder du nutz eine Kombi aus X_Rotation und X_Popmatrix. Matrixmanipulationen ist das beste, X_Popmatrix das einfachste, wobei letzteres nur für Objekte geht, nicht für Kamera oder Lichter. Um Winkelfunktionen und etwas Mathe kommst du aber nicht rund rum, auch ein Grundverständnis des 3D-Raums (und somit von Matrizen) ist extrem hilfreich.
Quote from: Metamorphose on 2013-May-22doch wenn er sich links dreht (oder rechts) hört es ab einem gewissen punkt praktisch auf. er dreht sich dann extrem langsam bis praktisch nicht.
Ganz einfach, was du in deinem Code tust ist das folgende:
X_Camera erwartet die Position der Kamera sowie einen Punkt im Raum auf den sie schauen kann. Du änderst nur einfach die Position indem du sie auf einer Achse rumschiebst, aber die beiden anderen Achsen sowie das Ziel auf das die Kamera schaut unverändert lässt (bzw änderst das Ziel auf nur einer Achse, lässt die beiden anderen Achsen und die Position unverändert). Zwangsläufig entfernen sich Position und Ziel somit immer weiter voneinander was dazu führt, dass der Winkel zwischen Beiden sich immer langsamer ändert, du also immer langsamere Änderungen feststellst, bis sich schließlich scheinbar gar nichts mehr ändert.

Ich weiß, dass klingt jetzt alles etwas sehr kompliziert und kann einen sehr stark abschrecken, aber am Ende ist es durchaus möglich das zu verstehen und bringt einen wirklich weiter. Ich kann nur empfehlen im Web nach ein paar Tutorials zum Thema 3D-Raum und Programmierung in selbigen zu suchen, es ist auf alle Fälle schaffbar, besonders wenn man mit 2D und er zugehörigen Mathematik klar kommt. Das anschauen und manipulieren von fertigen Beispielen hilft auch immer, GLB liefert da ja einige mit, schaue dich einfach mal im entsprechenden Ordner um.

Ansonsten gäbe es noch eine weitere Möglichkeit: statt dich um die ganze Mathe selbst kümmern zu müssen, verwende einfach ein Entity System, dort kannst du dann wirklich einfach sagen, jetzt dreh dich um 36,8° um diese Achse, nun gehe davon ausgehend geradeaus etc... Man hat vielleicht etwas weniger Möglichkeiten, als wenn man alles selbst berechnen würde, dafür ist aber vieles zum Teil deutlich einfacher. Entity Systems die ich empfehlen kann sind:
Gernots großes ES (bin gerade an keinem Rechner mit GLB, denke aber, dass es GLB bereits beiligt)
Mein eigenes, schlankeres ES
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Metamorphose

mkay.
finde ich irgendwo was über diese winkelfunktion und wie ich sie berechnen kann?
hatte ich in der schule früher nicht und wenn, dann ist das viel zu lange her ^^
3d generell ist mir schon klar, hab auch noch was drüber gelesen.
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

kanonet

Winkelfunktion = Sin, Cos, Tan Zeugs. Habt ihr garantiert in der Schule gehabt. ;)
Ansonsten hilft auch Wikipedia und fast jedes Mathematikbuch. Dann erst mal in 2D üben, der Schritt zu 3D ist dann nicht zu schwer. Wenn du einer Rotation folgend "geradeaus" gehen willst, heißt dass, dass du schräg über das Feld willst, dich also über mehrere Achsen bewegst. Wie viel genau pro Achse, kannst du dann mit den genannten Winkelfunktionen errechnen.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64