problem mit schuss in 3d

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mas93

Betreff: problem mit schuss in 3d

BeitragSa, Okt 06, 2007 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute,
Ich versuche gerade einen Schuss in 3d hinzubekommen.
Es funktioniert eigentlich auch schon, nur stimmt etwas mit dem Winkel des Schusses nicht.
Er stimmt immer nur bei 0 und 180° genau richtig.

Könnt ihr mir sagen warum??

Code: [AUSKLAPPEN]

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

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



light=CreateLight()

mech=LoadAnimMesh("adder2.b3d")
MoveEntity mech,0,100,0
Animate mech,1,.28
EntityType mech,2
EntityRadius mech,50,100

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

plane=CreatePlane()
PositionEntity plane,0,0,0
EntityType plane,1

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


Global y#
Global sprung#

Repeat
   
   updateschuss()
   
   ;Der Schuss
   If KeyHit(28)Then
      
      ;Der Linke schuss
      s.schuss=New schuss
      s\x=EntityX(mech)-5
      s\y=EntityY(mech)+10
      s\z=EntityZ(mech)+10
      s\rotate=EntityYaw(mech)
      s\entity=CreateCylinder()
      
      ;Der Rechte schuss
      s.schuss=New schuss
      s\x=EntityX(mech)+5
      s\y=EntityY(mech)+10
      s\z=EntityZ(mech)+10
      s\rotate=EntityYaw(mech)
      s\entity=CreateCylinder()
   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
   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,start+"       "+ende
   Flip
Until KeyHit(1)


Function updateschuss()
   For s.schuss=Each schuss
      If s\start=0 Then
         ScaleEntity s\entity,1,1,10
         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,5
      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]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Okt 06, 2007 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Hund liegt hier begraben:

Code: [AUSKLAPPEN]
      s\x=EntityX(mech)-5
      s\y=EntityY(mech)+10
      s\z=EntityZ(mech)+10

Du hast Hardcodedpositionierung, wo aber die Startpositionen auch abhängig vom Mechwinkel ist.

Rätzelslösung ist es an einfachsten sich jeweils zwei Pivots (als Child vom Parent''Mech'') an den beiden Schussaustritten zu erstellen. Dann anhand der Positionen der Pivots (ql:EntityX /Y /Z) eben zuvor positionieren. Der Rest wie gehabt.

Komplizierter wäre es mithilfe von den ganzen Vektoren, die Blitz so bietet. Kann ich aber in diesem Fall echt abraten.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

mas93

BeitragSa, Okt 06, 2007 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm könntest du mir da mal n beispiel geben??
Weil ich bin noch neu in 3d und hab noch nie pivots benützt...

wäre nett

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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Okt 07, 2007 3:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte eigendlich nicht mehr ''Vergiss was ich gesagt habe'' schreiben, aber diesmal muss ich es wieder tun. Ich vermute, dass man ohne ''Vektorberechnung'' nicht umrumkommt. Hier meine Lösung:

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

WireFrame 1

camera=CreateCamera()
PositionEntity camera,0,2,-8

light=CreateLight()
TurnEntity light,40,-40,0

mech=CreateCube()

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

schuss=CreateCube()
ScaleEntity schuss,.1,.1,.5




While Not KeyHit(1)
   TurnEntity mech,MouseYSpeed(),-MouseXSpeed(),0
   
   If MouseDown(1)
      ;Rotation ermiteln
      RotateEntity schuss,EntityPitch(mech),EntityYaw(mech),EntityRoll(mech)
      ;Position ermiteln
      TFormVector -2,0,0, mech,0
      PositionEntity schuss,TFormedX(),TFormedY(),TFormedZ()
   End If
   
   MoveEntity schuss,0,0,.5
   
   UpdateWorld
   RenderWorld
   Flip
Wend
End


Halte Maustaste gedrückt, um die Startposition zu sehen. Lasse Maustaste los, um zu schiessen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

mas93

BeitragSo, Okt 07, 2007 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm ok.
Ich habe es jetzt mal versucht einzubauen.
Der Winkel stimmt, aber der Schuss startet nicht an der Possition vom mech...

