Strecken per Code erstellen?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

DJ_Mic

Betreff: Strecken per Code erstellen?

BeitragSa, Apr 07, 2012 8:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

ich habe ein paar fragen an euch. Und zwar beschäftige ich mich seit langem damit, wie ich einen Streckeneditor schreiben kann.

Nun bin ich auf zwei Videos gestoßen, sehen von der Streckenkonstruktion gleich aus, so schließe ich darauf, dass sie ihre Strecken nicht mit einem 3D Tool gefertigt haben, sondern mit deren Programmiersprache.

Nun ist meine Frage, ist sowas mögiche?

Das ich zb. nur drei Streckenteile liefere
- Grade aus
- Start
- Finish

Und dann mit einem Streckeneditor kurven, steile kurven etc... erstelle?

Video1:

http://www.youtube.com/watch?v=L7Y5lUZLKHI

Video2:

http://www.youtube.com/watch?v...ature=plcp

Ich möchte keinerlei Codes etc... Ich möchte einfach nur wissen ob es eine Möglichkeit gibt, und wie der Lösungsweg aussehen würde.

Seit Wochen zerbreche ich mir den Kopf mit dieser Frage....

Vielen vielen Dank!

Gruß
Dennis
 

Schagen

BeitragSa, Apr 07, 2012 10:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Zufällig baue ich gerade einen Streckeneditor für meinen Zugsimulator. Das Prinzip dürfte allerdings das selbe sein. Meine Lösung ist bestimmt nicht ideal, aber sie funktioniert Smile

Im Prinzip gibt es bei mir im Streckeneditor ein Type "Gleis". In diesem Type gibt es die Felder
"StartX", "StartY", "EndX","EndY","Höhe","Radius"

Der Editor speichert am Ende alles in einer Datei.

Die Höhe ist immer die Höhe am Ende des Segments, da die Höhe am Anfang natürlich der Höhe am Ende des vorherigen Segments entspricht (Bei Gleisen zumindest). Der Radius ist bei geraden Segmenten Null, bei Kurven entsprechend dem Kurvenradius.

Das Spiel liest die Datei dann ein.

Für die Modelle der Schienen existieren 2 Funktionen:

Die erste erstellt mit den Mesh Befehlen für gerade Schienen das Modell, die zweite mithilfe der Angabe des Radius das Modell der Kurven.

Weitere Funktionen bestehen dann zum fahren der Züge entlang der Strecke.

Ich hoffe du kannst damit was anfangen Wink

MfG Schagen

Midimaster

BeitragSa, Apr 07, 2012 10:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich bin Midimaster vom Tram-Projekt

https://www.blitzforum.de/worklogs/492/

Dort habe wir es so wie Schagen gelöst. Ob das allerdings für Autos auch die beste Lösung ist, kann ich dir nicht sagen.

Das System ist eine Art Streckenbeschreibungssprache. Diese Sprache beschreibt immer die Mitte der Strecke. d.h. die Seitenränder der Straße würden dann mit 90°-Vektoren berechnet werden können.

Diese Sprache kennt nur 3 Schienenarten: GERADE, KURVELINKS, KURVERECHTS. Die GERADE kennt nur 2 Parameter: RICHTUNG und LÄNGE. Da Sie stets an einem bestehenden Stück anknüpft, genügen diese beiden Werte um ihre Lage im Raum zu beschreiben. Aus der Anknüpfstelle und Richtung und Länge lässt sich das Ende der Strecke im Raum berechnen. Das wird dann wieder zum Anküpfpunkt für das nächste Teilstück.

Die KURVE kennt als Parameter RADIUS und WINKEL. Aus RADIUS und Anknüpfpunkt errechnet man den Mittelpunkt MX/MY der gedachten Kreisbahn. Mit dem WINKEL kann man daraus wieder den Endpunkt der Strecke errechnen.

Nun haben wir Formeln entwickelt, die aus diesen Werten eine 3D-Strecke erstellen. Und es gibt eine Formel, die nach Eingabe einer zurückgelegten Fahrstrecke (z.b. 804.5 Meter) die genau Koordinate der Schiene dort zurückgibt. Für Bahn immer wichtig. Bei Auto natürlich quatsch, weil sich ein Auto ja flexibler auf der Bahn bewegt.

Die Streckenführung kennt nun keine "geschwungenen Verläufe", wie man sie z.b. braucht um in einem bestimmten Gelände eine Strecke optimal an die Gegebenheiten anzupassen. Hierzu wäre Dein Thema Splines oder Bezierkurve. Da habe ich aber keine Ahnung.

