[B3D] Physik 4WD Buggy in 3D

Übersicht BlitzBasic Codearchiv

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: [B3D] Physik 4WD Buggy in 3D

BeitragSa, Nov 11, 2006 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
So, hier jetzt mal die 3D-Version des Physik-Buggy's.

Steuerung:
Cursor hoch/runter - vor/zurück -fahren
Cursor links/rechts - links/rechts -lenken
Space - Fahrzeug heben bzw. drehen falls umgekippt
A - Federbeine verlängern (Geländewagen)
Y - Federbeine verkürzen (Rennwagen)
Enter - Kamera festsetzen bzw. Verfolgungsmodus
Mausbewegung - Kameraperspektive

Code: [AUSKLAPPEN]
;Grafikkramm
Const gfx=1024
Const gfy=gfx*.75
Const ghx=gfx/2
Const ghy=gfy/2
Graphics3D gfx,gfy,32,1
SetBuffer BackBuffer()

;Visualisierung
light=CreateLight()
camera=CreateCamera()
CameraRange camera,1,3000
RotateEntity light,60,30,0
CameraClsColor camera,80,80,80
PositionEntity camera,-20,16,-20

;Fahrzeug-Mesh
Global mesh=CreateMesh()
Global brush=CreateBrush()   
Global face=CreateSurface(mesh,brush)
EntityAlpha mesh,1
EntityFX mesh,3

;Himmel erstellen
sky=CreateMesh()
skyface=CreateSurface(sky,brush)
v0=AddVertex(skyface,0,160,0)
v1=AddVertex(skyface,-1000,-4,-1000)
v2=AddVertex(skyface,-1000,-4,+1000)
v3=AddVertex(skyface,+1000,-4,-1000)
v4=AddVertex(skyface,+1000,-4,+1000)
VertexColor skyface,v0,40,40,40
VertexColor skyface,v1,240,240,120
VertexColor skyface,v2,0,240,120
VertexColor skyface,v3,240,0,0
VertexColor skyface,v4,240,240,120
AddTriangle skyface,v0,v2,v1
AddTriangle skyface,v0,v4,v2
AddTriangle skyface,v0,v3,v4
AddTriangle skyface,v0,v1,v3
EntityFX sky,2

;Boden erstellen
plane=CreatePlane()
mirror=CreateMirror()
EntityColor plane,40,40,40
PositionEntity plane,0,-4,0
PositionEntity mirror,0,-4,0
EntityAlpha plane,.5
EntityType plane,2

;Block1 erstellen
cube1=CreateCube()
ScaleEntity cube1,20,20,20
RotateEntity cube1,45,20,0
PositionEntity cube1,0,-3.9,200
EntityType cube1,2

;Block2 erstellen
cube2=CreateCube()
ScaleEntity cube2,20,2,20
PositionEntity cube2,100,-3.9,200
EntityType cube2,2

;VK-Ausgleichberechnung
rp=CreatePivot()

Type kp ;KnotenPunkte
 Field xg# ;X-Speed
 Field yg# ;Y-Speed
 Field zg# ;Z-Speed
 Field pv% ;Pivot
End Type

Type vk ;VerKlinkungen
 Field k1% ;KP-1
 Field k2% ;KP-2
 Field fd% ;Federung
 Field df% ;Dämpfung
 Field ln# ;Solllänge
End Type

dx#=0
dy#=0
dz#=0
ds#=0
lk#=0 ;Lenkposition
fl#=7 ;Federbeinlänge
fest%=1 ;Kameraposition

;Add-KP
Restore KP
While pv<>-1
 Read dx,dy,dz,pv
 If pv<>-1 new_kp(dx,dy,dz,pv)
Wend

;Add-VK
Restore VK
While df<>-1
 Read v1,v2,fd,df
 If df<>-1 new_vk(v1,v2,fd,df)
Wend

;Karosserietriangles
AddTriangle face,0,1,2
AddTriangle face,0,2,8
AddTriangle face,0,8,7
AddTriangle face,0,7,1
AddTriangle face,1,2,5
AddTriangle face,5,2,6
AddTriangle face,2,4,6
AddTriangle face,6,4,8
AddTriangle face,4,3,8
AddTriangle face,8,3,7
AddTriangle face,3,1,7
AddTriangle face,7,1,5
AddTriangle face,2,1,4
AddTriangle face,4,1,3
AddTriangle face,5,6,8
AddTriangle face,8,7,5
VertexColor face,0,240,240,240,1
VertexColor face,1,20,20,20,1
VertexColor face,2,20,20,20,1
VertexColor face,3,20,20,20,1
VertexColor face,4,20,20,20,1
VertexColor face,5,120,120,120,1
VertexColor face,6,120,120,120,1
VertexColor face,7,120,120,120,1
VertexColor face,8,120,120,120,1

Collisions 1,2,2,2


;====-===-==-=-=--=---=----=---- --- -- - -  -   -    -


