problem beim animieren in 3d

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mas93

Betreff: problem beim animieren in 3d

BeitragSo, Okt 07, 2007 15:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute,
Ich versuche gerade ein mesh mit verschiedenen sequenzen zu animieren, doch leider funktioniert es noch nicht richtig.

Es wird irgendwie nur eine sequenz abgespielt.
Habe ich die Befehle überhaupt richtig verwendet, weil das ist das erstemal, dass ich ein mesh animiere...

Hier mal der Code:
Code: [AUSKLAPPEN]

Graphics3D 1024,768,32,2
SetBuffer BackBuffer()

Type schuss
   Field x#,y#,z#
   Field rotate,start
   Field entity
End Type


light=CreateLight()

Global mech=LoadAnimMesh("adder2.b3d")
MoveEntity mech,0,1,0
;Animate mech,1,.28
EntityType mech,2
EntityRadius mech,.5,1

pivot=CreatePivot(mech)
MoveEntity pivot,-2,0,0

cam=CreateCamera(mech)
PositionEntity cam,0,20,-20

plane=CreatePlane()
PositionEntity plane,0,0,0
EntityColor plane,64,64,72
EntityType plane,1

For i=0 To 1000
   cube=CreateCube()
   PositionEntity cube,Rnd(0,5000),0,Rnd(0,5000)
Next


;----------ANIMATIONS SACHEN---------------
Global seq ;Die Aktuelle Sequenz

;Die Animationssequenzen
ExtractAnimSeq(mech,32,32);Stehen
ExtractAnimSeq(mech,32,38);Stehen ->Laufen
ExtractAnimSeq(mech,1,27); Laufen
ExtractAnimSeq(mech,28,32);Laufen ->stehen

Global start
;------------------------------------------

Global y#
Global sprung#

Repeat
   seq=AnimSeq(mech)
   anim()
   
   updateschuss()
   
   ;Der Schuss
   If KeyHit(28)Then
      
      ;Der Linke schuss
      s.schuss=New schuss
      TFormVector -4,13,8, mech,0
      s\x=TFormedX()+EntityX(mech)
      s\y=TFormedY()+EntityY(mech)
      s\z=TFormedZ()+EntityZ(mech)
      s\rotate=EntityYaw(mech)
      s\entity=CreateCylinder()
      RotateMesh s\entity,90,0,0
      
      ;Der Rechte schuss
      s.schuss=New schuss
      TFormVector 4,13,8, mech,0
      s\x=TFormedX()+EntityX(mech)
      s\y=TFormedY()+EntityY(mech)
      s\z=TFormedZ()+EntityZ(mech)
        s\rotate=EntityYaw(mech)
        s\entity=CreateCylinder()
      RotateMesh s\entity,90,0,0
   EndIf
   
   
   If KeyDown(57) Then sprung=1
   
   If Not EntityCollided(mech,1) Then sprung=sprung-0.05
   
   
   
   If KeyDown(200) Then MoveEntity mech,0,0,1 :start=1 ;Animation startet
   If KeyDown(203) Then TurnEntity mech,0,1,0
   If KeyDown(205) Then TurnEntity mech,0,-1,0
   If KeyDown(208) Then MoveEntity mech,0,0,-1
   
   Collisions 2,1,2,2
   TranslateEntity mech,0,sprung,0
   UpdateWorld
   RenderWorld
   Text 20,40,EntityYaw(mech)
   Text 20,20,seq + "        "+start
   Flip
Until KeyHit(1)


Function anim()
   If start=1 Then
      Animate mech,3,1,2
      If seq=38 Then
         stehen=0
         start=0
         laufen=1
      EndIf
   EndIf
   
   If laufen=1 Then
      Animate mech,1,1,3
   EndIf
   
   If anhalten=1 Then
      laufen=0
      Animate mech,3,1,4
      If seq=32 Then
         anhalten=0
         stehen=1
      EndIf
   EndIf
   
   If stehen=1 Then
      Animate mech,1,1,1
   EndIf
End Function

   
Function updateschuss()
   For s.schuss=Each schuss
      If s\start=0 Then
         EntityColor s\entity,255,0,0
         ScaleEntity s\entity,0.3,0.3,6
         PositionEntity s\entity,s\x,s\y,s\z
         RotateEntity s\entity,0,s\rotate,0
         
         s\start=1
      EndIf
      
      If s\start=1 Then
         MoveEntity s\entity,0,0,9
      EndIf
   Next
