In welche Richtung drehen?
Übersicht

![]() |
SmilyBetreff: In welche Richtung drehen? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
deinen Sprung sollst du dann schon selber einbauen ![]() 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 ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group