Wie am Besten ein Zugspiel programmieren

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

BastianA

Betreff: Wie am Besten ein Zugspiel programmieren

BeitragSa, Mai 29, 2010 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
die Überschrift des Themas ist nicht gerade passend aber ich habe eine Frage. Wie mache ich es, dass man eine Trambahn auf einer Schiene fahren lässt? Ich habe es erstmal versucht indem ich an den Kurven die gefahrene Meter ermitttelt habe und dann bei einer bestimmten Meterzahl das Objekt gedreht habe, was zwar klappt aber ein Riesenaufwand für eine kleine Kurve ist, die ruckelfrei dargestellt werden soll. Man könnte auch ein Objekt unter die Strecke legen, wo dann auf Kollisionen ermittelt wird und das dann schleifen lassen. Allerdings gehen die Kollisionen in Blitz3D nicht so gut, zumindest habe ich es nicht hinbekommen. Hat jmd. noch eine andere Idee für das fahren auf unsichtbaren Punkten ?

Trust

BeitragSa, Mai 29, 2010 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest es mit Wegpunkten versuchen.
Ich weis ja nicht in wie weit das Zugspiel ausgebaut werden soll, jedoch denke ich mal das man sich selber Strecken bauen kann.

Jetzt könntest du her gehen und verschiedene Streckenabschnitte in einem 3D Modeller modellieren, wie zb. eine Grade, eine Kurve usw.
Dann gehst du her und gibst jedem Streckenabschnitt in dem Modeller
ein Armature(Bones) welche die wegpunkte sind. (Nicht vergessen den Bones auch eindeutige Namen zu geben)
Später kannst du im Code einfach mit GetChild() die Coordinaten der Bones abfragen und den Zug dementsprechen drehen und fahren lassen.

Silver_Knee

BeitragSa, Mai 29, 2010 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst auch allen Kurvenmodels einen Drehpunkt geben und anstelle des fahrens den zug um diesen drehpunkt drehen.... musst dann eben eine Umrechnung von geschwindigkeit->Drehung berechnen

ToeB

BeitragSa, Mai 29, 2010 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Und dann nur noch die Graden mit einem Wegpunkt versehen, und zwar am ende, da man ja vorher noch strecken hat uznd sich sonst zwei wegpunkte überlappen würden.

Oder du machst, was eigl. die schönere und auf schnellere lösung ist, die einen Editor. Da lädst du dann dein Streckenmesh rein und kann dann mit der Maus die Wegpunkte setzten. Oder du machst auch einen Editor, der auf Tiles basiert, also dass man Strecke für strecke anfügt (streckenteile seperat machen). Dann geht der Editor zum schluss alles tiles durch, von vorne bis hinten und erstellt automatisch wegpunkte, somit kannst du sicher gehen das die Wegpunkte immer auf der mitte von den Schienen ist.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

BastianA

BeitragSa, Mai 29, 2010 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, es soll ein Tramsim sein, wo man nur fahren kann, modifzierbar ist er zum Beispiel über Änderung der .3ds. Was sind Bones ? Sorry aber das ist mir unbekannt :S
Wenn die Tram auf 0,0 startet und der Mittelpunkt der Schiene auch auf 0,0 ist, kann man ja schonmal geradeaus fahren. Was ist aber bei einer Kurve? Wenn ich die Meterzahl zähle und bei einer bestimmten Anzahl die Tram um 1,8 Grad drehe, ist das sehr ruckelig. Wenn ich sie jede 50 Zentimeter drehe, ist das immer noch eine Ruckelei und das ganze ist nicht modifizierbar. Kann mir mal jmd. das erklären mit den Bones oder meint ihr das so mit bei einer Koordinate drehen ?
 

Blitzjockey

BeitragSa, Mai 29, 2010 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstens, wenn Du Dein Zug mittels
Code: [AUSKLAPPEN]

 MoveEntity 0, 0, (Geschwindigkeit * Zeit)

verschiebst, ist anschliessend eine rotation um den Yaw (Y)-axis relativ einfach.
Code: [AUSKLAPPEN]

TurnEntity 0, (Drehgeschwindigkeit * Zeit), 0


Geschwindigkeit = der Abstand in "Einheiten pro Sekunde", ich nehme mal an, Meters pro Sekunde.

Zeit = der Zeit die seit der letzte Update vergangen ist. Da Du am Besten der Framerate von Dein Monitor hierfür als Maßstab nimmst, kann man das berechnen mittels: 1 (sec) / Bildfrequenz (in Herz). Wenn Du ein Framerate hast von 60 Fps, kommst Du bei etwa 1/60 = 0.0166667 Sekunden.

Drehgeschwindigkeit = wieviel Grad pro Sekunde Dein Zug drehen soll, um den Gleissen schön zu folgen.

Da "MoveEntity 0, 0, Z" bedeutet das der Zug vorwärts bewegen soll, und bei "TurnEntity 0, Yaw, 0" der Vorwärtsrichtung ja schön gedreht wird, wird es ein fließende Bewegung ergeben (Bei 60 Frames wird Dein Zug also in eine Sekunde 60 kleine Schritten gedreht.)

BastianA

BeitragSo, Mai 30, 2010 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, aber der funktioniert irgendwie nicht. Zeigt keine Reaktion. Ich habe das ganze mal mit einem Drehpunkt gemacht aber sobald ich die Koordinate pasiere, passiert nichts. Der Zug fährt einfach gerade weiter. Was mache ich falsch ?
Code: [AUSKLAPPEN]

Graphics3D 1280, 1024, 32, 0
SetBuffer BackBuffer()
light = CreateLight()
RotateEntity light, 90, 0, 0
AppTitle "VTram 2"
font = LoadFont("Calibri",20,1)
SetFont font

Tram = LoadMesh("1/nikon.3ds")
PositionEntity Tram, 0, 0, 0
RotateEntity Tram, 0, 55, 0

LightMesh Tram, -50, -50, -50, 200, 0, 1, 8

Map = LoadMesh("map.3ds")
PositionEntity map, 0, 0, 0

Box = LoadMesh("Skybox.3ds")
PositionEntity map, 0, 0, 0

Global cam1=CreateCamera(Tram)

CameraRange cam1, 0.001, 40001

PositionEntity cam1, 0, 1.8, 7

;Drehpunkte!
drehpunkt1 = CreatePivot (Tram)
PositionEntity  drehpunkt1, -10.051, 0, -5.7042

CreateLight(1, Tram)
CreateLight(1, Map)

