Probleme mit tokamak und Bewegung

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Gina

Betreff: Probleme mit tokamak und Bewegung

BeitragSo, Okt 31, 2004 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich hab mich jetzt intensiv mit der tokamak-engine beschäftig, schaffe es aber nicht, meine Figur so zu bewegen, wie bisher:

Bisher habe ich meine Figur so positioniert:
Code: [AUSKLAPPEN]
  RotateEntity spin,0,sy#,0,1
  MoveEntity spin, 0,my#,speed#


Wobei sy# die Drehung links/rechts mit der Maus ist. speed# ist die Geschwindigkeit mit der ich mich bewege und my# die Schwerkraft.

Durch die Drehung brauche ich nur die z-Achse verändern und er bewegt sich aber automatisch in jede beliebige Richtung auf der Map.

Jetzt hab ich tokamak integriert und nun bewegt er sich nicht mehr so, da ja die Positionen hier nicht verändert werden:
Code: [AUSKLAPPEN]
CaptureWorld
PositionEntity spin,TOKRB_GetX#(rb_spin),TOKRB_GetY#(rb_spin),TOKRB_GetZ#(rb_spin)
RotateEntity spin,TOKRB_GetPitch#(rb_spin),TOKRB_GetYaw#(rb_spin),TOKRB_GetRoll#(rb_spin),False
If jump Then
    TOKRB_ApplyImpulse rb_spin,0,3.0,0
    jump = 0
EndIf
TOKSIM_Advance(1.5/60,1)

Dann hab ich versucht mit:
Code: [AUSKLAPPEN]
TOKRB_SetRotation rb_spin,TOKRB_GetPitch#(rb_spin),TOKRB_GetYaw#(rb_spin)+sy#,TOKRB_GetRoll#(rb_spin)
TOKRB_SetPosition rb_spin,TOKRB_GetX#(rb_spin),TOKRB_GetY#(rb_spin),TOKRB_GetZ#(rb_spin)+speed#

die Position zu updaten, aber das klappt nicht so recht. Außerdem bewegt er sich immer nur auf der z-Achse.

Gibt es denn einen anlagogen Befehl in Tokamak, den ich verwenden kann, oder was muss ich sonst noch tun, um die Postionen abzustimmen?

Bin für jeden Hinweis sehr dankbar, da ich schon völlig verzweifelt bin...Sad

Tausend Dank, Gina.
www.jk-spiele.de
 

OJay

BeitragSo, Okt 31, 2004 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
bitte mal den ganzen code mit dummy objekten...so ohne weiteres ohne testen kann man das nicht klären...

Gina

BeitragSo, Okt 31, 2004 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
So, sorry hat etwas gedauert.
Hab versucht das Ganze auf das wesentlichste zu kürzen:

Code: [AUSKLAPPEN]
Const Rigid_Bodies=1,Animated_Bodies=5,Rigid_Particles=0

TOKSIM_SetRigidBodiesCount Rigid_Bodies
TOKSIM_SetAnimatedBodiesCount Animated_Bodies
TOKSIM_SetRigidParticleCount Rigid_Particles
TOKSIM_SetControllersCount 0
TOKSIM_SetGeometriesCount Rigid_bodies+Animated_Bodies
;TOKSIM_SetCollisionResponse (0,1,0)

TOKSIM_CreateSimulator(0,-4,0)
Global MaxX = 1024, MaxY = 768
Graphics3D MaxX,MaxY,32,2
Global fps_anzeige
Global fps_ms=MilliSecs()
Global fps_frames
Global RR,Turbo#,Turbo_ms = MilliSecs()
Global PosX#,PosY#,PosZ#
Global mz#,my#,speed#,rutsch
Global time = MilliSecs()
Global col
;-------------------------------------------------------------------------------
; Boden initialisieren
;-------------------------------------------------------------------------------
Global tex=CreateTexture(256,256)

SetBuffer Texturebuffer(tex)
ClsColor 35,135,35
CLS
For x = 0 To 127
      For y = 0 To 127
          Color 0,100,0
          Rect x,y,1,1
      Next
