AlignToVector - Raketenwerfer schießt daneben

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Willi die Rübe

Betreff: AlignToVector - Raketenwerfer schießt daneben

BeitragDo, Okt 11, 2007 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Tagchen,
Ich brauchte mal eine kurze Verschnauffpause von meinem Editor und habe dann mal kurzerhand beschlossen einen Raketenwerfer mit Zielverfolgung, so wie z.B. in Half-Life 2 oder Crysis, zu programmieren. Laughing
So weit so gut, allerdings verfehlt die Rakete ihr Ziel immer um ein kleines Stück, selbst auf linearer Ebene. Und irgendwie finde ich meinem Code einfach keinen Fehler. Vllt. findet ihn ja jemand von euch, hier ist er:


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

cam = createcamera()
PositionEntity cam, 0,0,-5

Type Tshot
   Field Hshot, Hpiv ; Hshot= Handle des Schussentity, Hpiv = Handle des Zielpivots
End Type

;--------- Hauptschussentity
EShot=CreateCylinder(30)
ScaleEntity      EShot,.1,.5,.1
EntityColor      EShot, 25,25,150
HideEntity      EShot

;--------- Raum
cube = CreateCube()
FlipMesh               cube
ScaleEntity            cube,80,40,80
EntityPickMode      cube,2
EntityShininess      cube, 1

;--------- Licht
light = CreateLight(2)
LightColor            light,25,25,5
PositionEntity      light,70,10,0
TurnEntity            light,91,0,0

;--------- Ziel Markierung
c1=createcube()
EntityColor c1, 255,0,0



Global shots_count% ; Anzahl Raketen


; Hauptschleife
Repeat   
   PositionEntity Eshot, EntityX(cam),   EntityY(cam),   EntityZ(cam)
   
   TurnEntity       cam,0,                  -MouseXSpeed(),   0, 1
   TurnEntity       cam,MouseYSpeed(),0                        ,   0

   entity = CameraPick(cam,400,300)
   
   If MouseHit(1)
      s.Tshot = New Tshot
      s\Hpiv = CreatePivot()      ; Zielpivot erstellen
      PositionEntity s\Hpiv,   PickedX(),   PickedY(),   PickedZ() ; Position des Zielpivots bestimmmen
      s\Hshot = CopyEntity( EShot )   ; Schussentity von dem Hauptschussentity kopieren
      ShowEntity s\Hshot   ;Schussentity sichtbar machen
      AlignToVector s\Hshot,   EntityX(s\Hpiv),   EntityY(s\Hpiv),   EntityZ(s\Hpiv),   2,   1 ; Schussentity zum Zielpivot ausrichten
      shots_count% = shots_count%+1 ; Counter erhöhen
   EndIf
   
   PositionEntity c1,   PickedX(),   PickedY(),   PickedZ() ; Rote Markierung setzten
   
   s.Tshot= Last Tshot   ; Letzter Schuss
   If shots_count%<>0 Then PositionEntity s\Hpiv,   PickedX(),   PickedY(),   PickedZ() ; Zielpivot des letzten Schusses an die Mauskoordinaten setzten
   
   For s.Tshot = Each Tshot
         AlignToVector s\Hshot,   EntityX(s\Hpiv),   EntityY(s\Hpiv),   EntityZ(s\Hpiv),   2,   .03 ; Schuss langsam ausrichten
         MoveEntity s\Hshot,   0,   .4,   0 ; Schuss bewegen
   Next
   
   UpdateWorld()
   RenderWorld()
   
   Color 255,0,0
   Text   15,15, shots_count%
   MoveMouse 400,300
   
   Flip
Until KeyHit(1)


Ob das Problem bei AlignToVector liegt kann ich nicht sagen, aber ich vermute es.
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage

Lobby

BeitragDo, Okt 11, 2007 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ligt unglaublicherweise an
Code: [AUSKLAPPEN]
PositionEntity cam, 0,0,-5
Mad

ich vermute mal, dass es einfach die Ansicht die Realität verfälscht(oder dass CameraPick es mit Kameraverschiebung nicht schafft) Confused

probiers mal mit(oder ganz ohne, da 0|0|0 Standart ist)
Code: [AUSKLAPPEN]
PositionEntity cam, 0,0,0
Rolling Eyes
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

Willi die Rübe

BeitragDo, Okt 11, 2007 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal vielen Dank, da hätte ich das Problem im Leben nie vermutet.

Aber schau dir mal den Code an:
Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2
 
SetBuffer BackBuffer()

cam = createcamera()
PositionEntity cam, 0,0,50

Type Tshot
   Field Hshot, Hpiv ; Hshot= Handle des Schussentity, Hpiv = Handle des Zielpivots
End Type