;Hauptschleife
While Not KeyHit(1)

 ;Extrahärte
 For w=1 To 6
  ;VerKlinkungen
  For vk.vk=Each vk
   k1.kp=Object.kp(vk\k1)
   k2.kp=Object.kp(vk\k2)

   ds=vk\ln-EntityDistance(k1\pv,k2\pv)
   PositionEntity rp,EntityX(k1\pv),EntityY(k1\pv),EntityZ(k1\pv)
   PointEntity rp,k2\pv,0
   MoveEntity rp,0,0,ds

   dx=(EntityX(k1\pv)-EntityX(rp))
   dy=(EntityY(k1\pv)-EntityY(rp))
   dz=(EntityZ(k1\pv)-EntityZ(rp))

   MoveEntity k1\pv,+dx/vk\fd,+dy/vk\fd,+dz/vk\fd
   k1\xg=k1\xg+dx/vk\df
   k1\yg=k1\yg+dy/vk\df
   k1\zg=k1\zg+dz/vk\df

   MoveEntity k2\pv,-dx/vk\fd,-dy/vk\fd,-dz/vk\fd
   k2\xg=k2\xg-dx/vk\df
   k2\yg=k2\yg-dy/vk\df
   k2\zg=k2\zg-dz/vk\df
  Next
 Next

 UpdateWorld

 ;KnotenPunkte
 vertexcounter=0
 For kp.kp=Each kp
  kp\yg=kp\yg-.0022
  MoveEntity kp\pv,kp\xg,kp\yg,kp\zg
  If CountCollisions(kp\pv)>0 kp\xg=0:kp\yg=0:kp\zg=0
  VertexCoords face,vertexcounter,EntityX(kp\pv),EntityY(kp\pv),EntityZ(kp\pv)
  vertexcounter=vertexcounter+1
 Next

 ;Vorwärts
 If KeyDown(200)
  For q=0 To 7 Step 1
   For w=16 To 46 Step 10
    k1.kp=Object.kp(q+w)
    k2.kp=Object.kp(w+((q+1) Mod 8))
    dx=(EntityX(k1\pv)-EntityX(k2\pv))/40
    dy=(EntityY(k1\pv)-EntityY(k2\pv))/40
    dz=(EntityZ(k1\pv)-EntityZ(k2\pv))/40
    k1\xg=k1\xg-dx
    k1\yg=k1\yg-dy
    k1\zg=k1\zg-dz
   Next
  Next
 End If

 ;Rückwärts
 If KeyDown(208)
  For q=0 To 7 Step 1
   For w=16 To 46 Step 10
    k1.kp=Object.kp(q+w)
    k2.kp=Object.kp(w+((q+1) Mod 8))
    dx=(EntityX(k1\pv)-EntityX(k2\pv))/45
    dy=(EntityY(k1\pv)-EntityY(k2\pv))/45
    dz=(EntityZ(k1\pv)-EntityZ(k2\pv))/45
    k1\xg=k1\xg+dx
    k1\yg=k1\yg+dy
    k1\zg=k1\zg+dz
   Next
  Next
 End If

 ;Tastaturabfragen
 If KeyHit(28) fest=1-fest

 ;heben/drehen
 If KeyDown(57)
  k1.kp=Object.kp(6):k1\yg=k1\yg+.028
  k1.kp=Object.kp(7):k1\yg=k1\yg+.028
  k1.kp=Object.kp(8):k1\yg=k1\yg+.028
  k1.kp=Object.kp(9):k1\yg=k1\yg+.028
 End If

 ;Abschnitt für Lenkung
 If KeyDown(203) lk=lk-.1:If lk<-2.2 lk=-2.2
 If KeyDown(205) lk=lk+.1:If lk>+2.2 lk=+2.2
 lk=lk-Sgn(lk)/20
 vk.vk=First vk:vk\ln=13.4-lk
 vk.vk=After vk:vk\ln=13.4+lk

 ;Abschnitt für Dämpfer
 If KeyDown(30) fl=fl+.02
 If KeyDown(44) fl=fl-.02
 vk.vk=After vk:vk\ln=fl
 vk.vk=After vk:vk\ln=fl
 vk.vk=After vk:vk\ln=fl
 vk.vk=After vk:vk\ln=fl

 ;Abschnitt für Kamera
 k1.kp=Object.kp(1)
 ds=(EntityDistance(camera,k1\pv))-30:ds=ds*fest
 MoveEntity camera,MouseXSpeed(),(ds/8)-MouseYSpeed(),ds
 PositionEntity sky,EntityX(camera),0,EntityZ(camera)
 PointEntity camera,k1\pv
 MoveMouse ghx,ghy

 RenderWorld

 ms=MilliSecs():Text 0,0,fps+" fps"; Auf 100 fps bestimmt
 If ms>mt mt=ms+254:fps=frame:frame=0 Else frame=frame+4

 Flip
Wend
End


;====-===-==-=-=--=---=----=---- --- -- - -  -   -    -