Baum1 = CreateCube()
PositionEntity Baum1, -5, 6, -07
textur1 = CreateTexture (1024, 1024, 4)
textur1 = LoadTexture ("baum7.bmp", 4)
EntityTexture  baum1, textur1
ScaleEntity Baum1, 0.001, 6, 6

Baum1a = CreateCube()
PositionEntity Baum1a, -5, 6, -07
EntityTexture  baum1a, textur1
ScaleEntity Baum1a, 0.001, 6, 6
RotateEntity Baum1a, 0, 90, 0


Global Timer=CreateTimer(60)
Global StartZeit%=MilliSecs()

Global S# = 0
Global G# = 0
Global speed# = 0
Global break# = 0.0008
Global accelerate# = 0.00025
Global force# = 0.0001
Global Gangstufe# = 0
Global Zeit = 0.0166667
Global Drehgeschwindigkeit = 0.5
Global X# = EntityX# (Tram, 1 )
Global Z# = EntityZ# (Tram, 1 )

While Not KeyHit(1)

X# = EntityX# (Tram, 1 )
Z# = EntityZ# (Tram, 1 )


MoveEntity Tram, 0, 0, (Geschwindigkeit * Zeit)
TurnEntity Tram, 0, (Drehgeschwindigkeit * Zeit), 0

If KeyDown (12) Then
Gangstufe# = 9
EndIf
If KeyDown (11) Then
Gangstufe# = 8
EndIf
If KeyDown (10) Then
Gangstufe# = 7
EndIf
If KeyDown (9) Then
Gangstufe# = 6
EndIf
If KeyDown (8) Then
Gangstufe# = 5
EndIf
If KeyDown (7) Then
Gangstufe# = 4
EndIf
If KeyDown (6) Then
Gangstufe# = 3
EndIf
If KeyDown (5) Then
Gangstufe# = 2
EndIf
If KeyDown (4) Then
Gangstufe# = 1
EndIf
If KeyDown (3) Then
Gangstufe# = 0
EndIf
If KeyDown (2) Then
Gangstufe# = -1
EndIf


If Gangstufe# = 1 And speed# < 0.07
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 2 And speed# < 0.14
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 3 And speed# < 0.21
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 4 And speed# < 0.28
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 5 And speed# < 0.35
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 6 And speed# < 0.42
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 7 And speed# < 0.49
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 8 And speed# < 0.56
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 9 And speed# < 0.63
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf


If Gangstufe# = 0 And speed > 0
speed# = speed# - force#
EndIf

If Gangstufe# = 0 And speed < 0
speed# = speed# + force#
EndIf


If Gangstufe# = -1 And speed# < 0.63
speed# = speed# - accelerate# ;accelerate = Beschleunigung
EndIf


MoveEntity Tram, 0, 0, speed#

If X# >= 0.885729 Then
If Z# >=-0.6201993 Then
TurnEntity  Tram, 0, 0, 90
EndIf
EndIf


If KeyDown(14) Then
PositionEntity cam1, 0, 1.8, 7
EndIf

If KeyDown(17) Then
MoveEntity cam1, 0, 0, +0.02
EndIf

 If KeyDown(44)
MoveEntity cam1, 0, 0, +0.2
EndIf

If KeyDown(31) Then
MoveEntity cam1, 0, 0, -0.02
EndIf

If KeyDown(32) Then
MoveEntity cam1, +0.02, 0, 0
EndIf

If KeyDown(201) Then
MoveEntity cam1, 0, +0.01, 0
EndIf

If KeyDown(209) Then
MoveEntity cam1, 0, -0.01, 0
EndIf

If KeyDown(30) Then
MoveEntity cam1, -0.02, 0, 0
EndIf

If KeyDown(16) Then
TurnEntity cam1,0,+10,0
EndIf

If KeyDown(18) Then
TurnEntity cam1,0,-10,0
EndIf


SoundId=LoadSound("Sounds\Motor2.wav")
LoopSound SoundId

If KeyDown(11) Then
Ma = Ma + 1
If Ma = 1 Then ChannelId=PlaySound(SoundId)
If Ma = 2 Then StopChannel ChannelId
If Ma = 3 Then Ma = 0
EndIf
SoundPitch SoundId, speed#*20000

UpdateWorld
RenderWorld
Text 0,10,"Aktuelle Geschwindigkeit: " + speed*100
Text 0,25,"Aktuelle Fahrstufe: " + gangstufe#
Text 0,40,"Gefahrene Meter: OFFLINE! WIP!"
Text 0,55,"Aktuelle Uhrzeit: "
Text 120,55,(MilliSecs()-StartZeit) / 1000 + 120000
Text 0,70,X#
Text 0,85,Z#
Flip
Wend
End
 

Blitzjockey

BeitragSo, Mai 30, 2010 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, um ehrlich zu sein, ich habe Dein ganze Code durchgelesen, aber nicht 'bestudiert.'

Nichtdestotrotz (und dass ist teilw. meine Fehler, ich hätte Dich darauf hinweisen können) ein paar Tipps:

