Probleme mit tokamak und Bewegung
Übersicht

![]() |
GinaBetreff: Probleme mit tokamak und Bewegung |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... ![]() Tausend Dank, Gina. |
||
www.jk-spiele.de |
OJay |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
bitte mal den ganzen code mit dummy objekten...so ohne weiteres ohne testen kann man das nicht klären... | ||
![]() |
Gina |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab jetzt folgende Befehle gefunden und ausprobiert, aber leider stellt sich der gewünschte Effekt nicht ein... ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich gebe nicht auf, auch wenn mir hier offensichtlich keiner helfen kann ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
soweit ich weiß nur deine CPU ![]() |
||
![]() |
Gina |
![]() Antworten mit Zitat ![]() |
---|---|---|
*grml* ich krieg das einfach nicht hin... ![]() 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group