;KnotenPunkt erstellen
Function new_kp(xp#,yp#,zp#,sw%)
 kp.kp=New kp
 If sw=0 kp\pv=CreatePivot():ScaleEntity kp\pv,.1,.1,.1
 If sw=1 kp\pv=CreatePivot():EntityType kp\pv,1:EntityRadius kp\pv,.1
 If sw=2 kp\pv=CreateSphere(8):EntityType kp\pv,1:EntityColor kp\pv,32,32,32
 PositionEntity kp\pv,xp,yp,zp
 AddVertex(face,xp,yp,zp)
 Return Handle(kp)
End Function

;VerKlinkung erstellen
Function new_vk(k1%,k2%,fd%,df%)
 vk.vk=New vk
 vk\k1=k1
 vk\k2=k2
 If fd<1 fd=1
 If df<1 df=1
 vk\fd=(fd+1)^2
 vk\df=(df+1)^2
 p1.kp=Object.kp(k1)
 p2.kp=Object.kp(k2)
 vk\ln=EntityDistance(p1\pv,p2\pv)
End Function

.KP;Koordinaten der KnotenPunkte
Data 0,8,-2,1 ;Dachspitze
Data -3,2,6,1, 3,2,6,1, -3,2,-6,1, 3,2,-6,1 ;Fahrzeugboden
Data -3,5,8,1, 3,5,8,1, -3,6,-8,1, 3,6,-8,1 ;Fahrzeughaube
Data -3,9,5,0, 3,9,5,0, -3,9,-5,0, 3,9,-5,0 ;Radlagerhalterung
Data -5,2,6,0, 3,2,6,0 ;Achse VL
Data -5,3.7,6,2, -5,3.2,7.2,2, -5,2,7.7,2, -5,0.8,7.2,2 ;Reifen VL
Data -5,0.3,6,2, -5,0.8,4.8,2, -5,2,4.3,2, -5,3.2,4.8,2 ;Reifen VL
Data 5,2,6,0, -3,2,6,0 ;Achse VR
Data 5,3.7,6,2, 5,3.2,7.2,2, 5,2,7.7,2, 5,0.8,7.2,2 ;Reifen VR
Data 5,0.3,6,2, 5,0.8,4.8,2, 5,2,4.3,2, 5,3.2,4.8,2 ;Reifen VR
Data -5,2,-6,0, 3,2,-6,0 ;Achse HL
Data -5,3.7,-6,2, -5,3.2,-4.8,2, -5,2,-4.3,2, -5,0.8,-4.8,2 ;Reifen VL
Data -5,0.3,-6,2, -5,0.8,-7.2,2, -5,2,-7.7,2, -5,3.2,-7.2,2 ;Reifen VL
Data 5,2,-6,0, -3,2,-6,0 ;Achse HR
Data 5,3.7,-6,2, 5,3.2,-4.8,2, 5,2,-4.3,2, 5,0.8,-4.8,2 ;Reifen VR
Data 5,0.3,-6,2, 5,0.8,-7.2,2, 5,2,-7.7,2, 5,3.2,-7.2,2 ;Reifen VR
Data -1,-1,-1,-1 ;KP-Ende

.VK;Verweise der VerKlinkungen
Data 04,15,1,1, 05,25,1,1, 14,10,4,12, 24,11,4,12, 34,12,4,12, 44,13,4,12 ;Lenkung und Federung/Dämpfung
;Data 04,15,1,1, 05,25,1,1, 14,10,1,1, 24,11,1,1, 34,12,1,1, 44,13,1,1 ;Lenkung und Federung/Dämpfung
Data 02,04,1,1, 03,05,1,1, 06,08,1,1, 07,09,1,1, 10,12,1,1, 11,13,1,1, 02,03,1,1, 04,05,1,1 ;Fahrzeug
Data 06,07,1,1, 08,09,1,1, 10,11,1,1, 12,13,1,1, 02,06,1,1, 03,07,1,1, 04,08,1,1, 05,09,1,1 ;Fahrzeug
Data 02,10,1,1, 03,11,1,1, 04,12,1,1, 05,13,1,1, 02,08,1,1, 04,06,1,1, 03,09,1,1, 05,07,1,1 ;Fahrzeug
Data 02,12,1,1, 04,10,1,1, 03,13,1,1, 05,11,1,1, 03,06,1,1, 07,02,1,1, 03,10,1,1, 11,02,1,1 ;Fahrzeug
Data 05,08,1,1, 09,04,1,1, 05,12,1,1, 13,04,1,1, 06,10,1,1, 07,11,1,1, 08,12,1,1, 09,13,1,1 ;Fahrzeug
Data 02,05,1,1, 03,04,1,1, 06,09,1,1, 07,08,1,1, 10,13,1,1, 11,12,1,1, 01,02,1,1, 01,03,1,1, 01,04,1,1, 01,05,1,1 ;Fahrzeug
Data 16,17,1,1, 17,18,1,1, 18,19,1,1, 19,20,1,1, 20,21,1,1, 21,22,1,1, 22,23,1,1, 23,16,1,1 ;Reifenumfang VL
Data 16,19,1,1, 19,22,1,1, 22,17,1,1, 17,20,1,1, 20,23,1,1, 23,18,1,1, 18,21,1,1, 21,16,1,1 ;Reifenstabilität VL
Data 14,16,1,1, 14,17,1,1, 14,18,1,1, 14,19,1,1, 14,20,1,1, 14,21,1,1, 14,22,1,1, 14,23,1,1 ;Speichen VL Aussen
Data 15,16,1,1, 15,17,1,1, 15,18,1,1, 15,19,1,1, 15,20,1,1, 15,21,1,1, 15,22,1,1, 15,23,1,1 ;Speichen VL Innen
Data 14,15,1,1, 04,14,1,1, 15,11,1,1, 02,15,1,1 ;Sonstige VerKlinkungen für Rad VL
Data 26,27,1,1, 27,28,1,1, 28,29,1,1, 29,30,1,1, 30,31,1,1, 31,32,1,1, 32,33,1,1, 33,26,1,1 ;Reifenumfang VR
Data 26,29,1,1, 29,32,1,1, 32,27,1,1, 27,30,1,1, 30,33,1,1, 33,28,1,1, 28,31,1,1, 31,26,1,1 ;Reifenstabilität VR
Data 24,26,1,1, 24,27,1,1, 24,28,1,1, 24,29,1,1, 24,30,1,1, 24,31,1,1, 24,32,1,1, 24,33,1,1 ;Speichen VR Aussen
Data 25,26,1,1, 25,27,1,1, 25,28,1,1, 25,29,1,1, 25,30,1,1, 25,31,1,1, 25,32,1,1, 25,33,1,1 ;Speichen VR Innen
Data 24,25,1,1, 05,24,1,1, 25,10,1,1, 03,25,1,1 ;Sonstige VerKlinkungen für Rad VR
Data 36,37,1,1, 37,38,1,1, 38,39,1,1, 39,40,1,1, 40,41,1,1, 41,42,1,1, 42,43,1,1, 43,36,1,1 ;Reifenumfang HL
Data 36,39,1,1, 39,42,1,1, 42,37,1,1, 37,40,1,1, 40,43,1,1, 43,38,1,1, 38,41,1,1, 41,36,1,1 ;Reifenstabilität HL
Data 34,36,1,1, 34,37,1,1, 34,38,1,1, 34,39,1,1, 34,40,1,1, 34,41,1,1, 34,42,1,1, 34,43,1,1 ;Speichen HL Aussen
Data 35,36,1,1, 35,37,1,1, 35,38,1,1, 35,39,1,1, 35,40,1,1, 35,41,1,1, 35,42,1,1, 35,43,1,1 ;Speichen HL Innen
Data 34,35,1,1, 02,34,1,1, 02,35,1,1, 35,13,1,1, 04,35,1,1 ;Sonstige VerKlinkungen für Rad HL
Data 46,47,1,1, 47,48,1,1, 48,49,1,1, 49,50,1,1, 50,51,1,1, 51,52,1,1, 52,53,1,1, 53,46,1,1 ;Reifenumfang HR
Data 46,49,1,1, 49,52,1,1, 52,47,1,1, 47,50,1,1, 50,53,1,1, 53,48,1,1, 48,51,1,1, 51,46,1,1 ;Reifenstabilität HR
Data 44,46,1,1, 44,47,1,1, 44,48,1,1, 44,49,1,1, 44,50,1,1, 44,51,1,1, 44,52,1,1, 44,53,1,1 ;Speichen HR Aussen
Data 45,46,1,1, 45,47,1,1, 45,48,1,1, 45,49,1,1, 45,50,1,1, 45,51,1,1, 45,52,1,1, 45,53,1,1 ;Speichen HR Innen
Data 44,45,1,1, 03,44,1,1, 03,45,1,1, 45,12,1,1, 05,45,1,1 ;Sonstige VerKlinkungen für Rad HR
Data -1,-1,-1,-1 ;VK-Ende


Dorn im Auge sind mir folgende Codezeilen:

Code: [AUSKLAPPEN]
   ds=vk\ln-EntityDistance(k1\pv,k2\pv)
   PositionEntity rp,EntityX(k1\pv),EntityY(k1\pv),EntityZ(k1\pv)
   PointEntity rp,k2\pv,0
   MoveEntity rp,0,0,ds

Das Entity rp eird zur Berechnung der Verklingungen (virtuelle Stangen) benutzt um gerausfinden zu können wie weit eine Verformung statt gefunden hat bzw. um deren Korrektur in X,Y und Z berechnen zu können. Falls jemand hier ein besseren Vorschlag, so immer her damit.

Und jetzt, viel Spaß.

StepTiger

BeitragSa, Nov 11, 2006 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
also naja!

Das letzte mal ist der wahrlich ein Meisterstreich gelungen, was man diesmal jedoch nicht behaupten kann.

Schlecht ist es nicht, jedoch noch sehr Bug-reich

Bild:
user posted image

Auch die Steuerung ist ziemlich doof. Es gibt kein Bremsen, sondern nur ein Vorwärts oder Rückwärts und kein Mittelding
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Nov 11, 2006 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Kollisionsabfragen gehen nur aus Knotenpunkten aus, da diese auch die Masse mit sich bringen. Falls Verbesserungsvorschläge dazu anliegen, bin ich gerne bereits es nochmal unter die Lupe zu nehmen. Zudem wird es, eingesetzt in einem Spiel, wohl kaum solche scharfen Kanten geben. Eine Möglichkeit es denoch mit bereits vorhandenen Mitteln in den Griff zu bekommen währe, der Karosserie mehr Knotenpunkte zu verpassen. Doch dieses würde sich irgendwann an den FPS rächen. Zudem wurde in diesem Beispiel auf eine Deltavariable verzichtet, da es sowieso kaum möglich ist in einem solchen Beispiel gebräuchlich anzuwenden.
So 'schön' das ganze ist, bringt es auch jede Menge Nachteile mit sich.

u.a.
- Es gibt keine Möglichkeit das Fahrzeug einfach und schnell via PositionEntity um zu positionieren.
- Noch schwieriger währe eine Anwendung via RotateEntity.
- Problem gibt es auch, wenn man das Fahrzeug mit hochen Geschwindigkeiten fahren möchte. Dies kommt daher, weil die Geschwindigkeit hier über den Bodenkontakt der Reifen zu stande kommt und nicht wie in anderen Spielen üblich durch eine Fahrzeuggeschwindigkeitsvariable.

edit1:
284 fps, sind etwas mehr als ich vorgesehen hatte. Die Spielgeschwindigkeit wurde von mir auf 100 fps abgestimmt.

edit2:
Zu der Steuerung, es soll ein Programmbeispiel sein, nicht ein Spiel was ich jetzt raus bringen wollte. Mein Ziel war es, da ganze möglichst einfach zu gestallten, so das jemand der sich daran interessiert auch was damit machen kann um selbst weiter oder aufgrund der Idee was selbst programmiert. Die Geschwindigkeit ist jetzt vorgelegt auf /40, wird die Zahl kleiner so fährt das Fahrzeug schneller. Die Größenänderungen sind dazu nicht linear.

StepTiger

BeitragSa, Nov 11, 2006 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
noch was:

fährt man die Federbeine aus oder ein, so drehen sie sich um die Längsachse des Fahrzeuges.

*edit*

Das am Anfang einfügen:
Code: [AUSKLAPPEN]
;FPS
Const FPS_MAX=100
Const FPS_TIME#=1000/FPS_MAX
Global FPS_LAST=MilliSecs()


Das am Anfang der Schleife einfügen:
Code: [AUSKLAPPEN]
While MilliSecs()<FPS_LAST+FPS_TIME#:Delay FPS_LAST+FPS_TIME#-MilliSecs()-1:Wend:FPS_LAST=MilliSecs()
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Blitzcoder

Newsposter

BeitragSa, Nov 11, 2006 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, schreib nächstes mal bitte dazu, dass es süchtig macht!

Wenn man die Federbeine sehr hoch einstellt, klappen die Räder unten weg, und es entstehen seltsame Dinge. Ich hatte eben 3 Räder an den richtigen Stellen und eins quer auf dem Dach des Autos. Wenn du noch etwas Rutschen einbauen würdest(Bodenhäftung verlieren) bzw. es etwas abmildern würdest (Ist der Boden Eis?!), dann wäre es perfekt.

Weiter so!

MfG Blitzcoder
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)
  • Zuletzt bearbeitet von Blitzcoder am Sa, Nov 11, 2006 18:54, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Nov 11, 2006 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, also, das Fahrzeug ist kein Entity was nur umpositioniert wird etc. Jede Ecke des Fahrzeugs, jede Sphere am Rad und weitere unsichtbare Pivots sind bestandteile vom ganzem Fahrzeug. Diese Bestandteile werden durch Verklingungen (virtuelle Stangen) zusammen gehalten. Dabei wird nur zur Solllänge korrigiert, nicht nach einem eventuellem Sollwinkel. Das bedeutet, wenn eine Verformungen überstrapaziert wird, dann kann der eine oder andere Knotenpunkt in eine Nichtsollposition plopen. So wie eine kleine Beule in einem Blech, in die eine oder andere Richtung gedrückt werden kann, aber nie in eine Nullposition in dem das Blech dann wieder plan ist. Eingesetzt in einem Spiel würde eine Überstrapazierung dazu führen das, dass Fahrzeug dann geschrottet wird und der Spieler das Spiel somit verloren hat.