Next
SetBuffer BackBuffer()
  MoveMouse MaxX/2,MaxY/2

Global boden=CreateTerrain(128)
EntityType boden,2
EntityTexture boden,tex
EntityColor boden,35,135,35
PositionEntity boden,-2,0,-2
abground = TOKAB_Create()
TOKAB_AddBox(abground,100.0,1.99,100.0)
TOKAB_SetPosition(abground,-2.0,-1,-2.0)
TOKAB_SetCollisionID(abground,0)
;-------------------------------------------------------------------------------
; Figur/Kegel initialisieren
;-------------------------------------------------------------------------------
Dim obj(Rigid_Bodies)
Dim rb(Rigid_Bodies)

i=1
ry# = 0.185
Global spin = CreateSphere(8)
ScaleEntity spin, 0.1,0.1,0.1
;EntityType spin,1
;EntityRadius spin,ry#
;PositionEntity spin,0,1.5,1.5

;spin = CreateCube()
;ScaleEntity spin,2,1,1
rb_spin = TOKRB_Create()
TOKRB_Addsphere rb_spin,0.2
TOKRB_SetPosition rb_spin,0,1.5,5.5
TOKRB_SetLinearDamping rb_spin,0.001
TOKRB_SetAngularDamping rb_spin,0.02
TOKRB_SetMass rb_spin,0.8
TOKRB_SetsphereInertiaTensor rb_spin,0.2,0.8
TOKRB_SetCollisionID(spin,1)
;-------------------------------------------------------------------------------
; Kamera initialisieren
;-------------------------------------------------------------------------------
cy# = 01.75 : cz# = -2000.0
Global cam = CreateCamera(spin)
CameraClsColor cam,82,132,181
PositionEntity cam, 0,cy#,cz#
;-------------------------------------------------------------------------------
; Licht initialisieren
;-------------------------------------------------------------------------------
light=CREATELIGHT(0.8,spin)
RotateEntity Light,25,45,0

HidePointer
;-------------------------------------------------------------------------------
; Hauptschleife
;-------------------------------------------------------------------------------
Repeat

  ty#   = 0.0                   ; geradeaus

  PosX# = EntityX#(spin)
  PosY# = EntityY#(spin)
  PosZ# = EntityZ#(spin)

  KD200 = KeyDown(200)          ; vorwärts
  KD208 = KeyDown(208)          ; rückwärts
  KD203 = KeyDown(203)          ; links
  KD205 = KeyDown(205)          ; rechts
  KD199 = KeyDown(199)          ; Pos1 = Zoom in
  KD207 = KeyDown(207)          ; Ende = Zoom out

  KH210 = KeyHit(210)           ; Einfg= Ansicht zentrieren
  KH57  = KeyHit(57)            ; space = springen
  KH48  = KeyHit(48)            ; B = bremsen
  KH20  = KeyHit(20)            ; T = Turbo

; Maussteuerung Anfang ---------------------------------------------------------

  mxs   = MouseXSpeed()
  mys   = MouseYSpeed()

  cx#   = EntityPitch(cam) + mys*0.2
  sy#   = EntityYaw(spin)  - mxs*0.2

  RotateEntity spin,0,sy#,0,1

  If cx# > +29 Then cx# = +29
  If cx# < -69 Then cx# = -69

  RotateEntity cam,cx#,0,0
  MoveMouse MaxX/2,MaxY/2

; Maussteuerung Ende -----------------------------------------------------------
; Tastatursteuerung Anfang -----------------------------------------------------

  If KD203 ty# = +1.0                    ; links drehen
  If KD205 ty# = -1.0                    ; rechts drehen

  If KH57 And EntityY#(spin) < 0.3 Then jump = 1                  ; springen


  If KD200 Then RR = +1               ; vorwärts
  If KD208 Then RR = -1               ; rückwärts
  If KH48  Then RR =  0 : mz# = 0.0   ; bremsen

  If KD199 Then cy# = cy# - 0.05 : cz# = cz# + 0.1    ; zoom in
  If KD207 Then cy# = cy# + 0.05 : cz# = cz# - 0.1    ; zoom out

  If cy# < +0.5 Then cy# = +0.5                       ; Begrenzung
   If cy# > +4.0 Then cy# = +4.0                       ; für
  If cz# > -1.5 Then cz# = -1.5                       ; Kamera -
   If cz# < -8.5 Then cz# = -8.5                       ; Zoom

  If KH210 Then cy# = 0.75 : cz# = -2.0               ; Sicht zentrieren

  PositionEntity cam, 0,cy#,cz#                       ; Kamera einstellen

