3D, Kurven Berechnung?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

tft

Betreff: 3D, Kurven Berechnung?

BeitragSo, Aug 23, 2009 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

zu diesem Thema gibts hir eine menge an Infos und Code beispielen. Aber so richtig steige ich da trotzdem nicht durch. Wenn ich ein Object im 3D Raum einer nicht geraden strecke folgen lassen will. Z.B. einer Bezier Spline. Dann habe ich das Problem, das diese nicht die Zeit Berücksichtigt. Mit der dies sich im Raum bewegt. Das heist eigentlich das ich eine Bewegungs rutine brauche. Die 4D Arbeit. Das übersteigt meinen Horizont bei weitem.

Also habe ich mir überlegt was ich wirklich brauche. Eine Kurven berechnung mit x ablenkpunkten und eine Folge rutine die in abhängikeit von Zeit oder zurückgelegten weg die nächste position berrechnet.

Oder anders herum. Duch Bojen im Raum (3-x) wird ein weg definiert. Und das Object folgt der sich daraus ergebene Fahrkurve.

Please help .......

ich habe dieses gehopple beim bewegen satt.


Gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Aug 23, 2009 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Was meinst du mit ''gehopple''? Jede Bézier-Kurve wird doch mit der Anzahl zu zeichnenden Punkte berechnet. Wenn du nun in deinem Editor angibst, wie viele Punkte jeder Abschnitt haben soll, hast du doch genau die Kontrolle die du haben willst.

Eine andere Möglichkeit wäre, man mach die Punktabstände von Programm berechnet. Also immer gleicher Abstand. Das klingt am Anfang gut, wirklt aber in einem Spiel sehr unnatürlich, da in Kurven die gleiche Geschwindiglkeit gefahren wird wie auf geradem. Daher würde ich das gleich im Editor machen --> Nimm das Mausrad für.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Chrise

BeitragSo, Aug 23, 2009 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo tft!

Hab mich heute ein wenig mit deinem Problem auseinandergesetzt...
Ich weiß so überhaupt nicht, ob du eine derartige Hilfe brauchtest, oder was ganz anderes gesucht hast.
Aufjedenfall hats mir auch gut getan, mal wieder meinen Kopf gebrauchen zu müssen ^^ (und das in den Ferien Razz)

Ich weiß nicht mal wirklich, ob deine Frage auf BB oder nem anderen Programm bezogen war... =/

Aber vielleicht helfen ja meine Funktionen Smile
BlitzBasic: [AUSKLAPPEN]

SeedRnd MilliSecs()
Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

Camera=CreateCamera()
Light=CreateLight()
RotateEntity Light,30,60,0
PositionEntity Camera,0,5,-10

Cube=CreateCube()
RotateEntity Cube,0,45,0

Timer=CreateTimer(60)

SBZ=NewBZ(0,0,-10,-2,4,10,12,5,0)
SBZ2=AddBZ(SBZ,-15,2,8)
SBZ2=AddBZ(SBZ2,-25,20,12)
SBZ2=AddBZ(SBZ2,5,-5,5)
LinkBZ(SBZ2,SBZ)

AddBZMesh(SBZ,Camera)

TestCube=CreateCube()
AddBZMesh(SBZ,TestCube)
TestCylinder=CreateCylinder()
AddBZMesh(SBZ,TestCylinder)

PointEntity Camera,Cube

While Not KeyHit(1)
If KeyDown(57) Then
If Speed#<0.05 Then Speed#=Speed#+0.001
Else
If Speed#>0 Then Speed#=Speed#-0.001
If Speed#<0 Then Speed#=0
EndIf

UpdateBZMesh(TestCube,0.01)
PointEntity TestCube,Cube

UpdateBZMesh(TestCylinder,0.0033)