Beispiel: In Bridgebuilder wurde das Problem auf gleicher art und weise gelöst. Wird eine Verklinkung zu stark beansprucht, so wird sie einfach gelöscht und das System droht zusammen zu brechen. Dabei reissen die Verbindungen schon bei einer extremst geringer Beanspruchung weg.

edit1:
@BlitzCoder, Eis kannst du haben. Ändere dazu folgende Zeile (on the fly)

Code: [AUSKLAPPEN]
  If CountCollisions(kp\pv)>0 kp\xg=0:kp\yg=0:kp\zg=0

um zu
Code: [AUSKLAPPEN]
  If CountCollisions(kp\pv)>0 kp\xg=kp\xg/50:kp\yg=kp\yg/50:kp\zg=kp\zg/50

Pdd

BeitragSa, Nov 11, 2006 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop, net schlecht, sollte aber noch etwas verbesserung mitbringen Wink

Hatte auch eben folgendes:
user posted image

schon etwas komich o.O
Lieber Apfel als Birne.

Blitzcoder

Newsposter

BeitragSa, Nov 11, 2006 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hectic, Ich meinte nicht, dass ich Eis will, sondern, dass es jetzt halb wie Eis wirkt. Man rutscht zwar nicht in der Kurve nach aussen, aber er dreht durch wie auf Eis.
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)