Hier mal ein Stück von unserem Code, der allerdings in BB ist:

BlitzBasic: [AUSKLAPPEN]
Graphics 1000,800,32,2
SetBuffer BackBuffer()

Const GERADE%=1 , KURVE%=2 , GEGENKURVE%=3

Type SchieneTyp
Field Art% , Lang# , Radius# , Winkel#

End Type

Type GleisTyp
Field X1# , Y1# , X2#, Y2# , Art% , Richtung%
Field GehtNach% , KommtVon% , Lang# , ID% , Farbe%
End Type

Type StreckenInfoTyp
Field X# , Y# , Strecke# , Richtung#
End Type

Dim Schiene.SchieneTyp(10)

Dim Strecke.GleisTyp(100)



Schiene(1)= New SchieneTyp
Schiene(1)\Art= GERADE
Schiene(1)\Lang=100

Schiene(2)=New SchieneTyp
Schiene(2)\Art= KURVE
Schiene(2)\Radius=-100
Schiene(2)\Winkel=-30


Schiene(3)=New SchieneTyp
Schiene(3)\Art= KURVE
Schiene(3)\Radius=100
Schiene(3)\Winkel=60



Strecke(0) = New GleisTyp
Strecke(0)\X1=300
Strecke(0)\Y1=300
Strecke(0)\X2=300
Strecke(0)\Y2=300
Strecke(0)\Richtung=90


AddGleis 1,GERADE,0
AddGleis 2,KURVE,1
;AddGleis 21,GEGENKURVE,2
;AddGleis 22, GERADE, 21
AddGleis 3,GERADE,2
;AddGleis 9,GERADE,1
AddGleis 4,GEGENKURVE,3
AddGleis 6,KURVE,4
AddGleis 5,GERADE,6

AddGleis 8,GEGENKURVE,5
AddGleis 9,GEGENKURVE,8
AddGleis 10,GEGENKURVE,9

AddGleis 11,GERADE,10
AddGleis 12,GERADE,11
AddGleis 13,GERADE,12

Local Weg#
Local Info.StreckenInfoTyp =New StreckenInfoTyp
Global LastFarbe%
Repeat
Cls
For loc.GleisTyp = Each GleisTyp
SetFarbe loc\Farbe
Text (loc\X1 + loc\x2)/2 , loc\y1+10 , "ID=" + loc\Id
Text (loc\X1 + loc\x2)/2 , loc\y1+20 , "L="+loc\Lang
;Text (loc\X1 + loc\x2)/2 , loc\y1+30 , "TY=" + loc\Art
Line loc\x1 , loc\y1 , loc\x2 , loc\y2
Next
info =WoIst(Weg)
Text 0,0, "Frage: Wo ist km "+ Weg + "?"
Text 0,20, "Antwort: In Abschnitt " + Info\Strecke
Text 0,40, "bei X=" + Info\X + " Y=" + Info\Y
Text 0,60, "Richtung dort: " + Info\Richtung
For i=0 To 10 Step 2
info =WoIst(Weg-i*30)
locX=Info\X
locY=Info\Y
info =WoIst(Weg-i*30-50)
Color 255,255,222
Line locX,locY,Info\X,Info\Y
Color 255,255,0

Oval locX , locY , 3,3
Oval Info\X , Info\Y , 3,3
Next
weg=weg+1
Flip ;1
;WaitKey
Until KeyHit(1)



Function AddGleis (Nr% , Art% , An%)
loc.GleisTyp = New GleisTyp
loc\Art=Art
loc\Id=Nr
loc\KommtVon = An
Strecke(An)\GehtNach=Nr
loc\X1=Strecke(An)\X2
loc\Y1=Strecke(An)\Y2