; Tastatursteuerung Ende -------------------------------------------------------


  Collisions 1,2,2,2                    ; Kollision zw. Kegel und Map

; Trägheit (rutschen und beschleunigen) Anfang ---------------------------------

   If RR <> 0 Then                     ; Wenn Taste gedrückt
      mz# = mz# +(0.0015*RR) : RR = 0  ; beschleunigen
       If mz# > +0.08 Then mz# = +0.08  ; Max speed +
       If mz# < -0.08 Then mz# = -0.08  ; Max speed -
  End If

; Trägheit (rutschen und beschleunigen) Ende -----------------------------------

   RotateMesh spin, 0,13,0        ; Rotation spin

   speed# = mz# + Turbo#
   col = CountCollisions(spin)

; Tokamak Anfang --------------------------------------------------------------

CaptureWorld
i= 1
PositionEntity spin,TOKRB_GetX#(rb_spin),TOKRB_GetY#(rb_spin),TOKRB_GetZ#(rb_spin)
RotateEntity spin,TOKRB_GetPitch#(rb_spin),TOKRB_GetYaw#(rb_spin),TOKRB_GetRoll#(rb_spin),False

TOKRB_SetRotation rb_spin,TOKRB_GetPitch#(rb_spin),TOKRB_GetYaw#(rb_spin)+ty#,TOKRB_GetRoll#(rb_spin)
TOKRB_SetPosition rb_spin,TOKRB_GetX#(rb_spin),TOKRB_GetY#(rb_spin),TOKRB_GetZ#(rb_spin)+speed#

If jump Then
   TOKRB_ApplyImpulse rb_spin,0,3.0,0
   jump = 0
EndIf

TOKSIM_Advance(1.5/60,1)

;If KeyDown(200) Then TOKRB_ApplyImpulse rb_spin,0,0,speed#

; Tokamak Ende ----------------------------------------------------------------

;TurnEntity spin, 0,ty#,0
RotateEntity spin,0,sy#,0,1

;MoveEntity spin, 0,0,speed#

UpdateWorld
RenderWorld

  Fps()
  Color 0,0,0
  Text 0,40,"Yaw: "+ENTITYYAW#(cam,1)+" Turbo: "+Turbo+" Speed: "+speed#+" Col: "+col+"Kristalle: "+kristalle,0,1
  Text 400,10,"Positionen: X = "+Posx+" Y: "+Posy+" Z: "+PosZ+" "+bum2;+Entityy#(fahrstuhl);+" "+Entityy#(podest),0,1
  Text 10,10,"FPS: "+fps_anzeige+" my#="+my#,0,1
  Text 10,20,"cy#: "+cy#+" cz#: "+cz#+" FF: "+FF+" RR: "+RR+" Rutsch: "+rutsch

;    While MilliSecs() < time + 25
;    Wend
   time = MilliSecs()

Flip
Until KeyHit(1)
TOKSIM_DestroySimulator()
end
;-------------------------------------------------------------------------------
; Hauptschleife Ende
;-------------------------------------------------------------------------------
;*******************************************************************************
;-------------------------------------------------------------------------------
; Funktion FPS
;-------------------------------------------------------------------------------
Function Fps()

   fps_frames = fps_frames + 1

   If MilliSecs() - fps_ms >= 1000 Then
       fps_anzeige = fps_frames
       fps_frames  = 0
       fps_ms = MilliSecs()
  End If

End Function

Ich möchte gerne, dass die Kugel sich in die Richtung bewegt, wo sie auch "hinschaut"...

Vielen Dank, Gina.
www.jk-spiele.de