;--------- Hauptschussentity
EShot=CreateCylinder(30)
ScaleEntity      EShot,.1,.5,.1
EntityColor      EShot, 25,25,150
HideEntity      EShot
EntityType      EShot, 1

;--------- Raum
cube = CreateCube()
FlipMesh               cube
ScaleEntity            cube,80,40,80
EntityPickMode      cube,2
EntityShininess      cube, 2
EntityType            cube,2
;--------- Licht
light = CreateLight(2)
LightColor            light,25,25,5
PositionEntity      light,70,10,0
TurnEntity            light,91,0,0

;--------- Ziel Markierung
c1=createcube()
EntityColor c1, 255,0,0



Global shots_count% ; Anzahl Raketen


; Hauptschleife
Repeat   
   Collisions 1,2,2,1
   TurnEntity       cam,0,                  -MouseXSpeed(),   0, 1
   TurnEntity       cam,MouseYSpeed(),0                        ,   0
   
   entity = CameraPick(cam,400,300)
   
   px=pickedx()   
   py=pickedy()
   pz=pickedz()
   
   If MouseHit(1)
      s.Tshot = New Tshot
      s\Hpiv = CreatePivot()      ; Zielpivot erstellen

      s\Hshot = CopyEntity( EShot )   ; Schussentity von dem Hauptschussentity kopieren
      PositionEntity s\Hshot, EntityX(cam),   EntityY(cam),   EntityZ(cam)
      PositionEntity s\Hpiv,   PX,   PY,   PZ ; Position des Zielpivots bestimmmen
      AlignToVector s\Hshot,   EntityX(s\Hpiv),   EntityY(s\Hpiv),   EntityZ(s\Hpiv),   2,   1 ; Schussentity zum Zielpivot ausrichten
      shots_count% = shots_count%+1 ; Counter erhöhen
   EndIf
   

   
   PositionEntity c1,   PX,   PY,   PZ ; Rote Markierung setzten
   

   For s.Tshot = Each Tshot
         AlignToVector s\Hshot,   EntityX(s\Hpiv),   EntityY(s\Hpiv),   EntityZ(s\Hpiv),   2,   .03 ; Schuss langsam ausrichten
         MoveEntity s\Hshot,   0,   .4,   0 ; Schuss bewegen
   Next
   
   s.Tshot= Last Tshot   ; Letzter Schuss
   If shots_count%<>0 Then PositionEntity s\Hpiv,   Px,   PY,   PZ ; Zielpivot des letzten Schusses an die Mauskoordinaten setzten
   
   UpdateWorld()
   RenderWorld()
   
   Color 255,0,0
   s.Tshot= Last Tshot   ; Letzter Schuss
   
   If shots_count%<>0
      Text 15,70, EntityX(s\Hpiv)   
      Text 15,86, EntityY(s\Hpiv)      
      Text 15,101, EntityZ(s\Hpiv)   
      
      Text 15,130, EntityX(s\Hshot)   
      Text 15,145, EntityY(s\Hshot)      
      Text 15,160, EntityZ(s\Hshot)   
      
      
   EndIf
   
   Text   15,15, px
   Text   15,30, py
   Text  15,45, pz
;   Text 15,70,
   MoveMouse 400,300
   
   Flip
Until KeyHit(1)



Da müssten theoretisch, wenn man die Maus nicht bewegt, oben links alle 3 Koordinaten aller 3 Entities gleich sein. Allerdings sind sie nur gleich, wenn x und y=0 sind. Sonst weicht immer eine Koordinate ein wenig ab.
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage
  • Zuletzt bearbeitet von Willi die Rübe am Do, Okt 11, 2007 20:05, insgesamt 2-mal bearbeitet

Willi die Rübe

BeitragDo, Okt 11, 2007 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
shit, wollte editieren, bitte löschen Embarassed
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage

Lobby

BeitragDo, Okt 11, 2007 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
hängt das was du meinst vielleicht damit zusammen, dass die Kamera sich bei dir jetzt auf 0,0,50 befindet?
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

Willi die Rübe

BeitragDo, Okt 11, 2007 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist ja meine Absicht, ich will ja später die Kamera auch noch woanders haben außer bei 0,0,0, deshalb sollte es auch damit funktionieren. Ich wollte damit nur schauen, ob sich damit der Abstand des "Verfehlens" vergrößert. Aber durch die Koordinaten oben links sieht man ja jetzt, dass das auch tatsächlich nicht stimmt, also dass da tatsächlich, selbst bei einer geraden Linie ohne Mausbewegung, der Cylinder das Ziel verfehlt.

