[B3D] Schüsse nach Maus rotieren

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

N0X

Betreff: [B3D] Schüsse nach Maus rotieren

BeitragSa, Feb 20, 2010 1:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!
Ich möchte, wenn ich auf die linke Maustaste klicke, einen Schuss abfeuern der auch direkt aus der Mündung der Waffe kommt und in die richtige Richtung fliegt. (Daran haperts bei mir Laughing )
Ich weiß auch nicht so genau ob es denn sinnvoll ist das Geschoss überhaupt mit einem Modell anzeigen zu lassen etc.

Hier der Code-Ausschnitt:
Code: [AUSKLAPPEN]
Const PLY=1,TER=2
Global speed#=2
Global schuss_speed# = 5.0

Type schuss
   Field x#,y#,z#
   Field mesh
End Type

;---------------------------------;

timer = CreateTimer(60)

Graphics3D 1680,1050,32,1
SetBuffer BackBuffer()

Global piv = CreatePivot():PositionEntity piv,-500,22,0
Global cam = CreateCamera(piv)
Global cub = LoadMesh("weapon_1.3ds",cam)
PositionEntity cub,8,-5,20

Global bullet = LoadMesh("bullet.3ds")
HideEntity bullet

light = CreateLight()
map = LoadMesh("map_1.3ds")

EntityType cam,PLY
EntityType map,TER

Collisions PLY,TER,2,2
While Not KeyHit(1)
   WaitTimer(timer)
   
   move()
   mouse()
   shot()
   
   TranslateEntity cam,0,-1,0
   
   ;---------------------;
   Flip 0
   UpdateWorld()
   RenderWorld()
   Text 0,0,EntityX(cam)
   Text 0,12,EntityY(cam)
   Text 0,24,EntityZ(cam)
Wend
End

Function move()
   If KeyDown(17) Then
      MoveEntity cam,0,0,speed#
   EndIf
   
   If KeyDown(31) Then
      MoveEntity cam,0,0,-speed#
   EndIf
   
   If KeyDown(30) Then
      MoveEntity cam,-speed#,0,0
   EndIf
   
   If KeyDown(32) Then
      MoveEntity cam,speed#,0,0
   EndIf
End Function

Function mouse()
   dx#=(GraphicsWidth()/2-MouseX())*0.2
   dy#=(GraphicsHeight()/2-MouseY())*0.2
   TurnEntity cam,-dy,dx,0
   RotateEntity cam,EntityPitch(cam,1),EntityYaw(cam,1),0,1
   MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
End Function

Function shot()
   Local mh = MouseHit(1)
   If mh Then
      s.schuss = New schuss
      s\mesh = CopyEntity(bullet)
      s\x# = EntityX(cam)-470
      s\y# = EntityY(cam)+22
      s\z# = EntityZ(cam)+0
   EndIf
   For s.schuss = Each schuss
      s\z# = s\z# + schuss_speed#
      PositionEntity s\mesh,s\x#,s\y#,s\z#
      TurnEntity s\mesh,-dy,dx,0
   Next
End Function


Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

HackerBoyZ

BeitragSa, Feb 20, 2010 1:43
Antworten mit Zitat
Benutzer-Profile anzeigen
benutze mal die suche... stichwort "atan2", gabs schon sehr sehr oft die frage.

N0X

BeitragSa, Feb 20, 2010 1:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mir jetzt alle Threads durchgelesen, es wird immer über das drehen von Bildern geredet, aber im 3D Bereich ist da fast nichts!
Wie kann ich denn nun meine Patrone so schießen, dass sie in die richtige Richtung fliegt?

Mfg,
N0X

Rolling Eyes
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Silver_Knee

BeitragSa, Feb 20, 2010 3:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Also du kannst mit CameraPick und AligntoVector arbeiten oder es wirklich manuell mit sin cos und tan ausrechnen

N0X

BeitragSa, Feb 20, 2010 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe eine noch einfachere Lösung gefunden, aber
1. wird der Schuss nach dem Abfeuern noch mitbewegt
2. die Rotierung klappt noch nicht ganz

Was habe ich vergessen (bzw. falsch gemacht)?

Mfg,
N0X

Hier die Funktion:
Code: [AUSKLAPPEN]
Function shot()
   Local mh = MouseHit(1)
   If KeyHit(59) Then
      s.schuss = New schuss
      s\mesh = CopyEntity(bullet)
      PositionEntity s\mesh,EntityX(cam)-488,EntityY(cam)+19,EntityZ(cam)-5
      RotateEntity s\mesh,EntityPitch(cam),EntityYaw(cam),0
   EndIf
   For s.schuss = Each schuss
      MoveEntity s\mesh,0,0,schuss_speed#
   Next
