In welche Richtung drehen?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Smily

Betreff: In welche Richtung drehen?

BeitragDi, Aug 21, 2007 0:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,
Ich stehe derzeit ein bisschen auf dem schlauch:

Ich habe eine Variable Ri, welche einen Winkel angibt, in welche richtung ein bestimmtest Objekt gedreht ist.. ausserdem habe ich eine Variable Ri_Soll, in der steht, in welcher Richtung sich das Objekt letztendlich befinden soll.
Das Objekt soll sich langsam in die Richtung von Ri_Soll drehen, aber woher weis ich, ob ich ri+1 oder ri-1 machen soll?

ein einfaches "if ri > risoll .... else ...." geht nicht, da sich das objekt, wenn z.B. ri 1 ist und ri_soll 359 einmal ganz herum drehen würde.

Ich hoffe ihr versteht, was ich meine. Ich hatte schon ein wenig rumprobiert, komme aber irgendwie nicht auf die lösung :/

thx,
Smily0412
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Aug 21, 2007 4:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, gerade heute oder vielleicht auch gestern, hat hier jemand genau das gleiche Problem. Schaue mal da rein, vielleicht findest du die Lösung da auch schon.

Was ich dir mitgeben kann ist folgendes. Vorrausgesetzt; du möchtest nicht eine gleichmässige Drehgeschwindigkeit haben, sondern
- viel Winkelunterschied - schnelle Drehbewegung
- wenig Winkelunterschied - langsame Drehbewegung

Dann kannst du es auch mit ql:AlignToVector machen. Da kannst du mit [Achse] angeben, dass sich dein Objekt zB nur unter Y gedreht werden soll, und das [Temp] auch nicht zu vergessen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Dreamora

BeitragDi, Aug 21, 2007 10:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Welche sprache betrifft die Frage? (sieht nämlich sehr nach NICHT-BM aus)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Smily

BeitragDi, Aug 21, 2007 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
das ganze ist eigentlich von der Sprache unabhängig, da es eine reine Mathematische bzw. Logische Frage ist.
Ich brauch ja nur die Eigentliche Antwort darrauf... in blitz umsetzen kann ich das dann ja selbst.
Ich hatte es nur hier gepostet, da ich es für ein kleinen Code brauche, den ich derzeit in Bmax schreibe.
Ich habe, glaube ich, den Thread, von dem Hectic geschrieben hat gefunden. Ich werde mir das ganze mal genauer anschauen, sieht aber beim ersten überfliegen schon ganz brauchbar aus.
Ich sollte aufhören Sätze mit "Ich" zu beginnen

mfg, Smily0412

LordArtus

BeitragMi, Sep 05, 2007 8:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Code: [AUSKLAPPEN]

r=risoll-riist ' risoll = selbsterklärend in Grad (0-360) , riist = aktuelle Position in Grad (0-360)
If r=0 Or r=360 Or r=-360
   'nothing
ElseIf r<180 And r>0
   ri=ri+1 ' oder Flag für plus-drehbewegung setzen
Else
   ri=ri-1 ' oder Flag für minus-drehbewegung setzen
EndIf


Hoffe , konnte etwas helfen

MfG

LordArtus

Edit: Sorry , es hat sich ein Fehler bei "ElseIF" eingeschlichen.Nicht Or sondern And.Und bei If fehlt noch r=-360.Habs korrigiert.Sollte jetzt funzen.
  • Zuletzt bearbeitet von LordArtus am Mi, Sep 05, 2007 19:35, insgesamt 4-mal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Sep 05, 2007 9:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Code funktioniert leider nicht, da du den Sprung von 0° auf 360° nicht mitberücksichtigt. So ist - wie Smily bereits ganz am Anfang erwähnte - dieser zunächst ein Problem. Bei B3D kann man sich mit OnBoard -Befehlen aushelfen. Bei BB/BMax sieht es etwas anders aus.

Mein Vorschlag aus dem verstaubten Unterverzeichnis dazu ist folgender Code: [AUSKLAPPEN]
Graphics 400,400,0,2
SetBuffer BackBuffer()

Local mx%=0        ;Maus-X-Position
Local my%=0        ;Maus-Y-Position
Local xp#=200      ;Gegner-X-Position
Local yp#=200      ;Gegner-Y-Position
Local ri#=90       ;Gegner-Ist-Rotationswinkel
Local rs#=0        ;Gegner-Soll-Rotationswinkel


While Not KeyHit(1)
   mx=MouseX()
   my=MouseY()
   
   rs=ATan2(my-yp,mx-xp)
   ri=ri+Sgn(Sin(rs-ri))
   
;   r=rs-ri ;risoll-riist ' riist = aktuelle Position
;   If r=0 Or r=360
;      ;nothing
;   ElseIf r<180 Or r>0
;      ri=ri+1 ; oder Flag für plus-drehbewegung setzen
;   Else
;      ri=ri-1 ; oder Flag für minus-drehbewegung setzen
;   EndIf
   
;   If Sqr((mx-xp)^2+(my-yp)^2)>40 Then
;      xp=xp+Cos(ri)/2
;      yp=yp+Sin(ri)/2
;   End If
   
   Color 255,0,0
   Line xp,yp,xp+Cos(ri)*20,yp+Sin(ri)*20
   Color 255,255,255
   Rect mx-4,my-4,9,9,0
   Oval xp-4,yp-4,9,9,0
   
   Flip
   Cls
Wend
End


Oder ich habe dein Code fehlinterpretiert?
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

LordArtus

BeitragMi, Sep 05, 2007 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

deinen Sprung sollst du dann schon selber einbauen Wink

Code: [AUSKLAPPEN]