z.B. schieße mal auf die Koordinaten 30,5,80. Dort wird dann auch der Pivot erstellt, was man an den zweiten drei Koordinaten sehen kann, nur bei den Dritten zeigt er an: 10.87, 1.81, 78.99 also bis auf die Z Koordinate gibt es eine größere Abweichung.
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage
 

Dreamora

BeitragDo, Okt 11, 2007 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist ja schön dass du die Kamera irgendwo haben willst. Nur dann solltest du vielleicht (aber nur vielleicht Wink ) für den Vektor auch effektiv den Vektor von Camera zu Entity verwenden und nicht den Vektor von 0,0,0 zur Entity Smile

Bzw um korrekt zu sein: Du musst für den Vektor den Vektor Projektil -> Ziel nehmen, nicht Kamera. Ist nur so, dass zum Zeitpunkt der Erzeugung das überein stimmt.
Je weiter du jedoch von 0,0,0 weg bist und daran vorbei zielst, desto grösser die Abweichungen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Willi die Rübe

BeitragDo, Okt 11, 2007 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Arg, danke für den Tipp, daran habe ich heute auch überhaupt nicht gedacht Smile

Code: [AUSKLAPPEN]
      TFormPoint 0,0,0, s\hshot, s\hpiv
      AlignToVector s\Hshot,   -TFormedX(),-TFormedY(),-TFormedZ(),   2,   .3


So funktioniert es jetzt wie es sollte, danke Very Happy

Edit: Wer am kompletten Code interessiert ist:

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

cam = createcamera()
PositionEntity cam, 0,0,-5

Type Tshot
   Field Hshot, Hpiv ; Hshot= Handle des Schussentity, Hpiv = Handle des Zielpivots
End Type

;--------- Hauptschussentity
EShot=CreateCylinder(30)
ScaleEntity      EShot,.1,.5,.1
EntityColor      EShot, 25,25,150
HideEntity      EShot

;--------- Raum
cube = CreateCube()
FlipMesh               cube
ScaleEntity            cube,80,40,80
EntityPickMode      cube,2
EntityShininess      cube, 1

;--------- Licht
light = CreateLight(2)
LightColor            light,25,25,5
PositionEntity      light,70,10,0
TurnEntity            light,91,0,0

;--------- Ziel Markierung
c1=createcube()
EntityColor c1, 255,0,0



Global shots_count% ; Anzahl Raketen


; Hauptschleife
Repeat   
   PositionEntity Eshot, EntityX(cam),   EntityY(cam),   EntityZ(cam)
   
   TurnEntity       cam,0,                  -MouseXSpeed(),   0, 1
   TurnEntity       cam,MouseYSpeed(),0                        ,   0

   entity = CameraPick(cam,400,300)
   
   If MouseHit(1)
      s.Tshot = New Tshot
      s\Hpiv = CreatePivot()      ; Zielpivot erstellen
      PositionEntity s\Hpiv,   PickedX(),   PickedY(),   PickedZ() ; Position des Zielpivots bestimmmen
      s\Hshot = CopyEntity( EShot )   ; Schussentity von dem Hauptschussentity kopieren
      ShowEntity s\Hshot   ;Schussentity sichtbar machen
      AlignToVector s\Hshot,   EntityX(s\Hpiv),   EntityY(s\Hpiv),   EntityZ(s\Hpiv),   2,   1 ; Schussentity zum Zielpivot ausrichten
      shots_count% = shots_count%+1 ; Counter erhöhen
   EndIf
   
   PositionEntity c1,   PickedX(),   PickedY(),   PickedZ() ; Rote Markierung setzten
   
   s.Tshot= Last Tshot   ; Letzter Schuss
   If shots_count%<>0 Then PositionEntity s\Hpiv,   PickedX(),   PickedY(),   PickedZ() ; Zielpivot des letzten Schusses an die Mauskoordinaten setzten
   
   For s.Tshot = Each Tshot
             TFormPoint 0,0,0, s\hshot, s\hpiv
      AlignToVector s\Hshot,   -TFormedX(),-TFormedY(),-TFormedZ(),   2,   .3 ; Schuss langsam ausrichten
         MoveEntity s\Hshot,   0,   .4,   0 ; Schuss bewegen
   Next
   
   UpdateWorld()
   RenderWorld()
   
   Color 255,0,0
   Text   15,15, shots_count%
   MoveMouse 400,300
   
   Flip
Until KeyHit(1)
  • Zuletzt bearbeitet von Willi die Rübe am Fr, Mai 23, 2008 16:48, insgesamt einmal bearbeitet
 

Dreamora

BeitragDo, Okt 11, 2007 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte Smile

Und das ist meist so mit Bäumen und Wäldern ...

Drum zeichne ich mir meist ne Skizze vom Wald Wink Sieht man die Bäume besser Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group