End Function


wäre nett wenn ihr mir weiterhelfen könntet


mfg
mas93
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]
 

Sung

Gast

BeitragMo, Okt 08, 2007 7:42
Antworten mit Zitat
Hallo Mas93,

ich weis nicht ob das hilft, aber der lauf animationscode von Raytracer funktioniert.

Vergleiche mal wieder aufgebaut ist, vielleicht kannst du da ja was rauslesen. Ich habe davon aber wirklich 0-Plan. Wink

Code: [AUSKLAPPEN]

;ninja

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

Global fpstimer=CreateTimer(30)
Global cam=CreateCamera():PositionEntity cam,0,20,-20,1
Global plane=CreatePlane()
cube=CreateCube():ScaleEntity cube,3,5,8:PositionEntity cube,0,0,20,1
Global light=CreateLight():PositionEntity light,0,100,0,1:PointEntity light,plane
Global tex=LoadTexture("nskinwh.jpg"):ScaleTexture tex,25,25
EntityTexture plane,tex
Global playermesh=LoadAnimMesh("ninja.b3d")
PointEntity cam,playermesh;:EntityParent cam,playermesh
AmbientLight 200,200,200
Global play_once%=3,play_loop%=1,play_stop%=0,geschw#=0.5,trans#=6.0,seq%=0
Global modus%=play_loop,laufkmh#=0.32,ismoving%=0
Global walk%=1,stealthwalk%=2,punchsword%=3,swinsword%=4,twohand%=5,upblock%=6,forwkick%=7
Global pickfloor%=8,jump1%=9,jump2%=10,finishjump%=11,sidekick%=12,spinattack%=13,backflip%=14
Global climb%=15,fallback%=16,fall4ward%=17,breathe%=18,idle1%=19,idle2%=20
Global lastani%=1,turning%=0,jumping%=0,want2jump%=0,jumpdown%=0

ExtractAnimSeq (playermesh,1,14)
ExtractAnimSeq (playermesh,15,30)
ExtractAnimSeq (playermesh,45,59)
ExtractAnimSeq (playermesh,60,68)
ExtractAnimSeq (playermesh,69,72)
ExtractAnimSeq (playermesh,73,83)
ExtractAnimSeq (playermesh,84,93)
ExtractAnimSeq (playermesh,94,102)
ExtractAnimSeq (playermesh,103,111)
ExtractAnimSeq (playermesh,112,125)
ExtractAnimSeq (playermesh,126,133)
ExtractAnimSeq (playermesh,134,145)
ExtractAnimSeq (playermesh,146,158)
ExtractAnimSeq (playermesh,159,165)
ExtractAnimSeq (playermesh,166,173)
ExtractAnimSeq (playermesh,174,182)
ExtractAnimSeq (playermesh,184,205)
ExtractAnimSeq (playermesh,206,250)
ExtractAnimSeq (playermesh,251,300)
Animate playermesh,modus,geschw,seq,trans


Repeat


movement()
animation()
PointEntity light,playermesh
PointEntity cam,playermesh

UpdateWorld
RenderWorld

Text 10,20,"animating: "+Animating(playermesh)
Text 10,40,"animtime : "+AnimTime(playermesh)
Text 10,60,"animseq  : "+AnimSeq(playermesh)
Text 10,80,"animlength:"+AnimLength(playermesh)
Text 10,120,"jumping : "+jumping
;setanimtime entity,zeit(frame),seq

Flip 0
WaitTimer fpstimer
;WaitKey()
Until KeyDown(1)
End


Function movement()

If KeyDown(200) And jumping=0 Then
   MoveEntity playermesh,0,0,laufkmh
   ismoving=1
Else ismoving=0
EndIf


If KeyDown(203) And jumping=0 Then
   turning=1
   If ismoving=1 Then TurnEntity playermesh,0,1,0
   If ismoving=0 Then TurnEntity playermesh,0,10,0
Else turning=0
EndIf

If KeyDown(205) And jumping=0 Then
   turning=1
   If ismoving=1 Then TurnEntity playermesh,0,-1,0
   If ismoving=0 Then TurnEntity playermesh,0,-10,0
Else
  If KeyDown(203)=0 Then turning=0