Graphics 400,400,0,2
'SetBuffer BackBuffer()

Local mx%=0        'Maus-X-Position
Local my%=0        'Maus-Y-Position
Local xp#=200      'Gegner-X-Position
Local yp#=200      'Gegner-Y-Position
Local ri#=90       'Gegner-Ist-Rotationswinkel
Local rs#=0        'Gegner-Soll-Rotationswinkel


While Not KeyHit(KEY_ESCAPE)
   mx=MouseX()
   my=MouseY()
   
   rs=ATan2(my-yp,mx-xp)
   ri=ri+Sgn(Sin(rs-ri))

   '-------------
   If Abs(ri)=360
           ri=0
   EndIf
   '-------------

   r=rs-ri 'risoll-riist ' riist = aktuelle Position
   If r=0 Or r=360 Or r=-360
     'nothing
   ElseIf r<180 And r>0
      r1=r1+1 ' oder Flag für plus-drehbewegung setzen
   Else
      r1=r1-1 ' oder Flag für minus-drehbewegung setzen
   EndIf
   
   If Sqr((mx-xp)^2+(my-yp)^2)>40 Then
      xp=xp+Cos(ri)/2
      yp=yp+Sin(ri)/2
   EndIf
   
   SetColor 255,0,0
   DrawLine xp,yp,xp+Cos(ri)*20,yp+Sin(ri)*20
   SetColor 255,255,255
   DrawRect mx-4,my-4,9,9
   DrawOval xp-4,yp-4,9,9
   DrawText "rs : "+rs+" ri : "+ri,0,0
   Flip 1
   Cls
Wend
End


Sprung:
Code: [AUSKLAPPEN]

   '-------------
   If Abs(ri)=360
           ri=0
   EndIf
   '-------------


MfG

LordArtus

p.s. Übrigens netter Code Smile

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Sep 05, 2007 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, es ist eben nicht mit dieser Abfrage getan. Du hast übrigens noch eine Zeile Code von mir mit drin, die ganau das macht. Kommentier mal folgende Zeile aus und sehe selbst:
Code: [AUSKLAPPEN]
   ri=ri+Sgn(Sin(rs-ri))

Diese meine Codezeile macht genau das. Das Problem der ''Winkelgrenzen'' wird mithilfe einer weiteren Winkelberechnung behoben. Ich will nicht klugscheissern, aber mich interessiert es wirklich, ob dein Code (ohne meine Zeile) nun funktioniert oder nicht, da Befehle wie Sin und Sgn nicht grad die schnellsten sind, wäre deine Lösung sicherlich die bessere. Diese funktioniert bei mir nur leider nicht. Könntest du das nochmal überprüfen? Vielleicht habe ich auch einfach was falsch interpretiert.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

LordArtus

BeitragDo, Sep 06, 2007 9:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ,
ich entschuldige mich , erstens , weil ich deinen Code nicht richtig angeschaut habe und zweitens , dass ich meinen Code eigentlich gar nicht getestet habe (war echt nur so ein spontaner Gedanke , wie es funktionieren sollte).
Und du hast Recht , es ist fehlerhaft.

So müsste es richtig sein:
Code: [AUSKLAPPEN]

   r=rs-ri 'risoll-riist ' riist = aktuelle Position
   If r=0
     'nothing
   ElseIf (r<180 And r>0) Or r<-180
      ri=ri+1 ' oder Flag für plus-drehbewegung setzen
   Else
      ri=ri-1 ' oder Flag für minus-drehbewegung setzen
   EndIf


Und hier dein Code (etwas angepasst):
Code: [AUSKLAPPEN]

Graphics 400,400,0,2
'SetBuffer BackBuffer()

Local mx%=0        'Maus-X-Position
Local my%=0        'Maus-Y-Position
Local xp#=200      'Gegner-X-Position
Local yp#=200      'Gegner-Y-Position
Local ri%=90       'Gegner-Ist-Rotationswinkel
Local rs%=0        'Gegner-Soll-Rotationswinkel

While Not KeyHit(KEY_ESCAPE)
   mx=MouseX()
   my=MouseY()
   
   rs=ATan2(my-yp,mx-xp)+180
   'ri=ri+Sgn(Sin(rs-ri))

   '-------------
   If ri<0
         ri=359
   ElseIf ri>359
         ri=0
   EndIf
   '-------------

   r=rs-ri 'risoll-riist ' riist = aktuelle Position
   If r=0 
     'nothing
   ElseIf (r<180 And r>0) Or r<-180
      ri=ri+1 ' oder Flag für plus-drehbewegung setzen
   Else
      ri=ri-1 ' oder Flag für minus-drehbewegung setzen
   EndIf
   
   If Sqr((mx-xp)^2+(my-yp)^2)>40 Then
      xp=xp-Cos(ri)/2
      yp=yp-Sin(ri)/2
   EndIf
   
   SetColor 255,0,0
   DrawLine xp,yp,xp-Cos(ri)*20,yp-Sin(ri)*20
   SetColor 255,255,255
   DrawRect mx-4,my-4,9,9
   DrawOval xp-4,yp-4,9,9
   DrawText "rs : "+rs+" ri : "+ri,0,0
   Flip 1
   Cls
Wend
End


MfG

LordArtus

Edit: Das Abs(r)=360 kann man sich sparen , weil 360=0 ist. Habs korrigiert.
  • Zuletzt bearbeitet von LordArtus am Do, Sep 06, 2007 20:11, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Sep 06, 2007 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, funktioniert nun wunderbar und vor allem präziser als mein Code. Bei meinem Code schwankt er am Ende zwischen zwei Winkeln hin und her...
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group