Könnt ihr mir da auchnoch weiterhelfen??

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,100,0
Animate mech,1,.28
EntityType mech,2
EntityRadius mech,50,100

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

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

plane=CreatePlane()
PositionEntity plane,0,0,0
EntityType plane,1

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


Global y#
Global sprung#

Repeat
   
   updateschuss()
   
   ;Der Schuss
   If KeyHit(28)Then
      
      ;Der Linke schuss
      s.schuss=New schuss
      TFormVector -2,0,0, mech,0
      s\x=TFormedX()
      s\y=TFormedY()
      s\z=TFormedZ()
      s\rotate=EntityYaw(mech)
      s\entity=CreateCylinder()
      
      ;Der Rechte schuss
      ;s.schuss=New schuss
      ;s\x=EntityX(mech)+5
      ;s\y=EntityY(mech)+10
      ;s\z=EntityZ(mech)+10
      ;s\rotate=EntityYaw(mech)
      ;s\entity=CreateCylinder()
   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
   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,start+"       "+ende
   Flip
Until KeyHit(1)


Function updateschuss()
   For s.schuss=Each schuss
      If s\start=0 Then
         ScaleEntity s\entity,1,1,10
         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,5
      EndIf
   Next
End Function


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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Okt 07, 2007 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Schuss wird schon richtig erstellt. Was klar sein sollte ist, dass du deine Schussposition nocht an deinem Mech anpassen musst. Es wäre schön, wenn Codeabschnitte auf allen Rechnern -ohne Mediendaten- funktionieren würden.

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=CreateCube();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,8,-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


Global y#
Global sprung#

Repeat
   
   updateschuss()
   
   ;Der Schuss
   If KeyHit(28)Then
      
      ;Der Linke schuss
      s.schuss=New schuss
      TFormVector -4,2,2, mech,0
      s\x=TFormedX()
      s\y=TFormedY()
      s\z=TFormedZ()
      s\rotate=EntityYaw(mech)
      s\entity=CreateCylinder()
      RotateMesh s\entity,90,0,0
      
      ;Der Rechte schuss
      ;s.schuss=New schuss
      ;s\x=EntityX(mech)+5
      ;s\y=EntityY(mech)+10
      ;s\z=EntityZ(mech)+10
      ;s\rotate=EntityYaw(mech)
      ;s\entity=CreateCylinder()
   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
   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,start+"       "+ende
   Flip
Until KeyHit(1)


Function updateschuss()
   For s.schuss=Each schuss
      If s\start=0 Then
         ScaleEntity s\entity,1,1,10
         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,5
      EndIf
   Next
End Function
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

mas93

BeitragSo, Okt 07, 2007 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, dass ich die possition noch feinanpassen muss, weil mein mech größer ist als die cube ist mir auch klar.
Aber selbst bei deinem code funktioniert der schuss doch nicht richtig.

Wenn man sich auf der stelle dreht, geht alles.
Aber sobald man ein paar schritte nach vorne und z.b nach rechts läuft und dann schießt ist der schuss an der falschen stelle...

Oder hab ich was falsch verstanden?


[EDIT]AHH OK, habs hinbekommen. Ich musste zu den x,y,z possitionen noch die mech possitionen addieren[/EDIT]
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]
  • Zuletzt bearbeitet von mas93 am So, Okt 07, 2007 14:36, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Okt 07, 2007 14:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt, diese Funktion habe ich nicht getestet. Aber als ich dein Beitrag gelesen habe, habe ich ungelogen nicht mehr als 0.8 Sekunden gebraucht, um die Lösung zu wissen:

Code: [AUSKLAPPEN]
      s\x=TFormedX()+EntityX(mech)
      s\y=TFormedY()+EntityY(mech)
      s\z=TFormedZ()+EntityZ(mech)
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

mas93

BeitragSo, Okt 07, 2007 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ich weiss^^
Hab ich dann ja paar sekunden später auch gleich geedited^^
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group