CamXO#=EntityX(Camera,1)
CamYO#=EntityY(Camera,1)
CamZO#=EntityZ(Camera,1)
UpdateBZMesh(Camera,Speed#,S)
PointEntity Camera,Cube

SmoothBZ(SBZ)

UpdateLines()

If KeyHit(28) Then S=1-S

RenderWorld

DX#=CamXO#-EntityX(Camera,1)
DY#=CamYO#-EntityY(Camera,1)
DZ#=CamZO#-EntityZ(Camera,1)
GlobalSpeed#=Sqr(DX#*DX#+DY#*DY#+DZ#*DZ#)
Text 50,50,"Mit Leertaste die Kamera beschleunigen"
Text 50,65,"Tatsächliche Kamera-Geschwindigkeit: "+GlobalSpeed#
Text 50,80,"Tatsächliche Kamera-Geschwindigkeit mit Enter umschalten"

WaitTimer Timer
Flip 0
Wend
End

;Objekt auf der Kurve aktualisieren
Function UpdateBZMesh(Mesh,TD#=0,S=0)
Local BZM.BZMesh,B.BZ
Local BZX1#,BZY1#,BZZ1#
Local BZX2#,BZY2#,BZZ2#
Local BZX3#,BZY3#,BZZ3#
For BZM.BZMesh=Each BZMesh
If BZM\Mesh=Mesh Then
B.BZ=Object.BZ(BZM\BZ)
If S=1 Then
TD#=TD#
;Global Geschwindikeit berechnen
T#=BZM\T#+0.01
BZX1#=B\X1#*(1.0-T#)+B\X3#*T#
BZY1#=B\Y1#*(1.0-T#)+B\Y3#*T#
BZZ1#=B\Z1#*(1.0-T#)+B\Z3#*T#
BZX2#=B\X3#*(1.0-T#)+B\X2#*T#
BZY2#=B\Y3#*(1.0-T#)+B\Y2#*T#
BZZ2#=B\Z3#*(1.0-T#)+B\Z2#*T#
BZX3#=BZX1#*(1.0-T#)+BZX2#*T#
BZY3#=BZY1#*(1.0-T#)+BZY2#*T#
BZZ3#=BZZ1#*(1.0-T#)+BZZ2#*T#
DX#=BZX3#-EntityX(Mesh,1)
DY#=BZY3#-EntityY(Mesh,1)
DZ#=BZZ3#-EntityZ(Mesh,1)
D#=Sqr(DX#*DX#+DY#*DY#+DZ#*DZ#)
;TD# an Tatsächliche Geschwindigkeit angleichen
TD#=TD#/D#
EndIf

If S=1 Then TD#=TD#*0.01
BZM\T#=BZM\T#+TD#
If BZM\T#>1 Then
If B\BZ2=0 Then BZM\T#=1
If B\BZ2<>0 Then BZM\T#=BZM\T#-1:BZM\BZ=B\BZ2
EndIf
If BZM\T#<0 Then
If B\BZ1=0 Then BZM\T#=0
If B\BZ1<>0 Then BZM\T#=1-BZM\T#:BZM\BZ=B\BZ1
EndIf
B.BZ=Object.BZ(BZM\BZ)
BZX1#=B\X1#*(1.0-BZM\T#)+B\X3#*BZM\T#
BZY1#=B\Y1#*(1.0-BZM\T#)+B\Y3#*BZM\T#
BZZ1#=B\Z1#*(1.0-BZM\T#)+B\Z3#*BZM\T#
BZX2#=B\X3#*(1.0-BZM\T#)+B\X2#*BZM\T#
BZY2#=B\Y3#*(1.0-BZM\T#)+B\Y2#*BZM\T#
BZZ2#=B\Z3#*(1.0-BZM\T#)+B\Z2#*BZM\T#
BZX3#=BZX1#*(1.0-BZM\T#)+BZX2#*BZM\T#
BZY3#=BZY1#*(1.0-BZM\T#)+BZY2#*BZM\T#
BZZ3#=BZZ1#*(1.0-BZM\T#)+BZZ2#*BZM\T#
PositionEntity BZM\Mesh,BZX3#,BZY3#,BZZ3#
EndIf
Next
End Function
;Objekt auf die Kurve setzen
Function AddBZMesh(BZ,Mesh,T#=0)
Local B.BZ,BZM.BZMesh
Local BZX1#,BZY1#,BZZ1#
Local BZX2#,BZY2#,BZZ2#
Local BZX3#,BZY3#,BZZ3#
B.BZ=Object.BZ(BZ)
BZM.BZMesh=New BZMesh
BZM\Mesh=Mesh
BZM\BZ=BZ
BZM\T#=T#
BZX1#=B\X1#*(1.0-T#)+B\X3#*T#
BZY1#=B\Y1#*(1.0-T#)+B\Y3#*T#
BZZ1#=B\Z1#*(1.0-T#)+B\Z3#*T#
BZX2#=B\X3#*(1.0-T#)+B\X2#*T#
BZY2#=B\Y3#*(1.0-T#)+B\Y2#*T#
BZZ2#=B\Z3#*(1.0-T#)+B\Z2#*T#
BZX3#=BZX1#*(1.0-T#)+BZX2#*T#
BZY3#=BZY1#*(1.0-T#)+BZY2#*T#
BZZ3#=BZZ1#*(1.0-T#)+BZZ2#*T#
PositionEntity Mesh,BZX3#,BZY3#,BZZ3#
End Function
;Neue BZ-Kurve
Function NewBZ(X1#=0,Y1#=0,Z1#=0,X2#=0,Y2#=0,Z2#=0,AX#=0,AY#=0,AZ#=0)
Local B.BZ,X#,Y#,Z#
B.BZ=New BZ
B\X1#=X1#:B\Y1#=Y1#:B\Z1#=Z1#
B\X2#=X2#:B\Y2#=Y2#:B\Z2#=Z2#
X#=(X1#+X2#)/2
Y#=(Y1#+Y2#)/2
Z#=(Z1#+Z2#)/2
B\X3#=X#+AX#:B\Y3#=Y#+AY#:B\Z3#=Z#+AZ#
DrawLine(B.BZ);DARSTELLUNG(Bei Bedarf einfach löschen)
Return Handle(B.BZ)
End Function
;BZ-Kurven verlinken
Function LinkBZ(BZ1,BZ2)
Local B1.BZ,B2.BZ,B.BZ
Local AX1#,AY1#,AZ1#
Local AX2#,AY2#,AZ2#
Local X#,Y#,Z#
B1.BZ=Object.BZ(BZ1)
B2.BZ=Object.BZ(BZ2)
AX1#=B1\X2#+(B1\X2#-B1\X3#)
AY1#=B1\Y2#+(B1\Y2#-B1\Y3#)
AZ1#=B1\Z2#+(B1\Z2#-B1\Z3#)
AX2#=B2\X1#+(B2\X1#-B2\X3#)
AY2#=B2\Y1#+(B2\Y1#-B2\Y3#)
AZ2#=B2\Z1#+(B2\Z1#-B2\Z3#)
X#=(AX1#+AX2#)/2
Y#=(AY1#+AY2#)/2
Z#=(AZ1#+AZ2#)/2
BZ=AddBZ(BZ1,X#,Y#,Z#)
B1.BZ=Object.BZ(BZ)
B.BZ=New BZ
B\X1#=X#
B\Y1#=Y#
B\Z1#=Z#
B\X2#=B2\X1#
B\Y2#=B2\Y1#
B\Z2#=B2\Z1#
B\X3#=B1\X2#+(B1\X2#-B1\X3#)
B\Y3#=B1\Y2#+(B1\Y2#-B1\Y3#)
B\Z3#=B1\Z2#+(B1\Z2#-B1\Z3#)
B\BZ1=Handle(B1.BZ)
B\BZ2=Handle(B2.BZ)
B1\BZ2=Handle(B.BZ)
B2\BZ1=Handle(B.BZ)
BL.BZL=New BZL
BL\BZ1=Handle(B1.BZ)
BL\BZ2=Handle(B.BZ)
B\BZL=Handle(BL.BZL)
DrawLine(B.BZ);DARSTELLUNG(Auf Wunsch einfach löschen)
End Function
;BZ-Punkt zur Kurve hinzufügen
Function AddBZ(BZ,X2#=0,Y2#=0,Z2#=0)
Local BZSource.BZ,B.BZ
BZSource.BZ=Object.BZ(BZ)
B.BZ=New BZ
B\X1#=BZSource\X2#
B\Y1#=BZSource\Y2#
B\Z1#=BZSource\Z2#
B\X2#=X2#
B\Y2#=Y2#
B\Z2#=Z2#
B\X3#=BZSource\X2#+(BZSource\X2#-BZSource\X3#)
B\Y3#=BZSource\Y2#+(BZSource\Y2#-BZSource\Y3#)
B\Z3#=BZSource\Z2#+(BZSource\Z2#-BZSource\Z3#)
B\BZ1=BZ
BZSource\BZ2=Handle(B.BZ)
DrawLine(B.BZ);DARSTELLUNG(Auf Wunsch einfach löschen)
Return Handle(B.BZ)
End Function
;Abweichungskoordinaten erfragen
Function BZAX#(BZ)
Local B.BZ
B.BZ=Object.BZ(BZ)
Return B\X3#
End Function
Function BZAY#(BZ)
Local B.BZ
B.BZ=Object.BZ(BZ)
Return B\Y3#
End Function
Function BZAZ#(BZ)
Local B.BZ
B.BZ=Object.BZ(BZ)
Return B\Z3#
End Function
;Abweichungspunkt definieren
Function PositionBZA(BZ,X#=0,Y#=0,Z#=0)
Local B.BZ
B.BZ=Object.BZ(BZ)
B\X3#=X#
B\Y3#=Y#
B\Z3#=Z#
End Function
;Abweichungspunkt bewegen
Function MoveBZA(BZ,XV#=0,YV#=0,ZV#=0)
Local B.BZ,B1.BZ,B2.BZ,BO.BZ
B.BZ=Object.BZ(BZ)
B\X3#=B\X3#+XV#
B\Y3#=B\Y3#+YV#
B\Z3#=B\Z3#+ZV#
End Function
Function FreeBZ(BZ)
Local B.BZ,BL.BZL,B1.BZ,BZM.BZMesh
B.BZ=Object.BZ(BZ)
If B\BZ1<>0 Then
B1.BZ=Object.BZ(B\BZ1)
B1\BZ2=0
EndIf
If B\BZ2<>0 Then
B1.BZ=Object.BZ(B\BZ2)
B1\BZ1=0
EndIf
If B\BZL<>0 Then
BL.BZL=Object.BZL(B\BZL)
B1.BZ=Object.BZ(BL\BZ1)
B1\BZL=0
B1.BZ=Object.BZ(BL\BZ2)
B1\BZL=0
Delete BL.BZL
EndIf
For Index=0 To 49
If B\S[Index]<>0 Then
FreeEntity B\S[Index]
EndIf
Next
For BZM.BZMesh=Each BZMesh
If BZM\BZ=BZ Then
Delete BZM.BZMesh
EndIf
Next
Delete B.BZ
End Function
;Angleichung für eckenlose Bahnen
Function SmoothBZ(BZ)
Local EoBZ
Local B1.BZ,B2.BZ,B.BZ,BO.BZ
Local AX1#,AY1#,AZ1#
Local AX2#,AY2#,AZ2#
Local X#,Y#,Z#
B.BZ=Object.BZ(BZ)
BO.BZ=B.BZ
Repeat
If BO\BZ1<>0 Then
B2.BZ=Object.BZ(BO\BZ1)
If B2\BZL<>0 Then
BL.BZL=Object.BZL(B2\BZL)
B3.BZ=Object.BZ(BL\BZ1):B4.BZ=Object.BZ(BL\BZ2)
If B3\BZ1<>0 And B4\BZ2<>0 Then
B1.BZ=Object.BZ(B3\BZ1)
AX1#=B1\X2#+(B1\X2#-B1\X3#)
AY1#=B1\Y2#+(B1\Y2#-B1\Y3#)
AZ1#=B1\Z2#+(B1\Z2#-B1\Z3#)
B2.BZ=Object.BZ(B4\BZ2)
AX2#=B2\X1#+(B2\X1#-B2\X3#)
AY2#=B2\Y1#+(B2\Y1#-B2\Y3#)
AZ2#=B2\Z1#+(B2\Z1#-B2\Z3#)
X#=(AX1#+AX2#)/2:Y#=(AY1#+AY2#)/2:Z#=(AZ1#+AZ2#)/2
B3\X2#=X#:B3\Y2#=Y#:B3\Z2#=Z#
B4\X1#=X#:B4\Y1#=Y#:B4\Z1#=Z#
B3\X3#=AX1#:B3\Y3#=AY1#:B3\Z3#=AZ1#
B4\X3#=AX2#:B4\Y3#=AY2#:B4\Z3#=AZ2#
EndIf
EoBZ=True
Else
EoBZ=True
EndIf
If EoBZ=False Then
B2\X3#=BO\X1#+(BO\X1#-BO\X3#)
B2\Y3#=BO\Y1#+(BO\Y1#-BO\Y3#)
B2\Z3#=BO\Z1#+(BO\Z1#-BO\Z3#)
BO.BZ=B2.BZ
EndIf
Else If BO\BZ1=0 Then
EoBZ=True
EndIf
Until EoBZ=True
BO.BZ=B.BZ
EoBZ=False
Repeat
If BO\BZ2<>0 Then
B2.BZ=Object.BZ(BO\BZ2)
If B2\BZL<>0 Then
BL.BZL=Object.BZL(B2\BZL)
B3.BZ=Object.BZ(BL\BZ1):B4.BZ=Object.BZ(BL\BZ2)
If B3\BZ1<>0 And B4\BZ2<>0 Then
B1.BZ=Object.BZ(B3\BZ1)
AX1#=B1\X2#+(B1\X2#-B1\X3#)
AY1#=B1\Y2#+(B1\Y2#-B1\Y3#)
AZ1#=B1\Z2#+(B1\Z2#-B1\Z3#)
B2.BZ=Object.BZ(B4\BZ2)
AX2#=B2\X1#+(B2\X1#-B2\X3#)
AY2#=B2\Y1#+(B2\Y1#-B2\Y3#)
AZ2#=B2\Z1#+(B2\Z1#-B2\Z3#)
X#=(AX1#+AX2#)/2:Y#=(AY1#+AY2#)/2:Z#=(AZ1#+AZ2#)/2
B3\X2#=X#:B3\Y2#=Y#:B3\Z2#=Z#
B4\X1#=X#:B4\Y1#=Y#:B4\Z1#=Z#
B3\X3#=AX1#:B3\Y3#=AY1#:B3\Z3#=AZ1#
B4\X3#=AX2#:B4\Y3#=AY2#:B4\Z3#=AZ2#
EndIf
EoBZ=True
Else
EoBZ=True
EndIf
If EoBZ=False Then
B2\X3#=BO\X2#+(BO\X2#-BO\X3#)
B2\Y3#=BO\Y2#+(BO\Y2#-BO\Y3#)
B2\Z3#=BO\Z2#+(BO\Z2#-BO\Z3#)
BO.BZ=B2.BZ
EndIf
Else If BO\BZ1=0 Then
EoBZ=True
EndIf
Until EoBZ=True
End Function

;NUR DARSTELLUNGsFUNKTIONEN
Function DrawLine(B.BZ)
;DARSTELLUNG(Bei Bedarf einfach löschen)
For Index=0 To 49
T#=Float(Index)/49
BZX1#=B\X1#*(1.0-T#)+B\X3#*T#
BZY1#=B\Y1#*(1.0-T#)+B\Y3#*T#
BZZ1#=B\Z1#*(1.0-T#)+B\Z3#*T#
BZX2#=B\X3#*(1.0-T#)+B\X2#*T#
BZY2#=B\Y3#*(1.0-T#)+B\Y2#*T#
BZZ2#=B\Z3#*(1.0-T#)+B\Z2#*T#
BZX3#=BZX1#*(1.0-T#)+BZX2#*T#
BZY3#=BZY1#*(1.0-T#)+BZY2#*T#
BZZ3#=BZZ1#*(1.0-T#)+BZZ2#*T#
B\S[Index]=CreateSphere(8)
ScaleEntity B\S[Index],0.1,0.1,0.1
PositionEntity B\S[Index],BZX3#,BZY3#,BZZ3#
EntityColor B\S[Index],255,100,100
Next
End Function
;Linie aktualisieren
Function UpdateLine(B.BZ)
Local Index,T#
Local BZX1#,BZY1#,BZZ1#
Local BZX2#,BZY2#,BZZ2#
Local BZX3#,BZY3#,BZZ3#
For Index=0 To 49
T#=Float(Index)/49
BZX1#=B\X1#*(1.0-T#)+B\X3#*T#
BZY1#=B\Y1#*(1.0-T#)+B\Y3#*T#
BZZ1#=B\Z1#*(1.0-T#)+B\Z3#*T#
BZX2#=B\X3#*(1.0-T#)+B\X2#*T#
BZY2#=B\Y3#*(1.0-T#)+B\Y2#*T#
BZZ2#=B\Z3#*(1.0-T#)+B\Z2#*T#
BZX3#=BZX1#*(1.0-T#)+BZX2#*T#
BZY3#=BZY1#*(1.0-T#)+BZY2#*T#
BZZ3#=BZZ1#*(1.0-T#)+BZZ2#*T#
PositionEntity B\S[Index],BZX3#,BZY3#,BZZ3#
Next
End Function
;Alle Linien aktualisieren
Function UpdateLines()
Local Index,T#
Local BZX1#,BZY1#,BZZ1#
Local BZX2#,BZY2#,BZZ2#
Local BZX3#,BZY3#,BZZ3#
For B.BZ=Each BZ
For Index=0 To 49
T#=Float(Index)/49
BZX1#=B\X1#*(1.0-T#)+B\X3#*T#
BZY1#=B\Y1#*(1.0-T#)+B\Y3#*T#
BZZ1#=B\Z1#*(1.0-T#)+B\Z3#*T#
BZX2#=B\X3#*(1.0-T#)+B\X2#*T#
BZY2#=B\Y3#*(1.0-T#)+B\Y2#*T#
BZZ2#=B\Z3#*(1.0-T#)+B\Z2#*T#
BZX3#=BZX1#*(1.0-T#)+BZX2#*T#
BZY3#=BZY1#*(1.0-T#)+BZY2#*T#
BZZ3#=BZZ1#*(1.0-T#)+BZZ2#*T#
PositionEntity B\S[Index],BZX3#,BZY3#,BZZ3#
Next
Next
End Function

;TYPES
Type BZMesh
Field Mesh,BZ,T#
End Type
Type BZ
Field S[49];Dient nur der Darstellung
Field X1#,Y1#,Z1#
Field X2#,Y2#,Z2#
Field X3#,Y3#,Z3#
Field BZ1,BZ2,BZL;Verknüpfungen
End Type
Type BZL
Field BZ1,BZ2
End Type
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

tft

BeitragSo, Aug 23, 2009 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,,,

danke schon mal... aber der Code läst sich so nicht Kopieren. Ich konnte ihn daher nicht Testen. Sieht aber danach aus, als wäre das genau das richtige. Schick mir das doch bitte mal an meine EMail Adresse

turguttemucin@hotmail.com

Gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Chrise

BeitragSo, Aug 23, 2009 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Sie haben Post. Wink
Ich denke das ist das selbe Problem wie ich im Portal-forum gepostet hab Sad
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group