End Function
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Xeres

Moderator

BeitragSa, Feb 20, 2010 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
"mitbewegt"? Dann hat bullet ein Parent?
Wie immer: "klappt nicht" ist nicht unbedingt aussagekräftig...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

N0X

BeitragSa, Feb 20, 2010 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstes Problem hat sich erledigt. (cam hatte einen Parent)
Zweites Problem bleibt, wenn ich bei der Positionierung von "s\mesh", bei EntityX() noch ein +5 oder ähnliches dranhänge. Warum?

Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Xeres

Moderator

BeitragSa, Feb 20, 2010 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Welches Problem? Was soll passieren?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

N0X

BeitragSa, Feb 20, 2010 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Rolling Eyes
Die Patrone (bullet, s\mesh) soll aus dem Gewehrlauf kommen. (Dieser ist an Cam gehängt und auf Koordinaten: 8,-5,20)
Wenn ich die Patrone auf "EntityX(cam), EntityY(cam), EntityZ(cam)" positioniere, kommt der Schuss ja logischerweise aus mir selbst. Jetzt soll der schuss aber aus dem Gewehr kommen, wenn ich die Koordinaten vom Gewehr von der der Camera subtrahiere, ist wenn ich die Maus nicht bewege alles ok, aber wenn ich sie nach links rechts oben unten bewege verschieben sich die Schusskoordinaten anders als die Maus. (d.h. sie kommen nicht mehr aus dem Gewehr)

Warum und wie kann ich das lösen?

Mfg,
N0X

P.S.: Besser? Laughing
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Xeres

Moderator

BeitragSa, Feb 20, 2010 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Jau, das ist besser.
Warum nimmst du nicht direkt die Gewehr-Koordinaten? Wenn du dich im 3D Raum drehst, kannst du nicht mit simplen Differenzen arbeiten, sondern müsstest mit sinus/cosinus die Position berechnen (ich empfehle dazu eine Skizze Wink ).
Die meisten Shooter werden auch nie so genau sein, die Kugeln tatsächlich aus dem Lauf der Waffe feuern zu lassen - das geht auch immer gradlinig vom Spielermittelpunkt (etwa Mitte das Kopfes) aus.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

N0X

BeitragSa, Feb 20, 2010 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, aber das Gewehr klebt bei mir ja an der Cam, also verändern sich nur die Koordinaten von der Cam.
Und die Koordinaten-Abweichungen sind echt groß, wenn ich die Maus bewege.

Hier sonst mal die Maus-Funktion:
Code: [AUSKLAPPEN]
Function mouse()
   dx#=(GraphicsWidth()/2-MouseX())*0.2
   dy#=(GraphicsHeight()/2-MouseY())*0.2
   TurnEntity cam,-dy,dx,0
   RotateEntity cam,EntityPitch(cam,1),EntityYaw(cam,1),0,1
   MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
End Function
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Xeres

Moderator

BeitragSa, Feb 20, 2010 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
RotateEntity cam,EntityPitch(cam,1),EntityYaw(cam,1),0,1
Was hat das für einen Sinn? Du drehst die Kamera auf den Winkel der Kamera.
Wo befindet sich denn die Waffe?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

N0X

BeitragSa, Feb 20, 2010 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz ehrlich, ich weiß es nicht. Ich habe diese Funktion einfach kopiert. Embarassed
Aber ohne diese Zeile wäre die Kamera schief. Razz

Habe ich kopiert, weil ich nur Mausdrehungen mit Winkelbegrenzungen programmieren kann. Diese hat keine. Laughing

//EDIT:
Winkelbegrenzung?
Was red ich da...
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Midimaster

BeitragSa, Feb 20, 2010 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich mach das immer ganz simpel:

der Schuss wird als Child des Gewehrs createt. Dann wird er ein wenig in Richtung z bewegt, dann löse ich die Parent/Child-Verbindung zwischen Gewehr und Schuss. Ab da brauche ich den schuss nur noch in Z-Richtung zu bewegen. Er schießt 100% dahin wo das Gewehr gezeigt hatte.

Geht das in diesem Fall bei Nox nicht auch?

N0X

BeitragSa, Feb 20, 2010 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie löst man denn die Child-Parent Verbindung wieder auf?
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

count-doku

BeitragSa, Feb 20, 2010 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
EntityParent mesh,0


mfg,
count-doku

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group