Christoph

BeitragSa, Nov 11, 2006 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe auch probiert ein 3D "Auto" auf diese Weise zu machen.

Leider habe ich keine Ahnung wie man es schafft, das Federung nur hoch und runter geht (sodass die Reifen z.B. nicht bei zu hohen Kräften im Auto verschwinden)

So wie ich sehe hast du's aber auch nicht geschafft (oder irre ich mich?), das die Reifen bei seitlichen Kräften einigermaßen in Form bleiben
 

c64

BeitragSa, Nov 11, 2006 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Solche feinen codeschnippsel (naja hier eher ein Codetönnchen Smile ) sind unerlässlich und wirklich sehr nützlich. Source ist dokumentiert und gut aufgebaut und es wird ein schönes beispiel gezeigt.

Ich denke wer dies braucht wird seinen nutzen davon haben. Und die jeniegen die sich mit sowas beschäfftigen (wollen), haben einen echt prima Code den sie sich hier angucken können.
Betreten verboten! Kinder haften für ihre Eltern!

Christoph

BeitragSa, Nov 11, 2006 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
@hectic

Ich habe mich mit deinem Code befasst, und finde toll was du geleistet hast.
Ich habe mir selbst (ab und zu mit anderen Lösungsideen) so etwas in der Art geschrieben, und bin erstaunt, wie echt diese Methode an der Realität liegt. Großes Lob, dein Code hat mir sehr geholfen... Smile

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 12, 2006 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
@Blitzcoder,
das Fahrzeug rutscht schon seitlich bei Kurvenfahrten, man sieht es nur nicht so gut, da der Boden keine Textur hat. Setzt man die kamera fest [Enter] und bewegt diese auf eine etwas höhere Position [Maus], dann kann man es denoch sehen. Absolute Haftung bekommt man aber auch mit Collisions 1,2,2,1 nur sollte man dann stets versucht sein nicht mit der Karosserie irgendwo gegen zu kommen.