-"Drehgeschwindigkeit", "Geschwindigkeit" und "Zeit" natürlich als Float (#) deklarieren. Zeit = 0.016777 ist bei Dir jetzt 0, statt 0.0167. Und Geschwindigkeit hast Du gar nicht deklariert, das ist jetzt auf jedem Fall 0.

- Zweitens ist es nicht V1 = v0 + a, sondern V1 = V0 + a * Delta t. (Dein Formel für geschwindigkeit, meine ich damit)

- Dann berechnest Du mit diese (falsche, aber wirksame) Formel ein Speed, den Du jetzt in Dein alte Tram-bewegung benutzt, und nicht in 'meine' Version. Das heisst, eigentlich hast Du schon was eingefügt, aber die Stücken sind falsch angewendet und können so gar nicht funktionieren.

- Den ganze Gangschaltungs-if's könntest Du ersetzen mittels:
Code: [AUSKLAPPEN]

 If ( speed# / 0.07 ) < Gangschaltung then
     speed# = speed# + accelerate * deltaT
end if

Wobei Delta t vielleicht von Dir schon reingerechnet worden ist in der Beschleunigung, soweit habe ich jetzt nicht gesucht.
Dann wird automatisch den Gangschaltung mit der Geschwindigkeit verglichen, spart Dir eine unmenge Schreibarbeit, und es sieht übersichtlicher aus.


Also, ich würde Dich empfehlen Deine Code etwas auf zu räumen, dass hier Oben mit rein zu nehmen, und (wenn es immer noch nicht funktioniert) hier erneut rein zu stellen. Dann können wir noch mal weiter schauen?

Schöne Grüße,
BlitzJ.

BastianA

BeitragSo, Mai 30, 2010 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Oke, Drehgeschwindigkeit und Zeit habe ich als Float deklariert.

Ich habe versucht die Gangschaltung Ifs zu ersetzen, allerdings konnte man dann nicht mehr losfahren.

Vor lauter Gangschaltungen sind wir eigentlich nicht vom Thema abgewiechen. denn der Motor ist so wie in Echt auch. Das Hauptrproblem sind immer noch die Kurven, weil jetzt kann man nur gerade fahren. Hier mal ein Bild wo ich den Pivot gesetzt habe.

Naja bei der Geschwindigkeit stimmt vieles nicht, ich finde dass das beim Fahren viel mehr km/h ist da stimmt die Umrechnung noch nicht ganz.

Also die Startkoordinate ist 0,0 und die Tram wird um 55 Grad gedreht.
Habe hier mal eine Veranschauung gemacht:
user posted image


Wenn die Tram an dem Roten Strich ist, soll sie sich um 125 Grad drehen. Das Pivot ist auf dem Mittelpunkt des Quaders in der Mitte. Der Abstand von dem Quader zur Schiene ist immer gleich = Radius.

Warum geht der Code nicht, also mal gekürzt.

Als Erstes wird bei den Variablen X und Y deklariert:
Code: [AUSKLAPPEN]

Global X# = EntityX# (Tram, 1 )
Global Z# = EntityZ# (Tram, 1 )

While Not KeyHit(1)

X# = EntityX# (Tram, 1 )
Z# = EntityZ# (Tram, 1 )


Nun möchte ich das wenn sie eine bestimmte Koordiante erreicht hat, sich um 125 Grad dreht.
Code: [AUSKLAPPEN]

If X# >= 0.885729 Then
If Z# >=-0.6201993 Then
TurnEntity  Tram, 0, 0, 90
EndIf
EndIf


MoveEntity kann man ja immer noch selber bestimmen. An der angegeben Koordinate passiert nichts, die Tram fährt einfach gerade weiter. Was mache ich falsch ?

Kompletter Code:
Code: [AUSKLAPPEN]

Graphics3D 1280, 1024, 32, 0
SetBuffer BackBuffer()
light = CreateLight()
RotateEntity light, 90, 0, 0
AppTitle "VTram 2"
font = LoadFont("Calibri",20,1)
SetFont font

Tram = LoadMesh("1/nikon.3ds")
PositionEntity Tram, 0, 0, 0
RotateEntity Tram, 0, 55, 0

LightMesh Tram, -50, -50, -50, 200, 0, 1, 8

Map = LoadMesh("map.3ds")
PositionEntity map, 0, 0, 0

Box = LoadMesh("Skybox.3ds")
PositionEntity map, 0, 0, 0

Global cam1=CreateCamera(Tram)

CameraRange cam1, 0.001, 40001

PositionEntity cam1, 0, 1.8, 5.5

;Drehpunkte!
drehpunkt1 = CreatePivot (Tram)
PositionEntity  drehpunkt1, -10.051, 0, -5.7042

CreateLight(1, Tram)
CreateLight(1, Map)

Baum1 = CreateCube()
PositionEntity Baum1, -5, 6, -07
textur1 = CreateTexture (1024, 1024, 4)
textur1 = LoadTexture ("baum7.bmp", 4)
EntityTexture  baum1, textur1
ScaleEntity Baum1, 0.001, 6, 6

Baum1a = CreateCube()
PositionEntity Baum1a, -5, 6, -07
EntityTexture  baum1a, textur1
ScaleEntity Baum1a, 0.001, 6, 6
RotateEntity Baum1a, 0, 90, 0


Global Timer=CreateTimer(60)
Global StartZeit%=MilliSecs()

Global S# = 0
Global G# = 0
Global speed# = 0
Global break# = 0.0008
Global accelerate# = 0.00025
Global force# = 0.0001
Global Gangstufe# = 0
Global Zeit# = 0.0166667
Global Drehgeschwindigkeit# = 0.5
Global Geschwindigkeit# = 0
Global X# = EntityX# (Tram, 1 )
Global Z# = EntityZ# (Tram, 1 )

While Not KeyHit(1)

X# = EntityX# (Tram, 1 )
Z# = EntityZ# (Tram, 1 )


MoveEntity Tram, 0, 0, (Geschwindigkeit * Zeit)


If KeyDown (12) Then
Gangstufe# = 9
EndIf
If KeyDown (11) Then
Gangstufe# = 8
EndIf
If KeyDown (10) Then
Gangstufe# = 7
EndIf
If KeyDown (9) Then
Gangstufe# = 6
EndIf
If KeyDown (8) Then
Gangstufe# = 5
EndIf
If KeyDown (7) Then
Gangstufe# = 4
EndIf
If KeyDown (6) Then
Gangstufe# = 3
EndIf
If KeyDown (5) Then
Gangstufe# = 2
EndIf
If KeyDown (4) Then
Gangstufe# = 1
EndIf
If KeyDown (3) Then
Gangstufe# = 0
EndIf
If KeyDown (2) Then
Gangstufe# = -1
EndIf


If Gangstufe# = 1 And speed# < 0.07
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 2 And speed# < 0.14
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 3 And speed# < 0.21
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 4 And speed# < 0.28
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 5 And speed# < 0.35
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 6 And speed# < 0.42
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 7 And speed# < 0.49
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 8 And speed# < 0.56
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 9 And speed# < 0.63
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf


If Gangstufe# = 0 And speed > 0
speed# = speed# - force#
EndIf

If Gangstufe# = 0 And speed < 0
speed# = speed# + force#
EndIf


If Gangstufe# = -1 And speed# < 0.63
speed# = speed# - accelerate# ;accelerate = Beschleunigung
EndIf


MoveEntity Tram, 0, 0, speed#

If X# >= 0.885729 Then
If Z# >=-0.6201993 Then
TurnEntity  Tram, 0, 0, 90
MoveEntity Tram, 0, 0, speed#
EndIf
EndIf


If KeyDown(14) Then
PositionEntity cam1, 0, 1.8, 5.5
EndIf

If KeyDown(17) Then
MoveEntity cam1, 0, 0, +0.02
EndIf

 If KeyDown(44)
MoveEntity cam1, 0, 0, +0.2
EndIf

If KeyDown(31) Then
MoveEntity cam1, 0, 0, -0.02
EndIf

If KeyDown(32) Then
MoveEntity cam1, +0.02, 0, 0
EndIf

If KeyDown(201) Then
MoveEntity cam1, 0, +0.01, 0
EndIf

If KeyDown(209) Then
MoveEntity cam1, 0, -0.01, 0
EndIf

If KeyDown(30) Then
MoveEntity cam1, -0.02, 0, 0
EndIf

If KeyDown(16) Then
TurnEntity cam1,0,+02.5,0
EndIf

If KeyDown(18) Then
TurnEntity cam1,0,-02.5,0
EndIf


SoundId=LoadSound("Sounds\Motor2.wav")
LoopSound SoundId

If KeyDown(11) Then
Ma = Ma + 1
If Ma = 1 Then ChannelId=PlaySound(SoundId)
If Ma = 2 Then StopChannel ChannelId
If Ma = 3 Then Ma = 0
EndIf
SoundPitch SoundId, speed#*20000

UpdateWorld
RenderWorld
Text 0,10,"Aktuelle Geschwindigkeit: " + speed*100
Text 0,25,"Aktuelle Fahrstufe: " + gangstufe#
Text 0,40,"Gefahrene Meter: OFFLINE! WIP!"
Text 0,55,"Aktuelle Uhrzeit: "
Text 120,55,(MilliSecs()-StartZeit) / 1000 + 120000
Text 0,70,X#
Text 0,85,Z#
Flip
Wend
End
 

Blitzjockey

Betreff: /Sec

BeitragSo, Mai 30, 2010 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast Glück, Werbung während NCIS...

Also, ich habe wieder kein Zeit Deine ganze Code zu durchforschen, werde es aber nachher näher anschauen. Erst mal folgendes:

Hast Du den ersten Gang eingelegt? In dem fall müsste er eigentlich mindestens bis 0.07 (m/s?) beschleunigen?

weiter:

Code: [AUSKLAPPEN]
TurnEntity 0, 0, 90...


Wo ist erstens Deine 125°? Ich sehe hier:

Eine rotation um eine relative wert. Von 90°?
- auf einmal? (Das heisst, frame X, wert ist 0°, Frame X+1 (also, eigentlich sofort) 90° weiter,linksrum.
- Um der Roll-axis? Das heists, der Zug wird auf seine Kante geschmissen? (Turn um den Yaw-axis ist der Y-axis, der mittlere Wert)
- Und, wenn ich Deine Code richtig lese, sobald er an dem Punkt X, -Z vorbei ist, fangt er an zu drehen. Da er aber nicht weiss wann es genug ist, bleibt er wie eine Wilde rumdrehen. Um der Roll-axis. Wie ein Flugzeug.

Aber, zugegeben, ich habe Deine Code hier noch nicht im Blitz getested. Siehst Du Dein Zug während der Fahrt? Dreht er sich nicht um den Z-axis? (Just checking)

Bis gleich!
BlitzJ.

EDIT: Nachher:

So, Bastian, bezüglich der nicht-passende Geschwindigkeit: Hast Du eine algemeine Einheit für Abstand festgelegt?
Dein Kamera ist z.B. auf 40.000 einheiten eingestellt. 40 kilometer? Das ist, wenn man in eine Zug sitzt, ein bisschen viel.
Dann ist natürlich die Frage, welche Größe (in den gleiche Einheit wie Dein festgelegte Einheit) hat Dein Zug? Wenn das nämlich nicht passt, sieht es zu langsam/schnell aus.

Wenn Du ein Pivot zum drehen gebrauchen möchtest, muss der Pivot der Parent von der Tram sein. Nicht andersrum. (Du gibst, in Deine Code, der Tram als Parent des Pivot an)
Aber, in dem "richtigen" Fall, muss der Pivot während der Kurve auf der richtige Stelle stehen - und der Zug darf dann kein MoveEntity benutzen, dass wird alles von der Pivot gemacht (Wenn er richtig steht..)

Ansonsten steht da immer noch sowohl "meine" MoveEntity (Geschwindigkeit * Zeit) als "Deine" (Weg).
Welche der Beide Du wegnimmst ist nicht so wichtig, aber beide stehen lassen ist nicht sehr zweckmäßig.

So, jetzt mal beim Pivot-Methode:

- Pivot als Parent erklären vom Tram, nicht andersrum.
- Pivot auf der richtige Position stellen (aber ich glaube, das hast Du schon)
- In dem Moment wo der Zug bei der Kurve ankommt, kein MoveEntity mehr auf der Tram ausführen, sondern
- RotateEntity Pivot, 0, X, 0 ;Wobei X hier steht für den Gradzahl der der Pivot pro Durchgang drehen soll.
- Wenn der Kurve vorbei ist, aufhören mit RotateEntity Pivot, und weitermachen mit MoveEntity Tram.

Bezüglich X: Das ist natürlich abhängig von der Tram-Geschwindigkeit. Rollt er schneller, muss er auch mehr Grad°/sek drehen.

BastianA

BeitragSo, Mai 30, 2010 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ja, das sind 7 kmh im Ersten Gang auf die Beschleunigt er dann auch, wenn ich dann aber in den zweiten Gang schalte mit deinem Code bleibt er bei den 7 kmh?

Ja, das war ein Fehler von mir mit dem 90Grad müsste so heißen:
Code: [AUSKLAPPEN]

TurnEntity  Tram, 0, 0, 125

Mit der Kamera hat das wenig zu tun, die 4001 sind nur wegen der Skybox Wink

Die Größe Maßstäbe verwende ich wie in Echt als Scale Factor vom Anim8or = 1.

Naja also im Moment passiert bei der Koordinate nichts, der Zug fährt einfach gerade weiter.

Pivot als Parent erklären ?

Also den Code kann man raushauen, der ist recht unnütz
Code: [AUSKLAPPEN]

MoveEntity Tram, 0, 0, (Geschwindigkeit * Zeit)


Code: [AUSKLAPPEN]

drehpunkt1 = CreatePivot (Tram)
PositionEntity  drehpunkt1, -10.051, 0, -5.7042


Ja Es ist Parent von der Tram, aber wenn ichs von der Map nehme, bringt es ja nicht viel, oder ?
Etwas so ?
Code: [AUSKLAPPEN]

If X# >= 0.885729 Then
If Z# >=-0.6201993 Then
RotateEntity Pivot, 0, 125, 0
EndIf
EndIf


Und wie ermittle ich ob die Drehung fertig ist ? Man könnte es ja wieder mithilfe der Koordinate machen also
Code: [AUSKLAPPEN]

If X# >= -11.101 Then
If Z# >= 16.957 Then
MoveEntity Tram, 0, 0, speed#
EndIf
EndIf
 


Mit dem Code passiert wieder nichts, die Tram fährt einfach weiter wie als ob der Drehpunkt nicht da wäre. Liegt warscheinlich an.

Also im Kurztext: Wie kann ich den Pivot als Parent von der Tram machen ?


EDIT:
Code: [AUSKLAPPEN]

EntityParent Tram, drehpunkt1, 1


Wenn ich das so mache, lädt er 30sec und der Bildschirm bleibt schwarz, dann kommt so ein Windows Warnton und der komplette Prozess Blitz Basic + Debugger wird einfach geschlossen
 

Blitzjockey

BeitragSo, Mai 30, 2010 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
- 125° auf einmal? Das heisst, in 1 Rück? Das ist zuviel, das geht nicht. (Geht schon, sieht aber sch....e aus.)
- 125° als "dritte" Wert bij TurnEntity bedeutet ein Rotation um den Z-Axis, und das wiederum heisst, er kippt auf die Kante, er macht also gar keine Kurve. Er fährt geradeaus weiter, nur das er jetzt auf die Seite liegt. (Aber ich sehe, das hast Du bei den Pivot schon auf der richtige Stelle gesetzt)
- Mit den function Pivot = CreatePivot(Tram) sagst Du das Pivot ein Child vom Tram ist. Und das ist falschrum. Besser wäre, Du schreibst:
Code: [AUSKLAPPEN]

DrehPunkt1 = CreatePivot()
EntityParent Tram, Pivot


Meine Code taucht sehr wohl was, nur nicht innerhalb Deine Code da Du einen anderen Ansatz benutzt. Cool Aber das ist eine ganz andere Geschichte.

Tja, das mit den Pivot ist so'ne Sache. Das Funktioniert schon (wenn Du Dein Code ein wenig änderst). Aber dann auch nur bei diese eine Kurve. Oder Du müsstest bei jeder Kurve eine neue Pivot zuweisen, und der Alte ausschalten..
Und, wie Du siehst, Du müsstest sowohl Anfangspunkt als Endpunkt von der Kurve irgendwie bestimmen können.

Das wird insgesammt ein ganz schön komplizierte Sache.
 

Blitzjockey

BeitragSo, Mai 30, 2010 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
BastianA hat Folgendes geschrieben:


EDIT:
Code: [AUSKLAPPEN]

EntityParent Tram, drehpunkt1, 1


Wenn ich das so mache, lädt er 30sec und der Bildschirm bleibt schwarz, dann kommt so ein Windows Warnton und der komplette Prozess Blitz Basic + Debugger wird einfach geschlossen


Ich hoffe, Du hast
Code: [AUSKLAPPEN]
local drehpunkt1 = CreatePivot()

nicht gelöscht, bzw. CreatePivot(Tram) geändert in CreatePivot()?

BastianA

BeitragMo, Mai 31, 2010 7:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe jetzt alles so gemacht wie du in deinem letzte Post geschrieben hast. Funzt immer noch nicht. Aber ich würde die Drehungen schon lieber mit Pivots machen weil dann hat man eine gleichmäßige Drehung.
CODE GEKÜRZT:
Code: [AUSKLAPPEN]

Tram = LoadMesh("1/nikon.3ds")
PositionEntity Tram, 0, 0, 0
RotateEntity Tram, 0, 55, 0

Map = LoadMesh("map.3ds")
PositionEntity map, 0, 0, 0

Box = LoadMesh("Skybox.3ds")
PositionEntity map, 0, 0, 0

Global cam1=CreateCamera(Tram)

CameraRange cam1, 0.001, 40001

PositionEntity cam1, 0, 1.8, 5.5

;Drehpunkte!
Local drehpunkt1 = CreatePivot()
PositionEntity  drehpunkt1, -10.051, 0, -5.7042

EntityParent Tram, Pivot

Global Timer=CreateTimer(60)
Global StartZeit%=MilliSecs()

Global S# = 0
Global G# = 0
Global frameX# = 0
Global speed# = 0
Global break# = 0.0008
Global accelerate# = 0.00025
Global force# = 0.0001
Global Gangstufe# = 0
Global Zeit# = 0.0166667
Global Drehgeschwindigkeit# = 0.5
Global Geschwindigkeit# = 0
Global X# = EntityX# (Tram, 1 )
Global Z# = EntityZ# (Tram, 1 )

While Not KeyHit(1)

X# = EntityX# (Tram, 1 )
Z# = EntityZ# (Tram, 1 )

....

If X# >= 0.885729 Then
If Z# >=-0.6201993 Then
RotateEntity Pivot, 0, 90, 0
EndIf
EndIf

If X# >= -11.101 Then
If Z# >= 16.957 Then
MoveEntity Tram, 0, 0, speed#
EndIf
EndIf


Immer noch das gleiche Problem wie am Anfang. Soll ich jetzt "local drehpunkt1 = CreatePivot()" oder "local drehpunkt1 = CreatePivot(Tram)" schreiben ? Beides ändert aber nichts Sad

Ich dachte ein Pivot dreht ein Objekt in dem Radius wo das Objekt entfernt ist, weil dann würde es genau hinkommen. Ja, es sind 125 Grad, da die Tram am Anfang um 55 Grad gedreht ist Wink

125 habe ich als zweite hingeschrieben ändert aber auch nichts. Auch wenn ich die 125 als Erstes hinschreibe Sad

Ja, das wird kompliziert, aber eine einfacher Lösung wäre besser als die Pivots.

mpmxyz

BeitragMo, Mai 31, 2010 8:18
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Local drehpunkt1 = CreatePivot() ;CreatePivot(Tram) würde den Pivot an den dem Zug angehängt erstellen. -> Der Punkt könnte sich mit dem Zug drehen. In der dritten dieser Zeilen gäbe es dann aber einen Absturz mit entsprechender Fehlermeldung, weil dort festgelegt wird, dass der Zug an den Pivot angehängt wird, aber dieser schon am Zug hängt.
PositionEntity drehpunkt1, -10.051, 0, -5.7042

EntityParent Tram, drehpunkt1 ;"pivot" gab es nie -> Grund für Absturz


Nun etwas anderes:
BlitzBasic: [AUSKLAPPEN]
RotateEntity drehpunkt1, 0, 90, 0 ;<-Pivot wurde ja nirgendwo definiert!

Weißt du, was das macht?
>Ja, es dreht den Pivot mit der "angehängten" Bahn um 90°.
Aber wann ist das Programm mit der Drehung fertig?
>Sofort!
Da ein Zug eine Kurve aber nicht mit achtfacher Lichtgeschwindigkeit durchfährt, wird man eine Bewegung erkennen müssen. (1° pro Frame macht z.B. 1,5 Sekunden für eine 90°-Kurve bei 60 fps)
Du kannst also nicht gleich die Bahn um die ganze Kurve "teleportieren" lassen.
Stattdessen sollte sie sich jeden Frame Schritt für Schritt bewegen.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

BastianA

BeitragMo, Mai 31, 2010 9:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit den Timern blicke ich noch nciht so durch, ist bei Delphi und VB ganz anders.
Mein aktueller Code bei dem IF:
Code: [AUSKLAPPEN]

If X# >= 0.885729 Then
If Z# >=-0.6201993 Then
If MilliSecs() > ms Then
RotateEntity drehpunkt1, 0, 1.5, 0
ms=MilliSecs()+2000
EndIf
EndIf
EndIf

Was ist daran falsch, funzt immer noch nicht.
Die Framerate habe ich auf 60 PFS.
Den Rest wo du geschrieben hast habe ich alles geändert. Kompletter Code:
Code: [AUSKLAPPEN]

Graphics3D 1280, 1024, 32
SetBuffer BackBuffer()
light = CreateLight()
RotateEntity light, 90, 0, 0
AppTitle "VTram 2"
font = LoadFont("Calibri",20,1)
SetFont font
Tram = LoadMesh("1/nikon.3ds")
PositionEntity Tram, 0, 0, 0
RotateEntity Tram, 0, 55, 0

LightMesh Tram, -50, -50, -50, 200, 0, 1, 8

Map = LoadMesh("map.3ds")
PositionEntity map, 0, 0, 0

Box = LoadMesh("Skybox.3ds")
PositionEntity map, 0, 0, 0

Global cam1=CreateCamera(Tram)

CameraRange cam1, 0.001, 40001

PositionEntity cam1, 0, 1.8, 5.5

;Drehpunkte!
Local drehpunkt1 = CreatePivot()
PositionEntity  drehpunkt1, -10.051, 0, -5.7042

EntityParent Tram, drehpunkt1

CreateLight(1, Tram)
CreateLight(1, Map)

Baum1 = CreateCube()
PositionEntity Baum1, -5, 6, -07
textur1 = CreateTexture (1024, 1024, 4)
textur1 = LoadTexture ("baum7.bmp", 4)
EntityTexture  baum1, textur1
ScaleEntity Baum1, 0.001, 6, 6

Baum1a = CreateCube()
PositionEntity Baum1a, -5, 6, -07
EntityTexture  baum1a, textur1
ScaleEntity Baum1a, 0.001, 6, 6
RotateEntity Baum1a, 0, 90, 0

Local ms=MilliSecs()+0060 ;Zeit

Global Timer=CreateTimer(60)
Global StartZeit%=MilliSecs()

Global S# = 0
Global G# = 0
Global frameX# = 0
Global speed# = 0
Global break# = 0.0008
Global accelerate# = 0.00025
Global force# = 0.0001
Global Gangstufe# = 0
Global Zeit# = 0.0166667
Global Drehgeschwindigkeit# = 0.5
Global Geschwindigkeit# = 0
Global X# = EntityX# (Tram, 1 )
Global Z# = EntityZ# (Tram, 1 )

While Not KeyHit(1)

X# = EntityX# (Tram, 1 )
Z# = EntityZ# (Tram, 1 )

If KeyDown (12) Then
Gangstufe# = 9
EndIf
If KeyDown (11) Then
Gangstufe# = 8
EndIf
If KeyDown (10) Then
Gangstufe# = 7
EndIf
If KeyDown (9) Then
Gangstufe# = 6
EndIf
If KeyDown (8) Then
Gangstufe# = 5
EndIf
If KeyDown (7) Then
Gangstufe# = 4
EndIf
If KeyDown (6) Then
Gangstufe# = 3
EndIf
If KeyDown (5) Then
Gangstufe# = 2
EndIf
If KeyDown (4) Then
Gangstufe# = 1
EndIf
If KeyDown (3) Then
Gangstufe# = 0
EndIf
If KeyDown (2) Then
Gangstufe# = -1
EndIf


If Gangstufe# = 1 And speed# < 0.07
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 2 And speed# < 0.14
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 3 And speed# < 0.21
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 4 And speed# < 0.28
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 5 And speed# < 0.35
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 6 And speed# < 0.42
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 7 And speed# < 0.49
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 8 And speed# < 0.56
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf

If Gangstufe# = 9 And speed# < 0.63
speed# = speed# + accelerate# ;accelerate = Beschleunigung
EndIf


If Gangstufe# = 0 And speed > 0
speed# = speed# - force#
EndIf

If Gangstufe# = 0 And speed < 0
speed# = speed# + force#
EndIf


If Gangstufe# = -1 And speed# < 0.63
speed# = speed# - accelerate# ;accelerate = Beschleunigung
EndIf

MoveEntity Tram, 0, 0, speed#

If X# >= 0.885729 Then
If Z# >=-0.6201993 Then
If MilliSecs() > ms Then
RotateEntity drehpunkt1, 0, 1.5, 0
ms=MilliSecs()+2000
EndIf
EndIf
EndIf

If X# >= -11.101 Then
If Z# >= 16.957 Then
MoveEntity Tram, 0, 0, speed#
EndIf
EndIf


If KeyDown(14) Then
PositionEntity cam1, 0, 1.8, 5.5
EndIf

If KeyDown(17) Then
MoveEntity cam1, 0, 0, +0.02
EndIf

 If KeyDown(44)
MoveEntity cam1, 0, 0, +0.2
EndIf

If KeyDown(31) Then
MoveEntity cam1, 0, 0, -0.02
EndIf

If KeyDown(32) Then
MoveEntity cam1, +0.02, 0, 0
EndIf

If KeyDown(201) Then
MoveEntity cam1, 0, +0.01, 0
EndIf

If KeyDown(209) Then
MoveEntity cam1, 0, -0.01, 0
EndIf

If KeyDown(30) Then
MoveEntity cam1, -0.02, 0, 0
EndIf

If KeyDown(16) Then
TurnEntity cam1,0,+02.5,0
EndIf

If KeyDown(18) Then
TurnEntity cam1,0,-02.5,0
EndIf


SoundId=LoadSound("Sounds\Motor2.wav")
LoopSound SoundId

If KeyDown(11) Then
Ma = Ma + 1
If Ma = 1 Then ChannelId=PlaySound(SoundId)
If Ma = 2 Then StopChannel ChannelId
If Ma = 3 Then Ma = 0
EndIf
SoundPitch SoundId, speed#*20000

UpdateWorld
RenderWorld
Text 0,10,"Aktuelle Geschwindigkeit: " + speed*100
Text 0,25,"Aktuelle Fahrstufe: " + gangstufe#
Text 0,40,"Gefahrene Meter: OFFLINE! WIP!"
Text 0,55,"Aktuelle Uhrzeit: "
Text 120,55,(MilliSecs()-StartZeit) / 1000 + 120000
Text 0,70,X#
Text 0,85,Z#
Flip
Wend
End


mfg Bastian

Midimaster

BeitragMo, Mai 31, 2010 10:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe hier mal eine Idee, wie man die Tram einem Pfad folgen lassen könnte:

Die Parameter FahrStrecke#, Winkel# und Abschnitt# lösen dabei Aktionen aus:

Geradeausfahrten:
BlitzBasic: [AUSKLAPPEN]
...
If Fahrstrecke>12 And Abschnitt=0 Then
Abschnitt=1
ElseIf Fahrstrecke>60 And Abschnitt=2 Then
Abschnitt=3
...


bzw:

Kurvenfahrten:
BlitzBasic: [AUSKLAPPEN]
...
If Abschnitt=1 Then
If Winkel#<82 Then
TurnEntity tram,0,.3,0
Else
Abschnitt=2
EndIf
ElseIf Abschnitt=3 Then
...

Dabei gibt es immer einen Wechsel zwischen Geradeausfahrten, die durch das Erreichen einer bestimmten FahrStrecke# beendet werden und Kurverfahrten, die durch das Erreichen eines Winkel# beendet werden.

In den Kurven bestimmst du den Radius einfach durch einen kleineren oder größeren und die Richtung durch einen positiven oder negativen Wert am 2. Parameter bei TurnEntity...

Dabei musst du etwas herumexperimetieren, bis der 2.Parameter zu deinem Wunschradius passt.
BlitzBasic: [AUSKLAPPEN]
....
;weiterBogen nach links
TurnEntity tram, 0, .3, 0

;enger Bogen nach rechts:
TurnEntity tram, 0, -.5, 0

; superenger Bogen nach links:
TurnEntity tram, 0, 1, 0



Die Fahrt selbst wird durch...
BlitzBasic: [AUSKLAPPEN]
	MoveEntity Tram,0,0,.1
FahrStrecke#=FahrStrecke+.1

...festgelegt. Die Variable Fahrstrecke# wird immer um den gleichen Wert erhöht wie das Entity selbst bewegt wird.


Die Variable Winkel# gibt immer die Himmelsrichtung an, die deine Tram gerade erreicht hat. Dadurch kannst du die Kurverfahrt genau dann verlassen, wenn die Tram in eine bestimmte Richtung fährt.

Feststellen der Himmelsrichtung:
BlitzBasic: [AUSKLAPPEN]
	winkel=(EntityYaw(tram)+360) Mod 360





Hier ein komplett lauffähiges Demo:

[Edit]
Mit kleineren Schritten die Genauigkeit erhöht


(ist viel Schnickschnack dabei, damit man es sich optisch besser vorstellen kann)
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600
Tram=CreateCube()
MoveEntity tram, 0,1,0


Camera=CreateCamera(Tram)
CameraFogMode camera,1
CameraFogColor Camera,255,255,255
CameraFogRange Camera,1,300


;Zufalls_Landschaft:
SeedRnd 12345
;Boden:
Boden=CreatePlane()
EntityColor boden,115,115,115
;Himmel:
Himmel=CreateSphere(32)
FlipMesh himmel
ScaleEntity Himmel,800,99,800
EntityColor himmel,0,0,255
MoveEntity himmel,0,0,00
; einige Häuser:
For i=0 To 95
b=CreateCube()
ScaleEntity b, Rand(4),Rand(8),Rand(4)
EntityColor b,Rand(255),Rand(255),Rand(255)
MoveEntity b,100-Rand(200),0,100-Rand(200)
Next
; Beleuchtung:
Licht=CreateLight()
TurnEntity licht, 0,90,0
MoveEntity licht,-30,30,30
; Wahrzeichen (Startpunkt)
StartTurm=CreateCylinder()
ScaleEntity StartTurm,1,200,1
MoveEntity StartTurm, -3,0,0

;einmal am Wahrzeichen vorbei:
Fahrstrecke#=-20
MoveEntity tram,0,0,-20


Repeat

RenderWorld()
Text 10,20, "Weg:" + Int(FahrStrecke#)
Text 10,40, "Himmelsrichtung:" + Int(Winkel#)
Text 10,60, "Position-X:" + Int(EntityX(Tram))
Text 10,80, "Position-Y:" + Int(EntityZ(Tram))
Text 10,100, "Abschnitt:" + Int(Abschnitt)
Text 10,550, "Press P for PAUSE"
Flip 0

For I=0 To 9
MoveEntity Tram, 0, 0, .01
FahrStrecke#=FahrStrecke+.01


;Geradeausfahrten:
If Fahrstrecke>12 And Abschnitt=0 Then
Abschnitt=1
ElseIf Fahrstrecke>60 And Abschnitt=2 Then
Abschnitt=3
ElseIf Fahrstrecke>86 And Abschnitt=4 Then
Abschnitt=5
ElseIf Fahrstrecke>160 And Abschnitt=6 Then
Abschnitt=7
ElseIf Fahrstrecke>188 And Abschnitt=8 Then
Abschnitt=9
ElseIf Fahrstrecke>235 And Abschnitt=10 Then
Abschnitt=11
Else

EndIf



;Kurvenfahrten:
If Abschnitt=1 Then
If Winkel#<82 Then
TurnEntity tram,0,.03,0
Else
Abschnitt=2
EndIf
ElseIf Abschnitt=3 Then
If (Winkel#>0) And (Winkel<83) Then
TurnEntity tram,0,-.05,0
Else
Abschnitt=4
EndIf
ElseIf Abschnitt=5 Then
If Winkel#>270 Then
TurnEntity tram, 0, -.05, 0
Else
Abschnitt=6
EndIf
ElseIf Abschnitt=7 Then
If Winkel#>125 Then
TurnEntity tram, 0, -.05, 0
Else
Abschnitt=8
EndIf
ElseIf Abschnitt=9 Then
If Winkel#<180 Then
TurnEntity tram, 0, 0.1, 0
Else
Abschnitt=10
EndIf
ElseIf Abschnitt=11 Then
If Winkel#>1 Then
TurnEntity tram,0 , -.045, 0
Else
PositionEntity Tram,0,1,0
RotateEntity Tram,0,0,0
FahrStrecke=0
Abschnitt=0
EndIf
Else

EndIf

; Himmelsrichtung:
winkel=(EntityYaw(tram)+360) Mod 360

Next

; Unterbrechung Taste P macht Pause:
If KeyHit(25) Then
If Stopp=0 Then
FlushKeys()
Stopp=1
WaitKey()
Else
Stopp=0
EndIf
EndIf

Until KeyHit(1)



Anmerkung:

Es ist immer besser hier im Furm den Code so einzustellen, dass er von Dritten auch ohne deine 3D-Modelle, Images und Sound getestet werden kann. Wie soll jemand deinen Code ausprobieren ohne alle diese Dateien? Du könntest vorher den unnötigen Code "entfernen" und so so das Problem auf das wesentliche beschränken.

Solche reduzierten Modelle helfen auch dir selbst, das Teilproblem isoliert zu betrachten.
  • Zuletzt bearbeitet von Midimaster am Mi, Jun 02, 2010 0:48, insgesamt 7-mal bearbeitet
 

Blitzjockey

BeitragMo, Mai 31, 2010 10:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Global Timer=CreateTimer(60)

Hast Du zwar geschrieben, aber weiterhin kein
Code: [AUSKLAPPEN]
WaitTimer(Timer)

Dein Program hat gar keine Ahnung an welcher Stelle Du möchtest das es kurz wartet - und es wartet dementsprechend lieber gar nicht.

Dann schreibst Du
Code: [AUSKLAPPEN]

X# = EntityX# (Tram,  1 )
Z# = EntityZ# (Tram,  1 )

Wenn wir da in der Hilfe nachschlagen, lesen wir: EntityX#(Entity%, [Global])
Global ist erstens eine Option, den müsstest Du nicht angeben. Du hast aber 1 angegeben, und das bedeutet das die EntityX gemessen wird mit Bezugspunkt Parent, nicht Bezugspunkt 0, 0, 0. Da ich nicht glaube das Du da die X und Z weiter in Deine Code auf Drehpunkt1 bezogen hast, wird dieses Punkt also gar nicht erreicht.

Dann schreibst Du
Code: [AUSKLAPPEN]
ms=MilliSecs()+2000

Das bedeutet, das nächste Mal das ms erreicht wird liegt 2000 Millisekunden in der Zukunft. Also, 2 ganze Sekunden weiter. Er dreht alle 2 Sekunden 1.5°. Wenn er schon drehen würde, würde es nicht schön aussehen. Vom Prinzip her schon mal besser als eine Drehung um 90° auf einem Schlag, allerdings hapert es noch.

Und wenn ich so Deine Zeichnung anschaue, ist der Kurve auch um einiges größer als 90°?
Wenn Dein Zug richtung 305° losfährt, und am Ender der Kurve Steuerkurs 090° haben soll, ergibt das eine Kurve von 215°. Mit 90° fährt er gerade mal richtung Süd-Süd-West, nicht Ost. Aber vielleicht habe ich die Zeichnung falsch intepretiert.

EDIT:
Ich habe natürlich MidiMasters Tekst zu spät gesehen... Sieht sehr gut aus!
  • Zuletzt bearbeitet von Blitzjockey am Mo, Mai 31, 2010 13:11, insgesamt einmal bearbeitet

BastianA

BeitragMo, Mai 31, 2010 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal Danke für alle Antworten, habe jetzt beide Möglichkeiten eingebaut also ein Misch aus beiden klappt auch, habs mit den Koordinaten gemacht, weil sonst die Beschleunigung und der ganze Motor nicht funktioniert. Gibt es eine Methode zum Berechnen des Radius bei dem Gradwinkel, weil so richtig genau wird das nicht immer 1m daneben meist ?

EDIT:
Vorhin habe ich den Code so gemacht, dass er bei 3kmh eine Drehung macht, nur ist mir das nicht aufgefallen, weil ich nach dem Start immer gleich beschleunigt habe und die Kurve bei den 3kmh kam.
Hier mein kompletter Code + Dateien: http://rapidshare.com/files/39...2.rar.html
Gleicher Fehler wie vorhin, funktioniert immer noch nicht. Mit der Theorie mit den Wegpunkten lande ich gleich immer auf Wegpunkt 7, ich weiß aber nicht wieso.

Midimaster

BeitragMo, Mai 31, 2010 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
die Ursache für die Ungenauigkeiten ist meist eine zu großer Intervall-Abstand. Das gleiche Problem kenne ich bei den Versuchen ein Seil per Code weich schwingen zu lassen.

Hierzu gab es dann mal einen Tipp aus dem Forum, der hier auch imens weiterhelfen könnte:


Bisher berechnest Du immer die Schrittspanne zwischen zwei Flips. Von der einen Position der Tram wird gerade soviel dazugezählt, wie sie sich bis zum nächsten Kommando weiterbewegen soll. Die Entscheidungen ob es nun um die Kurve geht, wird immer vom Überschreiten eines festen Wertes abhängig gemacht.

Beispiel:

Die Kurve soll genau nach 10m Fahrt beginnen. Einmal kommst du bei Meter 9 mit einer Speed von 1.1 an und daher ist der wirklich Startwert für die Kurve nun bei 10.1m. Ein ander Mal erreichst Du diese Stelle bei Meter 9.9 und mit Speed 1.8 und dann beginnt die Kurvenfahrt diesmal real erst bei 11.7m. Dieser Fehler führt dann zu den Ungenauigkeiten.

Lösung:

Du rechnest mit viel kleineren Schritten, sagen wir nur 1/10 der alten Additions-Strecke, machst aber dafür nur jedes zehnte Mal einen Flip:

Im Beispiel von oben kommtst du bei Meter 9 mit einer Speed von 1.1 an.

Die 1/10 Schritte sind dann so:

9.10
9.21
9.32
9.43
9.54
9.65
9.76
9.87
9.98
10.09 -> Entscheidung Kurve beginnt

oder Du bist bei 9.9 mit Speed 1.8
9.90
10.08 -> Entscheidung schon jetzt Kurve beginnt
10.26
10.44
....

Folge: Die Strecke wird viel sauberer eingehalten.

Ich habe dir mal in meinen alten Code die Änderungen reingemacht (siehe oberen Post von mir). Da ist jetzt eine FOR/NEXT-Schleife und die Additionswerte sind nicht mehr 0.1 sondern 0.01 und die Winkel ebenso nur noch ein 1/10tel des ursprüglichen Wertes.

Das sollte helfen.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group