EndIf
  If KeyDown(57) And jumping=0 Then;And jumping=0 Then
      jumping=1:turning=0:ismoving=0;want2jump=1
  EndIf
If jumping=1 Then
   If jumpdown=0 Then MoveEntity playermesh,0,2,0
EndIf
gravity=-1
MoveEntity playermesh,0,gravity,0
If EntityY#(playermesh,1)< 0.0 Then PositionEntity playermesh,EntityX#(playermesh,1),0.0,EntityZ#(playermesh,1),1
FlushKeys
End Function
;-----------------------------------------
Function animation()
lastani=seq

If jumping=1 Then
   seq=jump1:jumpdown=1
   If AnimSeq(playermesh)=jump1 And AnimTime(playermesh) > 1.2 Then jumpdown=0
   If AnimSeq(playermesh)=jump1 And AnimTime(playermesh) > 7.0 Then seq=idle1:jumping=0
EndIf



;   If jumping=1 Then
;      If AnimSeq(playermesh)=jump1 And (AnimTime(playermesh))=(AnimLength(playermesh)) Then
;         jumping=0
;      EndIf
;   EndIf

If ismoving=1 And AnimSeq(playermesh)<>walk And jumping=0 Then     
    seq=walk
EndIf
If ismoving=0 And jumping=0 Then
   If turning=0 Then seq=idle1
   If turning=1 Then seq=stealthwalk
EndIf

Select seq
Case jump1
;    If AnimTime(playermesh) > 6 Then
      trans=6.0:geschw=0.6:modus=play_once
;    EndIf
;    If AnimTime(playermesh) <= 6 Then
;      trans=6.0:geschw=0.8:modus=play_loop
;    EndIf
Default
    trans=6.0:geschw=0.5:modus=play_loop
End Select


If seq<>lastani Then
   Animate playermesh,modus,geschw,seq,trans
EndIf
;If Animating(playermesh)=0 Then
;   Animate playermesh,modus,geschw,seq,trans
;EndIf
End Function

Tankbuster

BeitragMo, Okt 08, 2007 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
   If start=1 Then
      Animate mech,3,1,2
   EndIf

Wenn ich mich nicht verguckt hab, wird das Mesh also solange animiert, bis start wieder ungleich 1 ist Wink
Also animierst du das erste Frame, die Schleife läuft nochmal durch, und weil start immernoch 1 ist, fängst du wieder an, zu animieren, und startest wieder beim ersten frame Wink dadurch sieht es so aus, als ob sich das Mesh garnicht bewegen/verändern würde, weil es nie weiter als bis zum ersten frame animiert wird Wink

EDIT:
Teste mal sowas in der art, und dann versuch das mal mit keydown Wink

Zitat:
While...

If KeyHit(28) Then Animate mech,3,1,2

RenderWorld()
Wend
Twitter
Download Jewel Snake!
Windows|Android
 

Dreamora

BeitragMo, Okt 08, 2007 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist genau so falsch.

Nimm einfach das If und in dem If wo das animate ist, mach start = 0
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Tankbuster

BeitragDi, Okt 09, 2007 14:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ist daran falsch? die Animation wird immer neu gestartet, wenn start=1 zutrifft >.<

Und erst wenn das Frame bei 38 ist, wird start wieder zu 0

Also wird sich die Animation immer wieder wiederhohlen, denn das Objekt wird nie bis zum 38 Frame animiert Wink
Twitter
Download Jewel Snake!
Windows|Android
 

Dreamora

BeitragDi, Okt 09, 2007 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau genommen ist beides falsch, nur meines mit dem zurück setzen erst am Schluss und Start = 1 setzen nur erlauben wenn die Animation gerade nicht läuft, sorgt immerhin dafür, dass es nicht immer wieder von vorne startet.

Am besten wäre ein State System.

0 -> garnicht
1 -> Animation Starten und State auf 2 oder 3 setzen
2 -> Animation loopt nicht, wenn fertig auf State 0 setzen
3 -> animation loopt, wenn fertig auf State 2 setzen


Dein Ansatz bringt garnix, der ist genau so falsch wie direkt mit "if start = 1", denn die Taste kann man mehr als 1x drücken ( ich trigger die bewegungstasten häufig ) und das ziel dürfte kaum sein, dass die animation mitten im schritt wieder von vorne beginnt oder Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group