Gina

BeitragDi, Nov 02, 2004 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich habe jetzt die Verschiebung auf der x- und z-Achse mit sin und cos berechnet:

Code: [AUSKLAPPEN]
TOKRB_SetPosition rb_spin,TOKRB_GetX#(rb_spin)+cos#(90+(ENTITYYAW#(cam,1)))*speed#,TOKRB_GetY#(rb_spin),TOKRB_GetZ#(rb_spin)+sin#(90+(ENTITYYAW#(cam,1)))*speed#


Jetzt funktionierts. Ich hoffe die Formel stimmt so.

Vielen lieben Dank an Inarie für den Tipp... Wink

Was muss man eigentlich einstellen für ne Bodenreibung oder etwas in der Art? Hab das bislang selbst programmiert, aber es wirkt bestimmt echter, wenn tokamak das macht...

Code: [AUSKLAPPEN]
TOKRB_SetLinearDamping rb_spin,0.001
TOKRB_SetAngularDamping rb_spin,0.02

Dadurch passiert jedenfalls nix auf dem Boden. Ein paar andere Sachen hab ich auch ausprobiert, aber wohl nocht nicht das richtige gefunden...

Gina.
www.jk-spiele.de

Gina

BeitragMi, Nov 03, 2004 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab jetzt folgende Befehle gefunden und ausprobiert, aber leider stellt sich der gewünschte Effekt nicht ein... Sad

Code: [AUSKLAPPEN]
TOKSIM_SetMaterial 1,0.9,1 ; Boden
TOKSIM_SetMaterial 2,0.5,0.7 ; spin

nach dem starten des Simulators...

Und bei den Meshes:

Code: [AUSKLAPPEN]
Global boden=CreateTerrain(128)
EntityType boden,2
EntityTexture boden,tex
EntityColor boden,35,135,35
PositionEntity boden,-2,0,-2
abground = TOKAB_Create()
geom = TOKAB_AddBox(abground,100.0,1.99,100.0)
TOKAB_SetPosition(abground,-2.0,-1,-2.0)
TOKAB_SetCollisionID(abground,0)
TOKGEOM_SetMaterialIndex geom,1

Dim obj(Rigid_Bodies)
Dim rb(Rigid_Bodies)

i=1
ry# = 0.185
Global spin = CreateSphere(8)
ScaleEntity spin, 0.1,0.1,0.1
rb_spin = TOKRB_Create()
geom1 =TOKRB_Addsphere (rb_spin,0.2)
TOKRB_SetPosition rb_spin,0,1.5,5.5
TOKRB_SetLinearDamping rb_spin,0.001
TOKRB_SetAngularDamping rb_spin,0.02
TOKRB_SetMass rb_spin,0.8
TOKRB_SetsphereInertiaTensor rb_spin,0.2,0.8
TOKRB_SetCollisionID(spin,1)
TOKGEOM_SetMaterialIndex geom1,2


Die Reibung durch die Materialien macht sich aber leider nur in der Luft bemerkbar und nicht auf dem Boden...

Hat jemand eine Idee dazu? Oder benutzt hier keiner tokamak?

Liebe Grüße, Gina.
www.jk-spiele.de

Gina

BeitragSo, Nov 07, 2004 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich gebe nicht auf, auch wenn mir hier offensichtlich keiner helfen kann Wink

Vielleicht nützt es ja jemand anderem als eine Art Dokumentation durch meine verzweifelten Versuche...

Das mit der Reibung durch setzen von Materialien habe ich inzwischen auch hinbekommen. Ich muss nur die speed als Impuls an den Tokamak-Simulator übergeben (zwischen CaptureWorld und TOKSIM_Advance):

Also statt:
Code: [AUSKLAPPEN]
TOKRB_SetPosition rb_spin,TOKRB_GetX#(rb_spin)+cos#(90+(ENTITYYAW#(cam,1)))*speed#,TOKRB_GetY#(rb_spin),TOKRB_GetZ#(rb_spin)+sin#(90+(ENTITYYAW#(cam,1)))*speed#