@Christoph,
man kann verhindern, daß Federbeine ins Auto gehen, indem man Begrenzer einbaut. Also eine Abfrage die kontrolliert, ob die Federbeine (VK) eine minimal/maximal -Länge erreicht haben oder nicht, wenn ja, dann die Härte dieser hochdrehen (zB auf vk\df = 4, und vk\fd = 4). Falls du aber damit meinst, daß die Räder nicht ins Auto kippen sollen beim eindrücken (also parallel nach oben/unten gehen sollen) so könnte man die entsprechende Mechanik verändern, die das macht. Aber auch bei reelen Autos drehen/kippen die Räder ins Auto, nur haben die da auch keinen Federweg von 50cm und mehr, wo man es dann auch als solches erkennen könnte.

edit1:
Ich kann ja mal versuchen die VK so umzuändern, daß die Räder sich parallel nach oben/unten drücken lassen. Sollte kein Problem darstellen. Morgen kommt dann die neue VK-Tabelle zum testen. Heute muß ich noch arbeiten gehen. grrrr. Also seid Nachsichtig.

NightPhoenix

BeitragSo, Nov 12, 2006 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich find das voll krass lustig... Very Happy Macht super viel Spaß
Ich war echt am dauergrinsen vorm Monitor als ich mit dem Ding hantiert habe... Das hat echt Dauer-Unterhaltungspotenzial Wink

Wenn man ne minute lang a drückt (oder wars y?) dann wirbel die reifen durch die Luft :
user posted image


Dann hatte ich noch einen Reifenschaden... Confused
user posted image

naja da ich schnell weiter wollte hab ich das fahrzeug einfach umgedreht... damit war der kaputte Reifen wieder ganz ^^
user posted image


Wenns ein Spiel wäre würde ich das jeden Tag in meinen Pausen zocken Smile

Da es aber eine Physikengine werden soll würde ich sagen du baust erstmal sowas wie ne Begrenzung für A und Y ein.... obwohls damit richtig lustig ist.

Is nicht böse gemeint Wink

MfG. NightPhoenix

Pdd

BeitragSo, Nov 12, 2006 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich mir die bilder so angugge, denke ich, man könnte es auch so lasse... xD
Lieber Apfel als Birne.

biggicekey

BeitragMo, Nov 13, 2006 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
hey,
das is wirklich cool.
hab mir gleich mal ne strecke gebaut um drauf rumzufahren und zu testen.
user posted image

naja mir is das ganze nur etwas "unagil". sprich die lenkung zu schwach und geschwindigkeit zu träge.
hab schon bischen rumprobiert aber von der erhöhung der umdrehungzahl der räder wurd ich auch nicht schneller.
ich hab auch schon solche autophysik versucht bin aber kläglich gescheitert und bei arcarde geblieben:P
aber jetzt fängt dieses kribbeln nach simulation wieder an.
also das dämpfverhalten find ich spitze.
kann man bestimmt noch einiges mit anfangen.
gruß
key
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 14, 2006 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@biggicekey,
find ich ja cool das versucht wird, daraus ein Spiel zu machen. Bin selbst am testen. Das mit der Höhstgeschwindigkeit habe ich bereits beschrieben ("- Problem gibt es auch, wenn man das Fahrzeug mit hochen Geschwindigkeiten fahren möchte. Dies kommt daher, weil die Geschwindigkeit hier über den Bodenkontakt der Reifen zu stande kommt..."). Eine Möglichkeit währe aus den Reifen nur noch ein EntityRadius zu nehmen, und diesen dann manuell berechnen. Für die 2D-Version bin ich schon dabei es zu lösen und das Fahrzeug verhällt sich schon realistischer als die alte Version mit 8 Spheren (KP) pro Reifen. Wenn ich die 2D-Version gefertigt habe kann ich es mal mit der 3D-Version versuchen, nur kann ich noch nicht mit Matritzen umgehen, wo bereits hier meine Fähigkeiten scheitern. Mal sehen wie die 2D-Version erstmal wird...

Lenkung kannst du stärker haben, wenn du die 2.2 am Ende der Zeilen vergrösserst. Code: [AUSKLAPPEN]
 ;Abschnitt für Lenkung
 If KeyDown(203) lk=lk-.1:If lk<-2.2 lk=-2.2
 If KeyDown(205) lk=lk+.1:If lk>+2.2 lk=+2.2
Nur sollte beachtet werden, daß dafür die Räder anders aufgehängt werden sollten, da es hier zu unschönem Verhalten kommen würde. Die Aufhängung habe hier deshalb so gemacht, damit bei Kurvenfahrten die äusseren Räder schon bei ihrem Einschlag einen größeren Radius fahren.

