Laden...

DirectX: Box entlang Sinusdarstellung bewegen

Erstellt von Osirisbob2406 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.833 Views
O
Osirisbob2406 Themenstarter:in
33 Beiträge seit 2010
vor 13 Jahren
DirectX: Box entlang Sinusdarstellung bewegen

Hallo Zusammen,

mein Name ist Robert und studiere Medieninformatik. Ich habe das Tutorial von hauptmann hier aus dem Forum zu Managed Direct X & C# gemacht. Das hat mir sehr gut gefallen.

Jetzt möchte ich jedoch ein Box in auf einer Sinuskurve bewegen. Also die Box soll einer nicht sichtbaren Sinuskurve folgen. Die Anzeige ist kein Problem aber dei Funktion, in der ich Parameter wie die Frequenz, Zeit,... eingebe bereitet mir probleme. Besser gesagt ich ich kriege sie nicht hin. Ich habe bereits eine Klasse Animation geschrieben. Bewegungsabläufe von A nach B oder Bezier funktionieren auch. Aber nur die Sinus net.

Weiss jemand von euch wie man das macht?

Gruß und danke schonmal!!

Robert

458 Beiträge seit 2007
vor 13 Jahren

Ein bisschen Code waere schoen, zudem ist "Funktioniert nicht" keine ausreichende Fehlerbeschreibung.

be the hammer, not the nail!

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

bei der Sinuskurve stellen 2pi eine Periode dar (bei Frequenz 1). D.h. das Argument für die Animaiton muss entsprechend in diesen Wertebereich skaliert werden.

Wo hakt es genau?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

O
Osirisbob2406 Themenstarter:in
33 Beiträge seit 2010
vor 13 Jahren