If loc\Art=GERADE
loc\Richtung=Strecke(An)\Richtung
Xadd = Schiene(Art)\Lang * Sin(loc\Richtung)
Yadd = Schiene(Art)\Lang * Cos(loc\Richtung)
loc\X2 = loc\X1 + Xadd
loc\Y2 = loc\Y1 + Yadd
loc\Lang=Schiene(Art)\Lang
Else
MitteRx = loc\X1 + Cos(Strecke(An)\Richtung) * Schiene(Art)\Radius
MitteRy = loc\Y1 - Sin(Strecke(An)\Richtung) * Schiene(Art)\Radius
Oval MitteRx , MitteRy , 5,5
DebugLog "MITTE= " + mitterx + " " + mittery
If Schiene(Art)\Winkel>0
For x=0 To Schiene(Art)\Winkel
Plot mitteRx - Cos(Strecke(An)\Richtung+x) * Schiene(Art)\Radius , mitteRy + Sin(Strecke(An)\Richtung+x) * Schiene(Art)\Radius
Next
Else
For x=0 To -Schiene(Art)\Winkel
Plot mitteRx - Cos(Strecke(An)\Richtung-x) * Schiene(Art)\Radius , mitteRy + Sin(Strecke(An)\Richtung-x) * Schiene(Art)\Radius
Next
EndIf
loc\X2 = mitteRx - Cos(Strecke(An)\Richtung+Schiene(Art)\Winkel) * Schiene(Art)\Radius
loc\Y2 = mitteRY + Sin(Strecke(An)\Richtung+Schiene(Art)\Winkel) * Schiene(Art)\Radius
loc\Richtung=Strecke(An)\Richtung + Schiene(Art)\Winkel
loc\Lang=2 * Schiene(Art)\Radius * Pi / 360 * Schiene(Art)\Winkel
EndIf
loc\Farbe=LastFarbe
LastFarbe=(LastFarbe + 1) Mod 6
;DebugLog xadd + " " + yadd
Strecke(NR)= loc
End Function


Function SetFarbe(Farbe%)
Select Farbe
Case 0
Color 255,0,0
Case 1
Color 0,255,0
Case 2
Color 0,0,255

Case 3
Color 255,0,255

Case 4
Color 0,255,255

Case 5
Color 255,255,255
End Select
End Function





Function WoIst.StreckenInfoTyp(km#)
Local sum# , Diff# , AktGleis% , Info.StreckenInfoTyp =New StreckenInfoTyp


If km<0 Then Return Info

AktGleis=Strecke(AktGleis)\GehtNach

Aktgleis=0
; erst mal grob welcher abschnitt
Repeat
If (sum + Strecke(AktGleis)\Lang) > km Then Exit
sum#=sum + Strecke(AktGleis)\Lang
;DebugLog "Summe=" + sum + " am Ende von Gleis" + AktGleis + " Lang= " + Strecke(AktGleis)\Lang
AktGleis=Strecke(AktGleis)\GehtNach
Forever
Info\Strecke = AktGleis
Diff=km-sum
;DebugLog "diff=" + diff

;jetzt genauer im letzten abschnitt
If Strecke(AktGleis)\Art=GERADE
Info\Richtung = Strecke(AktGleis)\Richtung
Xadd = Diff * Sin(Strecke(AktGleis)\Richtung)
Yadd = Diff * Cos(Strecke(AktGleis)\Richtung)
Info\X = Strecke(AktGleis)\X1 + Xadd
Info\Y = Strecke(AktGleis)\Y1 + Yadd
Else
An=Strecke(AktGleis)\KommtVon
Art=Strecke(AktGleis)\Art
AddWinkel#= Diff / Strecke(AktGleis)\Lang * Schiene(Art)\Winkel
;DebugLog "add winkel=" + addWinkel
Info\Richtung = Strecke(An)\Richtung + AddWinkel
MitteRx = Strecke(AktGleis)\X1 + Cos(Strecke(An)\Richtung) * Schiene(Art)\Radius
MitteRy = Strecke(AktGleis)\Y1 - Sin(Strecke(An)\Richtung) * Schiene(Art)\Radius

Info\X = mitteRx - Cos(Strecke(An)\Richtung+AddWinkel) * Schiene(Art)\Radius
Info\Y = mitteRY + Sin(Strecke(An)\Richtung+AddWinkel) * Schiene(Art)\Radius

EndIf
Return Info
End Function

ZaP

BeitragSa, Apr 07, 2012 10:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

wir verwenden in unserem Projekt Bézierkurven, um einen Pfad zu erstellen, aus dem dann ein Mesh generiert werden kann. Das Bild vom Pfad wird außerdem auf eine Heightmap gelegt, so dass sich das Streckenmesh schön auf das Terrainmesh legt.
Da Du ja recht frei bist, was das Generieren des Streckenmeshes angeht, kannst Du auch die Strecke erhoben machen, so wie in dem Video.

Eine alternative Herangehensweise sehe ich in Strecken-Tiles.
Starfare: Worklog, Website (download)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group