| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Transformationsmatrix (3663 mal gelesen)
|
FGR_DIZZY Mitglied Admin
Beiträge: 13 Registriert: 26.05.2004
|
erstellt am: 24. Okt. 2004 15:51 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, ich kämpfe nun schon seit geraumer Zeit mit dem Problem die Berechnung der Rotation eines Bauteiles in einer IAM nachvollziehen zu können. Bis zur Transformationsmatrix bin ich schon gekommen ... die Translation auszulesen ist auch soweit kein Problem ... aber die Drehwinkel im X, Y und Z... da komme ich einfach nicht ran. Ich will einfach nur an die Angaben (X-Winkel Y-Winkel, Z-Winkel) ran, welche mir der Inventor in der Registerkarte "Exemplar" des Eigenschaftsdialoges eines Teiles in einer IAM anzeigt. In diversen Artikeln über Rotationsmatritzen bin ich inzwischen soweit gekommen dass ich die Rotation um eine Achse sauber bekommen. Ist das Teil aber zusätzlich noch um eine weiter Achse oder gar alle 3 gedreht hörts bei mir auf. Kann mir da jemans helfen? Hat jemand schon mal was ähnliches programmiert? MfG FGR
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Charly Setter Ehrenmitglied V.I.P. h.c.
Beiträge: 11977 Registriert: 28.05.2002 Trau keiner Diva unter SP2....
|
erstellt am: 24. Okt. 2004 18:26 <-- editieren / zitieren --> Unities abgeben: Nur für FGR_DIZZY
Schau mal in der Suche, hier oder im "großen" Forum. Das Thema hatten wir schon mal. Ich hatte damals auch passende Literatur gepostet. Fakt ist, das Du die Winkel nicht direkt aus der Transformationsmatrix lesen kannst, sondern nur Sin- bzw. Cosinüsse Ich hoffe diese Nüsse schmecken Dir dann auch lg Mathias
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
FGR_DIZZY Mitglied Admin
Beiträge: 13 Registriert: 26.05.2004
|
erstellt am: 25. Okt. 2004 15:50 <-- editieren / zitieren --> Unities abgeben:
das mit den Nüssen ist mir schon klar, unklar ist mir nur wie ich auf die drei einzelnen Winkel komme. Alle verfügbare Literatur zeigt immer nur die Drehung um eine Achse - da ist ja naoch easy - aber leider sind die Teile nun mal frei im Raum verdreht .. MfG FGR Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 25. Okt. 2004 16:34 <-- editieren / zitieren --> Unities abgeben: Nur für FGR_DIZZY
Zitat: Original erstellt von FGR_DIZZY: das mit den Nüssen ist mir schon klar, unklar ist mir nur wie ich auf die drei einzelnen Winkel komme. Alle verfügbare Literatur zeigt immer nur die Drehung um eine Achse - da ist ja naoch easy - aber leider sind die Teile nun mal frei im Raum verdreht ..MfG FGR
Nicht dass ich Zeit hätte, aber was willst du eigentlich machen ? Um die Position eines Teiles eindeutig zu definieren braucht man 1 Ursprungs-Punkt und 3 Vektoren. Hast du dir schon mal den Matrix Array geholt ( GetMatrixData ) ? Ist ein 15-stelliger Array, und da sind die Werte drin für den Ursprung und die Vektoren:
- Vektor X - Wert X
- Vektor Y - Wert X
- Vektor Z - Wert X
- Ursprung - Wert X
- Vektor X - Wert Y
- Vektor Y - Wert Y
- Vektor Z - Wert Y
- Ursprung - Wert Y
- Vektor X - Wert Z
- Vektor Y - Wert Z
- Vektor Z - Wert Z
- Ursprung - Wert Z
- Leer
- Leer
- Leer
Mit ein bisschen Mathe dürftest du deine Winkel berechnen können. Teil um 3 Achsen drehen, dürfte zB. mit: Code:
SetToAlignCoordinateSystems(FromOrigin As Point, FromXAxis As Vector, FromYAxis As Vector, FromZAxis As Vector, ToOrigin As Point, ToXAxis As Vector, ToYAxis As Vector, ToZAxis As Vector) FromOrigin Input Point object that defines the origin to map the coordinate system from. FromXAxis Input Vector object that defines the X-axis to map the coordinate system from. FromYAxis Input Vector object that defines the Y-axis to map the coordinate system from. FromZAxis Input Vector object that defines the Z-axis to map the coordinate system from. ToOrigin Input Point object that defines the origin to map the coordinate system to. ToXAxis Input Vector object that defines the X-axis to map the coordinate system to. ToYAxis Input Vector object that defines the Y-axis to map the coordinate system to. ToZAxis Input Vector object that defines the Z-axis to map the coordinate system to.
funktionieren. Oder 3x einzeln mit: Code:
SetToRotation(Angle As Double, Axis As Vector, Center As Point) Angle Input Double that specifies the angle of rotation. Axis Input Vector object. Center Input Point object that specifies the origin.
usw.
------------------ Grüße daywa1k3r Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
FGR_DIZZY Mitglied Admin
Beiträge: 13 Registriert: 26.05.2004
|
erstellt am: 25. Okt. 2004 17:03 <-- editieren / zitieren --> Unities abgeben:
Hallo daywa1k3r, vielleicht ist ja nicht so richtig rübergekommen was ich brauche ... ... ich will hier kein Teil drehen sondern die Drehung des Teils ermitteln. Und wenn ich mir die Werte in der Translationsmatrix über die Arcusfunktionen rückrechne komm eich nicht auf das was mir der Inventor Registerkarte "Exemplar" des Eigenschaftsdialoges eines Teiles in einer IAM anzeigt. MfG FGR Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
waldi Mitglied Softwerker
Beiträge: 272 Registriert: 07.08.2001
|
erstellt am: 26. Okt. 2004 08:02 <-- editieren / zitieren --> Unities abgeben: Nur für FGR_DIZZY
Hi, normalerweise nimmst du das Skalarprodukt zwischen den Achsen, deren Winkel du berechnen willst, als z.B. die X-Achse des Assembly Koordinatensystems (1,0,0) und den X-Vektor der Occurrence Matrix. Ist das Skalar -1, ist der Winkel 180 Grad, bei 1 ist er 0 Grad und ansonsten ist es der arcus cos des Skalar Produktes. Ob du dann aber die gleichen Werte bekommst, die der Inventor intern hat, weiss ich nicht, das kommt wohl auf einen Versuch an.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 26. Okt. 2004 09:02 <-- editieren / zitieren --> Unities abgeben: Nur für FGR_DIZZY
Hallo, ich habe gestern auch mal etwas getestet... Code:
Sub test_matrix() Dim oOcc As ComponentOccurrence Set oOcc = ThisApplication.ActiveDocument.ComponentDefinition.Occurrences(1) Dim oMatrix1 As Matrix Set oMatrix1 = oOcc.Transformation Dim oOrigin1 As Point Dim oX1 As Vector Dim oY1 As Vector Dim oZ1 As Vector Call oMatrix1.GetCoordinateSystem(oOrigin1, oX1, oY1, oZ1) Dim oMatrix2 As Matrix Set oMatrix2 = ThisApplication.TransientGeometry.CreateMatrix Dim oOrigin2 As Point Dim oX2 As Vector Dim oY2 As Vector Dim oZ2 As Vector Call oMatrix2.GetCoordinateSystem(oOrigin2, oX2, oY2, oZ2) Debug.Print (oX2.AngleTo(oX1) * 180) / 3.14159265 Debug.Print (oY2.AngleTo(oY1) * 180) / 3.14159265 Debug.Print (oZ2.AngleTo(oZ1) * 180) / 3.14159265 End Sub
Also die Winkel, die Inventor ausgibt, bekomme ich nicht hin. Aber irgendwie sind die Werte auch komisch, oder ich habe das Grundprinzip nicht verstanden. Ein Beispiel: In eine Baugruppe das erste Teil einfügen. Die Winkel checken: X = 0 Y = 0 Z = 0 Mit dem Makro die Werte checken X = 0 Y = 0 Z = 0 Soweit so gut. Jetzt mal das Teil um die Y Achse um 90°UZS drehen. Und jetzt kommt das, was ich nicht verstehe. Y Winkel darf sich doch nicht verändert haben, X und Z aber schon um 90°. Wenn ich aber das Exemplar anschaue, dann ist es genau umgekehrt. X = 0 Y = 90 Z = 0 Mein Makro gibt mir ( zumindest mir ) logische Werte aus: X = 90 Y = 0 Z = 90 Das sind doch die Winkel im Vergleich zum Ursprung der Baugruppe. Irgendwie verstehe ich es nicht ganz. Ich habe gestern ein paar Sachen probiert ( invertieren, multiplizieren, ... ) aber ich habe die Daten aus dem Exemplar nicht bekommen. Bis bald... ------------------ Grüße daywa1k3r Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PaulSchuepbach Moderator Programmierer
Beiträge: 1005 Registriert: 01.10.2003
|
erstellt am: 31. Okt. 2004 18:08 <-- editieren / zitieren --> Unities abgeben: Nur für FGR_DIZZY
Hallo zusammen, ich habe endlich Zeit und Muse gefunden, das Problem mal naeher anzuschauen. Es sieht fast so aus, als ob die Vektoren mittels 'GetCoordinateSystem' falsch bzw. vertauscht gesetzt wuerden. Wenn ich die Vektoren mauell aus der Matrix setzte, dann sind die Werte der Achs-Winkel zueinander korrekt. Macht folgendes: Ein Klotz auf 0,0,0 erstellen. Ein Assy oeffnen, Klotz auf 0,0,0 einfuegen. Klotz nochmals einfuegen und mit Winkelabhaengigkeit versehen, so dass ^der 2. Klotz um eine Achse gederht werden kann (z.B. um Z). Code laufenlassen und im Debug-Fenster erscheinen die Winkelwerte. Wenn z.B. die 2. instanz 90 nGrad um Z gederht ist kommt 90 90 0 heraus - was korrekt ist. Code:
Private Sub chkAngle() Dim oApp As Inventor.Application Set oApp = ThisApplication Dim oDoc As AssemblyDocument Set oDoc = oApp.ActiveDocument Dim oOcc1 As ComponentOccurrence Set oOcc1 = oDoc.ComponentDefinition.Occurrences(1) Dim oMat1 As Matrix Set oMat1 = oOcc1.Transformation Dim oOcc2 As ComponentOccurrence Set oOcc2 = oDoc.ComponentDefinition.Occurrences(2) Dim oMat2 As Matrix Set oMat2 = oOcc2.Transformation Dim oO1 As Point Dim oX1 As Vector Dim oY1 As Vector Dim oZ1 As Vector ' hier scheint das Problem zu sein: die Vektoren werden offensichtlich falsch gesetzt Call oMat1.GetCoordinateSystem(oO1, oX1, oY1, oZ1) Dim oO2 As Point Dim oX2 As Vector Dim oY2 As Vector Dim oZ2 As Vector ' hier natuerlich dasselbe wie oben: die Vektoren werden offensichtlich falsch gesetzt Call oMat2.GetCoordinateSystem(oO2, oX2, oY2, oZ2) ' also setze ich die Vektoren manuedll - aus der Matrix ' 1. Instanz oX1.X = oMat1.Cell(1, 1) oX1.Y = oMat1.Cell(1, 2) oX1.Z = oMat1.Cell(1, 3) oY1.X = oMat1.Cell(2, 1) oY1.Y = oMat1.Cell(2, 2) oY1.Z = oMat1.Cell(2, 3) oZ1.X = oMat1.Cell(3, 1) oZ1.Y = oMat1.Cell(3, 2) oZ1.Z = oMat1.Cell(3, 3) ' 2. Instanz oX2.X = oMat2.Cell(1, 1) oX2.Y = oMat2.Cell(1, 2) oX2.Z = oMat2.Cell(1, 3) oY2.X = oMat2.Cell(2, 1) oY2.Y = oMat2.Cell(2, 2) oY2.Z = oMat2.Cell(2, 3)
oZ2.X = oMat2.Cell(3, 1) oZ2.Y = oMat2.Cell(3, 2) oZ2.Z = oMat2.Cell(3, 3) ' jetzt klappt's auch mit den Winkeln der einzelnen Achsen zurinander, Ausgabe korrekt Debug.Print Round(oX1.AngleTo(oX2) * 180 / 3.14159265, 3) Debug.Print Round(oY1.AngleTo(oY2) * 180 / 3.14159265, 3) Debug.Print Round(oZ1.AngleTo(oZ2) * 180 / 3.14159265, 3)
End Sub
Gruesse, Paul www.morecam.ch/cad.htm Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Goose Mitglied Maschinenbautechniker / geb. Zerspanungsmechaniker Fachrichtung Frästechnik
Beiträge: 202 Registriert: 29.03.2007 IV2021 R4 CATIA V6 R2013x
|
erstellt am: 08. Dez. 2017 14:25 <-- editieren / zitieren --> Unities abgeben: Nur für FGR_DIZZY
Zitat: Original erstellt von daywa1k3r: Hallo,ich habe gestern auch mal etwas getestet... <BLOCKQUOTE><font size="2" face="Courier New">Code:<HR> Sub test_matrix() Dim oOcc As ComponentOccurrence Set oOcc = ThisApplication.ActiveDocument.ComponentDefinition.Occurrences(1) Dim oMatrix1 As Matrix Set oMatrix1 = oOcc.Transformation Dim oOrigin1 As Point Dim oX1 As Vector Dim oY1 As Vector Dim oZ1 As Vector Call oMatrix1.GetCoordinateSystem(oOrigin1, oX1, oY1, oZ1) Dim oMatrix2 As Matrix Set oMatrix2 = ThisApplication.TransientGeometry.CreateMatrix Dim oOrigin2 As Point Dim oX2 As Vector Dim oY2 As Vector Dim oZ2 As Vector Call oMatrix2.GetCoordinateSystem(oOrigin2, oX2, oY2, oZ2) Debug.Print (oX2.AngleTo(oX1) * 180) / 3.14159265 Debug.Print (oY2.AngleTo(oY1) * 180) / 3.14159265 Debug.Print (oZ2.AngleTo(oZ1) * 180) / 3.14159265 End Sub <HR></font></BLOCKQUOTE>
Hallo zusammen,
ich würde gerne anstelle des Winkels den X- Wert ausgeben lassen! Debug.Print (oX2.AngleTo(oX1) * 180) / 3.14159265 Leider finde ich in den List Properties/ Methods nichts wie Measure oder sonstiges. Kann mir da jemand den zugehörigen Befehl nennen um den Abstand zu messen!? Danke und Gruß
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 13. Dez. 2017 10:08 <-- editieren / zitieren --> Unities abgeben: Nur für FGR_DIZZY
den Abstand zu was? Call oMatrix1.GetCoordinateSystem(oOrigin1, oX1, oY1, oZ1) dieser Befehl liefert ja schon die Koordinaten des Bauteil-Ursprungs zum Ursprung der Baugruppe -> im Vektor oOrigin1. Darin sind die Werte zu finden, die auch bei den iProp./Exemplar stehen. Natürlich in der internen IV-Einheit (cm).
------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|