Noch was, wenn man daraus kein Rennspiel auf Asphalt macht, sondern eine art Rennen auf dem Gelände, wo man eh nicht mit voller Geschwindigkeit fahren sollte, geht es ja denoch klar. Denke ich...

@Christoph,
leider habe ich noch keine Begrenzer geschafft, ohne mehr Typeeinträge nutzen zu müssen. Aber bereits eine andere Aufhängung der VKs könnte das Problem lösen. Paralelles eindrücken der Räder ginge ganz einfach, wenn es für die Vorderräder keine Lenkung gäbe. So hatte ich keine Lust zwei Lenkstangen pro Rad einzubauen, also suche ich noch weiter an anderen Lösungen. Zuerst aber die verbesserte 2D-Version.[/code]

Christoph

BeitragDi, Nov 14, 2006 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier hab ich mal (bevor dieser Thread entstand) etwas gemacht, das das gleiche Prinzip verwendet wie deine 2D Version, mein Versuch allerdings da Reifen dranzumachen ist wegen dem oben genannten Problem fehlgeschlagen Wink .

W-Eine Kraft erstellen, die den Würfel von dir wegtreibt
S-Eine Kraft erstellen, die den Würfel zu dir treibt
A-Eine Kraft erstellen, die den Würfel nach links treibt
D-Eine Kraft erstellen, die den Würfel nach rechts treibt
2- Sturm erstellen

Kfd- Variable für die Härte des Würfels (umso kleiner, umso härter ist der Würfel, Werte ab 1 erlaubt)

Code: [AUSKLAPPEN]
Const Gmx=640,Gmy=gmx/4*3,Gmx2=gmx/2,Gmy2=Gmy/2

;Weiche einstellen (Umso höher, umso weicher)
Const Kfd#=1


Const AUTO_TYPE=1,HIND_TYPE=2
Graphics3D Gmx,Gmy,16,2

SetBuffer BackBuffer()
SeedRnd MilliSecs()
Global kn.kn,vk.vk
Global Cam=createcamera()
            MoveEntity Cam,-3,10,-20
Global Licht=CreateLight()
Global Auto,Autosur
Global Funk=1
Global Wink#=0

Type kn
   Field ob,vnr
   Field xg#,yg#,zg#
End Type

Type vk
   Field kn1,kn2
   Field fd#
   Field ln#
End Type

Createauto()

Global plane=createplane()
EntityType plane,HIND_TYPE
EntityAlpha plane,0.5
Global hind2=createcube()
ScaleEntity hind2,10,10,10
MoveEntity hind2,-30,0,30
EntityBox hind2,-10,10,10,20,20,20
RotateEntity hind2,0,0,-30
ScaleEntity hind2,10,5,10
EntityType hind2,HIND_TYPE


Collisions AUTO_TYPE,HIND_TYPE,2,2
Global var1
Repeat
   Moveauto
   UpdateWorld
   RenderWorld
   Select Funk
      Case 1:Modus$="Normal"
      Case 2:Modus$="Sturm"
      Case 3:Modus$="Schwerkraft"
      Default:Modus$="Undefiniert"
   End select
   Text 0,0,"Modus: "+Modus$
   Flip
Until KeyDown(1)
End

Function Moveauto()
   ;VerKlinkungen
   For vk.vk=Each vk
      kn1.kn=Object.kn(vk\kn1)
      kn2.kn=Object.kn(vk\kn2)
      dis_real#=EntityDistance(kn1\ob,kn2\ob)
      x1#=EntityX(kn1\ob):y1#=EntityY(kn1\ob):z1#=EntityZ(kn1\ob)
      x2#=EntityX(kn2\ob):y2#=EntityY(kn2\ob):z2#=EntityZ(kn2\ob)
      PointEntity kn1\ob,kn2\ob:PointEntity kn2\ob,kn1\ob
      dis#=((dis_real-vk\ln#)*0.5)/vk\fd
      MoveEntity kn1\ob,0,0,dis
      MoveEntity kn2\ob,0,0,dis
      x3#=EntityX(kn1\ob):y3#=EntityY(kn1\ob):z3#=EntityZ(kn1\ob)
      x4#=EntityX(kn2\ob):y4#=EntityY(kn2\ob):z4#=EntityZ(kn2\ob)
      PositionEntity kn1\ob,x3,y3,z3
      PositionEntity kn2\ob,x4,y4,z4
      kn1\xg=kn1\xg+(x3-x1)
      kn1\yg=kn1\yg+(y3-y1)
      kn1\zg=kn1\zg+(z3-z1)
      
      kn2\xg=kn2\xg+(x4-x2)
      kn2\yg=kn2\yg+(y4-y2)
      kn2\zg=kn2\zg+(z4-z2)
   Next
   If KeyHit(3) Then Funk=2
   ;KnotenPunkte
   For kn.kn=Each kn
      If Funk=1 Then
         If KeyDown(16) Then kn\yg=kn\yg+0.01
         If KeyDown(17) Then kn\zg=kn\zg+0.01
         If KeyDown(31) Then kn\zg=kn\zg-0.01
         If KeyDown(30) Then kn\xg=kn\xg-0.01
         If KeyDown(32) Then kn\xg=kn\xg+0.01
      ElseIf Funk=2 Then
         kn\xg=kn\xg-0.01
         If EntityInView(Auto,Cam)=0 Then
            For t.kn=each kn
               PositionEntity t\ob,0,50+rnd(-1,1),20+rnd(-1,1)
               VertexCoords Autosur,t\vnr,EntityX(t\ob),EntityY(t\ob),EntityZ(t\ob)
               t\xg=0:t\yg=0:t\zg=0
            Next
            Funk=1
         EndIf
      EndIf
      kn\yg=kn\yg-.002
      If CountCollisions(kn\ob)>0 Then kn\xg=0:kn\yg=0:kn\zg=0
      TranslateEntity kn\ob,kn\xg,kn\yg,kn\zg
      VertexCoords Autosur,kn\vnr,EntityX(kn\ob),EntityY(kn\ob),EntityZ(kn\ob)
   Next
