Laden...

Multiplikation von Vektor3D und 3x3 Matrix

Erstellt von belayason vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.943 Views
B
belayason Themenstarter:in
9 Beiträge seit 2018
vor 5 Jahren
Multiplikation von Vektor3D und 3x3 Matrix

Hallo Leute,

ich habe einen Vektor in meinem Koordinatensystem den ich gerne mit Qaternionen rotieren lassen würde, die ich von meinem Sensor bekomme. Mein ansatz habe ich wie folgt gestaltet. Zu beginn habe ich die Rotationsmatrix aus meinen Quaternionen erstellt. Das sieht wie folgt aus.

private double[,] QtoROT (string[] Quats)
        {

            double[,] arr1 = new double[3, 3];

            double W = double.Parse(Quats[0], CultureInfo.InvariantCulture);
            double X = double.Parse(Quats[1], CultureInfo.InvariantCulture);
            double Y = double.Parse(Quats[2], CultureInfo.InvariantCulture);
            double Z = double.Parse(Quats[3], CultureInfo.InvariantCulture);

            double R11 = (W*W + X*X - Y*Y - Z*Z);
            double R12 = 2.0 * (X * Y - W * Z);
            double R13 = 2.0 * (X * Z + W * Y);

            double R21 = 2.0 * (X * Y + W * Z);
            double R22 = W*W - X*X + Y*Y - Z*Z;
            double R23 = 2.0 * (Y * Z - W * X);

            double R31 = 2.0 * (X * Z - W * Y);
            double R32 = 2.0 * (Y * Z + W * X);
            double R33 = W*W - X*X - Y*Y + Z*Z;

            arr1[0, 0] = R11;
            arr1[0, 1] = R12;
            arr1[0, 2] = R13;

            arr1[1, 0] = R21;
            arr1[1, 1] = R22;
            arr1[1, 2] = R23;

            arr1[2, 0] = R31;
            arr1[2, 1] = R32;
            arr1[2, 2] = R33;

            return arr1;

        }

Anschließend habe ich eine weitere Funtion erstellt die nun die Multiplikation durchführen soll. Den Vektor habe ich Manuell erstellt.


        private void CalcRotVec(double[,] RotMatrix)
        {
            double x =     0;
            double y =  55.0;
            double z = -35.0;

            Vector3D POI = new Vector3D( x, y, z);

            Vector3D PoiROT = Vector3D.Multiply(POI , RotMatrix);
        }

In der Multiplikation bekomme ich nun einen Error.
Fehler CS1503 Argument "2": Konvertierung von "double[,]" in "double" nicht möglich.
Dabei geht es um die Rotationsmatrix die ich aus den Quaternionen erstellt habe. Kann mit jemand einen Tipp geben?

mfg
belayason

16.807 Beiträge seit 2008
vor 5 Jahren
  1. Du hast Methoden und keine Funktionen
  2. double[] ist was anderes als double. Das eine ist ein Array, das andere ein einzelner Wert.

Leider scheine ich blind zu sein, welche Zeile es betrifft.
Leider markierst Du es auch nirgends.

Als Hinweis: [Artikel] C#: Richtlinien für die Namensvergabe

B
belayason Themenstarter:in
9 Beiträge seit 2018
vor 5 Jahren

Es handelt sich um diese Zeile


Vector3D PoiROT = Vector3D.Multiply(POI , RotMatrix);

16.807 Beiträge seit 2008
vor 5 Jahren

Da reicht ein Blick in die Doku (oder IntelliSense): die Methode hat keine passende Signatur.
Es gibt hier keine Möglichkeit ein double-Array zu übergeben.

Wenn Du eine Matrix übergeben willst, dann musst Du halt einfach den passenden Typ dafür nehmen, den die Methode auch akzeptiert: Multiply(Vector3D, Matrix3D)

B
belayason Themenstarter:in
9 Beiträge seit 2018
vor 5 Jahren

Ich benötige eine 3x3 Matrix. Ist diese Implementierung richtig?

            Matrix3D matrix1 = new Matrix3D(R11, R12, R13, 0, R21, R22, R23, 0, R31, R32, R33, 0, 0, 0, 0, 0);
16.807 Beiträge seit 2008
vor 5 Jahren

Davon abgesehen, dass ich mich mit Vektoren, Matrix und Co nicht auskenne: wieso probierst Du es nicht einfach?

5.657 Beiträge seit 2006
vor 5 Jahren

Siehe auch deine letzten beiden Beiträge dazu:
Würfel in WPF mit Quaternionen drehen lassen
XAML Dateien in meinem Projekt nicht vorhanden, soll sie laut Tutorial aber öffnen?

Bevor mal mit 3D-Programmierung beginnt, solltete man erstmal verstanden haben, wie man die Datentypen des Frameworks anwendet, und wie man die Dokumentation verwendet.

Eine Matrix3D mußt du nicht implementieren. Dieser Datentyp ist bereits vorhanden, du mußt ihn nur nutzen. Du kannst eben nicht erwarten, daß eine beliebige Methode ein beliebiges Array akzeptiert und dann mit einem anderen beliebigen Array multipliziert. Wie soll das funktionieren?

Wenn etwas nicht funktioniert wie gewünscht, dann schau in die Doku. Dort steht alles, was du wissen mußt, um die Features des Frameworks anzuwenden.

[FAQ] Wie finde ich den Einstieg in C#?
[Hinweis] Bitte schau in die SDK-/MSDN-Doku
[Tipp] Schau in die Doku! - Möglichkeiten der Informationsgewinnung

Weeks of programming can save you hours of planning