nehme ich jetzt:
Code: [AUSKLAPPEN]
TOKRB_ApplyImpulse rb_spin,VerschX#,0,VerschZ#


wobei VerschX# = cos#(90+(ENTITYYAW#(cam,1)))*speed#
und VerschZ# = sin#(90+(ENTITYYAW#(cam,1)))*speed# ist.

Nun taucht aber das nächste Problem auf. Ich habe Meshes gebastelt, die ich auf die Map stelle, wie z.B. eine Rampe. Nun will ich natürlich, dass tokamak die Gravitation und Reibung berechnet, wenn ich die Rampe hoch gehe. Daher hab ich der Rampe eine box zugewiesen mit:
Code: [AUSKLAPPEN]
abrampe = TOKAB_Create()
geom2 = TOKAB_AddBox(abrampe,2.0,2.0,10.0)
TOKAB_SetPosition(abrampe,10,1.0,15.5)


Nun habe ich wirklich eine unsichtbare Box um mein Mesh, welche aber auch so wirkt. Ich kann also nicht die Schräge hoch, sondern stoße an die Box und bleib stehen. Alternativ kann ich auch eine Sphere oder einen Cylinder zuweisen, aber das Ergebnis wird nicht wesentlich besser.

Nun meine Frage:

Was muss ich tun, um mein Mesh mit einer "Hülle" zu umgeben, die sich der Form des Meshes anpaßt, so dass ich die Schräge hochlaufen kann, aber auch unter der Rampe durchlaufen kann?

Liebe Grüße, Gina.
www.jk-spiele.de
 

OJay

BeitragSo, Nov 07, 2004 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
mit diesen funktionen kannst du aus jedem beliebigen model ein Tokamak objekt machen. ich rate aber nur bei lowpolyobjekten dazu, also entweder du baust zu jedem model eine lowpoly variante, oder du verwendest die qhull-lib um eins zur laufzeit zu erstellen: http://www.freewebs.com/elias_t/qhulldll.htm

auszug aus der toka-wrapper doku:
Zitat:
TOKSIM_SetStaticMesh(Vertices%,VertexCount%,Triangles%,TriangleCount%)
Parameters:

Vertices% = A pointer to a bank containing all the vertice coordinates. Each vertice is 16 bytes. The first 12 are 3 floats representing X,Y,Z.
VertexCount% = The number of vertices in the bank.
Triangles% = A pointer to a bank containing the triangles. Each triangle is 24 bytes. The first 12 are 3 integers representing the 3 corners. The next integer is the material index.
TriangleCount% = The number of triangles in the bank.

Return value:

None

Description:

Sets a static collision mesh.

The functions in the example (by me,Bot Builder) allow you to do this alot easier.

If you want to associate textures with materials, then first you must call TOK_SetTextureMaterial along with the texture's filaname, and the material index.

Call TOK_AddMesh to add a mesh to the tokamak collisions. Set the recurse variable to true to also make the entity's children collidable. Set mat to a value greater than -1 and texture assotiations are ignored, and the value of mat is used for the whole mesh. A value for mat of -2 and down means that the material will be used if a texture assotiations doesn't exist. The material that will be used in this case is -2-mat. So if mat is -5, and surface 1 doesn't have a material associated texture, the material index will be 3. Set Texture index to set which exture in a multi-textured mesh will determine the material properties.
Call TOK_SetMesh after you're done adding everything. This will pass the meshs and all other properties onward to tokamak.
Call TOK_ReInitializeBanks if at some point or another you would like to restart the mesh-adding process. You would probably do this when switching levels of a game.

Code: [AUSKLAPPEN]

Function TOK_SetTextureMaterial(fil$,Mindex)
tname$(cur)=fil$
tMindex(cur)=Mindex
cur=cur+1
End Function

Function TOK_AddMesh(mesh,recurse=0,mat=1,textureindex=0)
scount=CountSurfaces(mesh)
For ind=1 To scount
  surface=GetSurface(mesh,ind)
  ttltris=ttltris+CountTriangles(surface)
  ttlvert=ttlvert+CountVertices(surface)