End function

Function New_knot(x#,y#,z#)
   kn.kn=new kn
   kn\ob=CreatePivot()
   PositionEntity kn\ob,x,y,z
   EntityRadius kn\ob,0.1
   EntityType kn\ob,AUTO_TYPE
   kn\vnr=AddVertex(Autosur,x,y,z)
   VertexColor Autosur,kn\vnr,Rand(0,255),Rand(0,255),Rand(0,255)
   return Handle(kn.kn)
End Function

Function New_verk(kn_id1,kn_id2,fd#)
   vk.vk=new vk
   kn_1.kn=Object.kn(kn_id1)
   kn_2.kn=object.kn(kn_id2)
   vk\ln=EntityDistance(kn_1\ob,kn_2\ob)
   vk\kn1=kn_id1
   vk\kn2=kn_id2
   If fd<1 Then fd=1
   vk\fd=fd+1
   Return Handle(vk.vk)
End Function

Function Createauto()
   Auto=CreateMesh()
   EntityFX Auto,2+1
   Autosur=CreateSurface(Auto)
   Restore Knotenpunkt
   Repeat
      Read x#,y#,z#
      If x<>-1 Or y<>-1 Or z<>-1 Then
         New_knot(x,y,z)
      Else
         Exit
      EndIf
   Forever
   ;Bok
   Add(1,2,5):Add(2,6,5):Add(1,7,3):add(1,5,7)
   add(3,8,4):add(3,7,8):add(5,6,7):add(6,8,7)
   add(2,3,4):add(2,1,3):add(2,4,8):add(6,2,8)
   Restore Verklinkung
   Repeat
      Read kn_1,kn_2,fd#
      If kn_1<>-1 Or kn_2<>-1 Or fd<>-1 Then
         New_verk(kn_1,kn_2,fd)
      Else
         Exit
      EndIf
   Forever
   For kn.kn=Each kn
      MoveEntity kn\ob,0,1,0
   Next
End Function

Function Add(kn1=0,kn2=0,kn3=0)
   If kn1<>0 And kn2<>0 And kn3<>0 Then
      AddTriangle(Autosur,kn1-1,kn2-1,kn3-1)
   EndIf
End Function

.Knotenpunkt;x,y,z
Data -1, 1, 1,  1, 1, 1, -1, 1,-1,  1, 1,-1;Karosserie 1-4
Data -1, 3, 1,  1, 3, 1, -1, 3,-1,  1, 3,-1;Karosserie 5-8
Data -1,-1,-1

.Verklinkung;kn1,kn2,fd
Data 1,2,Kfd, 2,4,Kfd, 3,4,Kfd, 1,3,Kfd
Data 1,5,Kfd, 2,6,Kfd, 4,8,Kfd, 3,7,Kfd
Data 5,6,Kfd, 6,7,Kfd, 8,7,Kfd, 5,7,Kfd
Data 1,7,Kfd, 5,3,Kfd, 3,8,Kfd, 7,4,Kfd
Data 2,8,Kfd, 6,4,Kfd, 2,5,Kfd, 6,1,Kfd
Data 5,8,Kfd, 7,6,Kfd, 3,2,Kfd, 1,4,Kfd
Data 3,6,Kfd, 7,2,Kfd, 5,4,Kfd, 8,1,Kfd

Data -1,-1,-1


Warum am Würfel keine Schatteneffekte angezeigt werden, weiß ich nicht...

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 14, 2006 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Schattierung bekommst du hin, wenn du EntityFX=2 ausschaltest. Denn es heisst: ql:EntityFX . Nur wird hier pro KP ein Vertice erstellt, was bedeutet, daß die Schattierung nicht besonders toll ist.

Mit dem Reifenproblem, weiß ich immer noch nicht welches der beiden du nun meinst.

Christoph

BeitragDi, Nov 14, 2006 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Das meine ich mit Reifenproblem:

user posted image

Ich schaffe es nicht, dass die Reifen sich (hauptsächlich) nur nach oben und unten bewegen können.

Das mit Entityfx 2 wegmachen hat nicht gefunzt. Der selbstgebastelte Würfel sieht so aus wie ein createcube() auf den kein Licht angewendet wird.

FOODy

BeitragDi, Nov 14, 2006 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Tut mir schrecklich leid für das "Offtopic", aber nach dem ganzen was ich hier gelesen habe, möcht ich es auch gern ma antesten XD

Habe leider kein B3D...
Kann es vllt jemand Kompilieren und hochladen?!


Gruß,
FOODy


EDIT:
@hectic:
Ah. Muss mal gucken obs mit der Demo geht ^^

EDIT 2:
Verdammte -.-
Jetzt hab ich BlitzMax Demo gesaugt und meine BM Version überschrieben ich Troll <_>
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
  • Zuletzt bearbeitet von FOODy am Di, Nov 14, 2006 16:59, insgesamt 2-mal bearbeitet

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group