|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 03.06.2014, 15:17 Titel: Bild auf Bild ausrichten |
|
|
Folgendes Problem: Ich möchte einen Pfeil auf ein Objekt zeigen lassen, dazu schrieb ich diesen Code:
Code: | dy = DeltaYaw(objekt1,objekt2)
dp = DeltaPitch(objekt1,objekt2)
tAngle = ((ATan2(-dy,dp)+360) Mod 360)
MultiPut(0,xmax/2,ymax/2,PfeilPtr,1,1,tAngle,1) |
DeltaYaw und DeltaPitch geben mir den Winkel, der für eine Drehung von Objekt1 auf Objekt2 notwendig ist, siehe auch:
DeltaYaw
DeltaPitch
Dummerweise funktioniert das ganze nicht so wie es soll. Der Pfeil zeigt auf einen Punkt im Nirgendwo, aber nicht auf das gewünschte Objekt("objekt2" im Code).
Ich hänge jetzt schon seit Stunden an diesem Code und komme nicht weiter, vielleicht kann mir ja hier jemand helfen?
mfg, Westbeam |
|
Nach oben |
|
|
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 03.06.2014, 17:02 Titel: |
|
|
Der Rückgabewert von ATAN2 ist ein DOUBLE-Wert, der eine Winkelangabe im Bogenmaß darstellt. Er liegt im Bereich von -Pi bis +Pi.
Multiput erwartet Vielleicht eine Grad Zahl. Vielleicht liegt es daran?
Mach mal eine Umrechnung.
Code: |
const PI as double = 3.1415926535897932
Grad=Bogenmass / PI * 180
|
Zuletzt bearbeitet von RockTheSchock am 03.06.2014, 17:05, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 03.06.2014, 17:04 Titel: |
|
|
Da du Multiput benutzt, gehe ich mal von einer 2D Geschichte aus...
Ein kleiner Auszug aus meiner Rotationskrückensammlung:
vielleicht hilfts:
Die Funktion gibt einen Richtungsvektor aus, lässt sich aber schnell zur Ausgabe des Bogenmaßes bewegen, aus dem dann der Winkel berechnet werden kann.
es gilt das kartesische Koordinatensystem!!!
Code: | const as single doublepi =atn (1) * 8
type vector
x as single
y as single
end type
'Liefert die Richtung zu dest als Vector mit Länge 1
'eine Lösung ohne Längenermittlung und Wurzelziehen, vermutlich nicht schneller
function GetDirectionVector (origin as vector,dest as vector) as vector
dim as single Rad
dim as vector d
d.x= dest.x - origin.x
d.y= dest.y - origin.y
Rad=atan2(d.y,d.x)'mittels ATAN2 zu Bogenmaß wandeln
if sgn(Rad)=-1 then Rad= doublepi + Rad'Bogenmaß zu einem Wert zwischen 0 bis 2*PI bringen
'Vektor d brauchen wir nicht mehr und nutzen ihn anders:
'Bogenmaß wieder zurück zu einem Vektor wandeln
d.x=cos(Rad)
d.y=sin(Rad)
'd zeigt immernoch von origin aus gesehen in Richtung dest, hat aber jetzt die Länge von 1
function=d
end function |
Mutton |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 03.06.2014, 17:07 Titel: |
|
|
Ändert leider nicht viel :/
Der Pfeil zeigt immer auf die selbe Stelle, egal auf welche Koordinate er eingestellt ist.
@Muttonhead: Tut mir Leid, habe deinen Post erst nicht gesehen. Dein Code hilft mir leider nicht, da bei dem ganzen Spaß auch der Drehwinkel des Quellobjekts ausgewertet werden muss. Also praktisch die Kamera. Wenn ich die bewege, muss sich der Pfeil ja wieder drehen. Habe ich im ersten Post vergessen. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 03.06.2014, 19:10 Titel: |
|
|
Ich habe da jetzt nicht rumprobiert, aber folgende Vorschläge, um das Problem einzugrenzen:
- Einsatz von MultiPut mit vorgegebenen Winkeln (z. B. in einer Schleife von 0 bis 360 oder von 0 bis 3.14), um zu testen, ob es mit den korrekten Winkeln funktioniert
- Berechnung der Winkel mit den ersten drei von dir geposteten Zeilen und Ausgabe mit PRINT, um zu testen, ob überhaupt die richtigen Winkelausgaben herauskommen (wie RockTheSchock schon sagte, sind das Bogenmaßangaben, also brnigt dir auch MOD 360 hier nichts).
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 03.06.2014, 19:27 Titel: |
|
|
nemored hat Folgendes geschrieben: | Einsatz von MultiPut mit vorgegebenen Winkeln (z. B. in einer Schleife von 0 bis 360 oder von 0 bis 3.14), um zu testen, ob es mit den korrekten Winkeln funktioniert |
Das Pfeilbild wird definitiv gedreht, aber es zeigt immer auf einen unsinnigen Punkt mitten im Nichts. Der Pfeil dreht sich auch mit, sobald ich die Kamera bewege. Er dreht sich auch richtig, aber halt auf die falsche Koordinate.
Zitat: | Berechnung der Winkel mit den ersten drei von dir geposteten Zeilen und Ausgabe mit PRINT, um zu testen, ob überhaupt die richtigen Winkelausgaben herauskommen (wie RockTheSchock schon sagte, sind das Bogenmaßangaben, also brnigt dir auch MOD 360 hier nichts). |
Wenn ich den Code so umschreibe:
Code: | dy = DeltaYaw(objekt1,objekt2)
dp = DeltaPitch(objekt1,objekt2)
tAngle = ((ASin(dy/dp))) |
Erhalte ich Werte von 0 bis 20 für tAngle(darüber hinaus wird nur "-nan" ausgegeben) |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 03.06.2014, 19:49 Titel: |
|
|
Hmm, ASIN ist ja auch eine völlig andere Rechenoperation als ATAN ...
Wenn du mir mal eine Skizze machst, was die Werte DeltaYaw und DeltaPitch darstellen und welcher Winkel dann gesucht ist, kann ich vielleicht weiterhelfen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 03.06.2014, 20:05 Titel: |
|
|
Oh natürlich tut mir Leid, das ASin ging aus einem Experiment hervor. Mit ATan2 erhalte ich Werte von -180 bis 180.
Ich kann nicht zeichnen ich weiß.
Der rote Punkt unten links ist die bewegliche Kamera, der andere rote Punkt ist das Zielobjekt, auf das der Pfeil zeigen soll.
Winkel Alpha will ich haben.
Edit: Das ist ein Delta-Winkel, der Winkel, der für eine Drehung der Kamera zum Objekt notwendig ist:
Edit2: Okay der liebe angros47 aus dem englischen Forum hat mir geholfen ... Offenbar hatte ich das gleiche Problem 3 Jahre zuvor:
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|