Next
ResizeBank triangles,ttltris*24
ResizeBank vertices,ttlvert*16
For ind=1 To scount
  surface = GetSurface(mesh,ind)
  bru=GetSurfaceBrush(surface)
  tex=GetBrushTexture(bru,textureindex)
  nam$=strippath$(TextureName$(tex))
  fo=0
  For a=0 To cur-1
   If tname$(a)=nam$ Then mindex=tMindex(a):fo=1:Exit
  Next
  If fo=0 Then mindex=0
  FreeBrush bru
  ctr=CountTriangles(surface)
  tric=tric+cvt
  cvt=CountVertices(surface)
  ;add vertices to bank
  For v=0 To cvt-1
   TFormPoint VertexX#(surface,v),VertexY#(surface,v),VertexZ#(surface,v),mesh,0
   PokeFloat vertices,offsetv,TFormedX()
   PokeFloat vertices,offsetv+4,TFormedY()
   PokeFloat vertices,offsetv+8,TFormedZ()
   PokeFloat vertices,offsetv+12,0.0
   offsetv=offsetv+16
  Next
  ;fill bank with triangles
  For v=0 To ctr-1
   PokeInt triangles,offsett,tric+TriangleVertex(surface,v,0)
   PokeInt triangles,offsett+4,tric+TriangleVertex(surface,v,1)
   PokeInt triangles,offsett+8,tric+TriangleVertex(surface,v,2)
   If mat=-1 Then PokeInt triangles,offsett+12,mindex Else PokeInt triangles,offsett+12,mat
   PokeInt triangles,offsett+16,0
   PokeInt triangles,offsett+20,0
   offsett=offsett+24
  Next
Next
If recurse Then
  children=CountChildren(mesh)
  If children>0 Then
   For childcount = 1 To children
    child = GetChild(entity,childcount)
    TOK_AddMesh child,recurse,mat 
   Next
  EndIf
EndIf
End Function

Function TOK_SetMesh()
;Hand over the terrain data to Tokamak
TOKSIM_SetStaticMesh vertices,ttlvert,triangles,ttltris
; Now we can free the banks as Tokamak has copied all data
FreeBank vertices
FreeBank triangles
End Function

Function StripPath$(file$)
If Len(file$)>0
  For i=Len(file$) To 1 Step -1
   mi$=Mid$(file$,i,1)
   If mi$="\" Or mi$="/" Then Return name$ Else name$=mi$+name$
  Next
EndIf
Return name$
End Function

Function TOK_ReInitializeBanks()
vertices=CreateBank(0)
triangles=CreateBank(0)
offsett=0
offsetv=0
tric=0
ttlvert=0
ttltris=0
End Function

Gina

BeitragSo, Nov 07, 2004 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Uii, vielen Dank erstmal... Werd mich gleich damit auseinander setzen.

Meine Meshes bestehen hauptsächlich aus Würfeln. Dann dürfte es ja kaum Probleme mit den Polys geben, denke ich.

Gibt es so etwas wie eine magische Grenze, wieviel Polys verkraftet werden?

Vielen Dank, Gina.
www.jk-spiele.de
 

OJay

BeitragMo, Nov 08, 2004 0:37
Antworten mit Zitat
Benutzer-Profile anzeigen
soweit ich weiß nur deine CPU Smile

Gina

BeitragMo, Nov 08, 2004 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
*grml* ich krieg das einfach nicht hin... Crying or Very sad

Ich kann jetzt zwar die Rampe hochlaufen, aber weder Gravitation noch Reibung funktionieren auf der Rampe. Außerdem macht er merkwürdige Sprünge, sobald er an die Kante kommt. Ich hab das bestimmt nicht richtig eingefügt und eingestellt...

Ich mach erstmal nen Tag Pause. Mir schwirrt schon der Kopf.
Wenn du ganz doll Lust haben solltest, kannst du dir gerne meinen code anschauen. Hab ihn samt meshes hochgeladen.

toka.zip (100kb)

Ganz doll vielen Dank für die Hilfe, Gina.
www.jk-spiele.de

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group