Hier ist die Klasse in der die Funktion geschrieben werden soll... Also ich hab bisher diesen code:

    public class Sinus : Rechner
    {
        Vector3 delta = new Vector3(0,0,0);
        Vector3 begin = new Vector3(0,0,0);
        bool x = false;
        bool y = false;
        bool z = false;
        float f = 0.0f;
        
        
        public Math_Sinus( Vector3 start, Vector3 end, bool xAchse, bool yAchse, bool zAchse, float frequenz)
        {
            this.delta = end;
            this.begin = start;
            this.x = xAchse;
            this.y = yAchse;
            this.z = zAchse;
            this.f = frequenz;

            
        }

        public override Vector3 calculate(float u)
        {
            if(x == true)result = new Vector3(begin.X + (float)Math.Sin(Math.PI * f * u)*delta.X,begin.Y + (float)(((Math.Cos(Math.PI + (Math.PI * u)))+1)/2)*delta.Y, begin.Z + (float)(((Math.Cos(Math.PI + (Math.PI * u)))+1)/2)*delta.Z);
            if(y == true)result = new Vector3(begin.X + (float)(((Math.Cos(Math.PI + (Math.PI * u)))+1)/2)*delta.X,begin.Y + (float)Math.Sin(Math.PI * f * u)*delta.Y, begin.Z + (float)(((Math.Cos(Math.PI + (Math.PI * u)))+1)/2)*delta.Z);
            if(z == true)result = new Vector3(begin.X + (float)(((Math.Cos(Math.PI + (Math.PI * u)))+1)/2)*delta.X,begin.Y + (float)(((Math.Cos(Math.PI + (Math.PI * u)))+1)/2)*delta.Y, begin.Z + (float)Math.Sin(Math.PI * f * u)*delta.Z);
            return result;


Das ist bis jetzt ne simple Bewegung aber ohne die Zeitachse. Die Klasse macht quasi nur einen Bogen. Wenn ich eine box mit dieser Hilfsklasse animiere wirkt sich das nicht so aus wie ich das will. Also ganz banal ... die Box bewegt sich nicht als "Sinuswelle" 😃 fort! Schwer zu erklären..

Ich hoffe ihr verstehe das 😦

5.658 Beiträge seit 2006
vor 13 Jahren

Ich glaube, das Problem liegt an der Zuweisung der "delta"-Variable. Eigentlich müßte dort der Wert von "end" - "begin" drinstehen, aber du speicherst einfach "end". Dadurch ist deine eigentliche Berechnung fehlerhaft. Ansonsten sieht dein Code echt unübersichtlich aus, muß ich leider sagen. Du berechnest immer wieder die gleichen Werte anstatt die Berechnung in Methoden auszulagern bzw. wenigstens das Ergebnis in einer lokalen Variable zwischenzuspeichern. Kein Wunder, daß du irgendwann selbst nicht mehr durchblickst...

Weeks of programming can save you hours of planning

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

in DirectX kann ich dir nicht helfen, aber sie dir mal das angehängte Bild an das zeigt wie die Berechnung zu erfolgen hat.

Was passiert dabei?
Als ersten Schritt wird das Koordinatensystem in den Startpunkt (S) der Sinuskurve verschoben und so rotiert dass der Endpunkt (E) der Sinuskurve mit der y-Achse zusammenfällt. Danach wird der Abstand (d) der Punkte S und E berechnet. Da sich nun der 3D-Sinus auf eine einfache 2D-Funktion verringet hat kann die Berchnung des Funktionsverlaufs einfach erfolgen. In der Formel steht A für die Amplitude des Sinus.

Anstatt den Punkt E mit der y-Achse zusammenfallen zu lassen kann auch eine andere Achse verwendet werden. Es ist nur vorteilhaft den Start- und Endpunkt mit einer Achse zusammenfallen lassen da sich somit das Problem von 3D zu 2D verringert bzw. die Funktion von einem 3D-Definitionsbereich zu einem 1D-Definitionsbereich verringert wird.

Die Box ist dann entsprechend f(y) zu translieren.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

O
Osirisbob2406 Themenstarter:in
33 Beiträge seit 2010
vor 13 Jahren

Danke für eure Antworten!! Die letzte Antwort ist wahrscheinlich die die ich brauche. Hab noch keine Ahnung wie ich das umsetzen kann.

5.658 Beiträge seit 2006
vor 13 Jahren

Hast du mal versucht, die Zeile

this.delta = end;

durch

this.delta = end - start;

zu ersetzen?

Weeks of programming can save you hours of planning

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo Christian,

das könnte funktionieren - auch wenn ich mich durch die calculate-Methode nicht durchgequält habe - aber ich denke es ist einfacher den Ursprung zu translieren und zu rortieren* sowie in meiner Zeichnung -> der Code wird viel einfacher.

* das muss in DirectX wohl möglich sein 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

5.658 Beiträge seit 2006
vor 13 Jahren

Hallo gfoidl,

da hast du natürlich Recht. Alle Funktionen, die man braucht sind in der Matrix- und Vector3-Klasse zu finden. Meine Antwort bezog sich auf den geposteten Algorithmus, zumal der ja angeblich auch für Spline- u.a. Animationen verwendet wird.

Hallo Osirisbob2406,

Wenn du uns schon so einen Quelltext vorsetzt und uns danach fragst, wo der Fehler ist, dann mach dir doch wenigstens die Mühe und versuche das nachzuvollziehen, was dir geantwortet wird.

Christian

Weeks of programming can save you hours of planning

O
Osirisbob2406 Themenstarter:in
33 Beiträge seit 2010
vor 13 Jahren

Glaub mir das tue ich 😉 Bin gerade dabei! Deine Variante hat leider nicht geklappt. Ich werde euch auf dem Laufenden halten, wie es weitergeht.

O
Osirisbob2406 Themenstarter:in
33 Beiträge seit 2010
vor 13 Jahren

Hallo,

ich wollt nur berichten, dass das ganze geklappt hat. Die Methode die gfoidl beschrieben hat, hab ich umgesetzt. Habe die alte Klasse komplett verworfen und neu geschrieben. War zu chaotisch! 😃

Vielen Dank!