Autor
|
Thema: AXIS Rotation (3409 mal gelesen)
|
IAmTheFabian Mitglied Konstrukteur
Beiträge: 58 Registriert: 17.10.2013 CATIA V5 R19 Windows 7 Professionel Intel Core 2 Duo8GB RAM 64Bit System
|
erstellt am: 23. Apr. 2014 10:37 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich möchte ein Achsensystem erstellen. Dazu positioniere ich das Achsensystem im Raum durch die Koordinaten. Das bekomme ich soweit hin. Code: 'Frameursprung setzen axisSystem1.OriginType = catAxisSystemOriginByCoordinates Dim arrayOfVariantOfDouble1(3) arrayOfVariantOfDouble1(0) = CDbl(CStr(koordinatenListe(0))) arrayOfVariantOfDouble1(1) = CDbl(CStr(koordinatenListe(1))) arrayOfVariantOfDouble1(2) = CDbl(CStr(koordinatenListe(2))) axisSystem1.PutOrigin arrayOfVariantOfDouble1
Dann möchte ich allerdings mit vorhandenen Winkeln (Drehung um x, um y, um z) das Achsensystem ausrichten. Bei der Axis Rotation stoße ich aber auf Grenzen. Kann mir da jemand weiter helfen? ------------------ Anfänger! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 23. Apr. 2014 11:11 <-- editieren / zitieren --> Unities abgeben: Nur für IAmTheFabian
Servus Schau dir dazu mal die Methoden "PutVectors" bzw "PutXAxis", "PutYAxis" und "PutZAxis" an. Vermutlich musst du die Eulerwinkel in Richtungsvektoren der Achsen umrechnen (viel Spaß dabei) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
IAmTheFabian Mitglied Konstrukteur
Beiträge: 58 Registriert: 17.10.2013 CATIA V5 R19 Windows 7 Professionel Intel Core 2 Duo8GB RAM 64Bit System
|
erstellt am: 23. Apr. 2014 13:06 <-- editieren / zitieren --> Unities abgeben:
ja das habe ich versucht. ich möchte die 3x3 Matrix mit Werten füllen doch wenn ich eine Zelle in der Matrix einen Wert zuweise, verändern sich die anderen Werte in der Matrix. ------------------ Anfänger! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 23. Apr. 2014 13:12 <-- editieren / zitieren --> Unities abgeben: Nur für IAmTheFabian
Servus Mit "PutVectors" kannst du doch die Richtungen von X- und Y-Achse auf einmal definieren, oder? Die Z-Achse sollte sich automatisch ergeben (oder entscheidet dann Catia selbstständig ob es sich um ein rechtsseitiges oder linksseitiges Koordinatensystem handelt) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
IAmTheFabian Mitglied Konstrukteur
Beiträge: 58 Registriert: 17.10.2013 CATIA V5 R19 Windows 7 Professionel Intel Core 2 Duo8GB RAM 64Bit System
|
erstellt am: 23. Apr. 2014 13:13 <-- editieren / zitieren --> Unities abgeben:
|
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 23. Apr. 2014 14:38 <-- editieren / zitieren --> Unities abgeben: Nur für IAmTheFabian
Einfach die 12er Matrix ausrechnen und wieder zurück übergeben. Habe ich bei http://hoblila.wordpress.com/download/ auch so gemacht. Du setzt mit PutOrigin() ja nur den Ursprungspunkt. Bernd hat Dich auch auf gute Funktionen dafür hingewiesen. ich würd's aber mit GetCoordinates() machen, was es auch geben müsste, aber schon so lange her. :-) ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing [Diese Nachricht wurde von HoBLila am 23. Apr. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
IAmTheFabian Mitglied Konstrukteur
Beiträge: 58 Registriert: 17.10.2013 CATIA V5 R19 Windows 7 Professionel Intel Core 2 Duo8GB RAM 64Bit System
|
erstellt am: 23. Apr. 2014 14:49 <-- editieren / zitieren --> Unities abgeben:
|
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 23. Apr. 2014 15:02 <-- editieren / zitieren --> Unities abgeben: Nur für IAmTheFabian
Der Code ist halt echt mies, würde ich heute nicht mehr so abgeben. :-) So war früher aber mein Mathe-Modul aufgebaut. :-D Hier die Funktion für die Rotation: Code:
Public Sub Rotate(ByRef i_dWinkel As Double _ , i_arrDblAxis() As Double _ , io_arrVecToTransform() As Double _ , i_arrDblOrignToTransform() As Double) Dim wina As Double, winb As Double Dim cosa As Double, cosb As Double, sina As Double Dim br As Double, bx As Double Dim a1 As Double, a2 As Double, a3 As Double Dim X(1 To 3) As Double 'Richtungsvektor nach Q Dim t(1 To 3) As Double Dim arrDblKreuzprod1(1 To 3) As Double Dim arrDblVecBetweenOrign(1 To 3) As Double Dim arrDblVecToPoint(1 To 3) As Double Dim dAngle As Double 'I = Normiert(P-C) arrDblVecBetweenOrign(1) = io_arrVecToTransform(1) arrDblVecBetweenOrign(2) = io_arrVecToTransform(2) arrDblVecBetweenOrign(3) = io_arrVecToTransform(3) dAngle = Normieren(arrDblVecBetweenOrign) 'J=KxI dAngle = Kreuzprodukt(arrDblKreuzprod1, i_arrDblAxis, arrDblVecBetweenOrign) 'R = P - C arrDblVecToPoint(1) = io_arrVecToTransform(1) arrDblVecToPoint(2) = io_arrVecToTransform(2) arrDblVecToPoint(3) = io_arrVecToTransform(3) wina = i_dWinkel cosa = wina * (PI / 180) cosa = Cos(cosa) If Abs(cosa) < EPSILON Then cosa = 0 If wina >= 0 And wina < 180 Then sina = Sqr(1 - cosa ^ 2) Else sina = -Sqr(1 - cosa ^ 2) End If If Abs(sina) < EPSILON Then sina = 0 'Richtungsvektor nach Q ' x(1) = cosa * (j(2) * k(3) - j(3) * k(2)) - sina * (i(2) * k(3) - i(3) * k(2)) ' x(2) = sina * (i(1) * k(3) - i(3) * k(1)) - cosa * (j(1) * k(3) - j(3) * k(1)) ' x(3) = cosa * (j(1) * k(2) - j(2) * k(1)) - sina * (i(1) * k(2) - i(2) * k(1)) X(1) = cosa * (arrDblKreuzprod1(2) * i_arrDblAxis(3) - arrDblKreuzprod1(3) * i_arrDblAxis(2)) - sina * (arrDblVecBetweenOrign(2) * i_arrDblAxis(3) - arrDblVecBetweenOrign(3) * i_arrDblAxis(2)) X(2) = sina * (arrDblVecBetweenOrign(1) * i_arrDblAxis(3) - arrDblVecBetweenOrign(3) * i_arrDblAxis(1)) - cosa * (arrDblKreuzprod1(1) * i_arrDblAxis(3) - arrDblKreuzprod1(3) * i_arrDblAxis(1)) X(3) = cosa * (arrDblKreuzprod1(1) * i_arrDblAxis(2) - arrDblKreuzprod1(2) * i_arrDblAxis(1)) - sina * (arrDblVecBetweenOrign(1) * i_arrDblAxis(2) - arrDblVecBetweenOrign(2) * i_arrDblAxis(1)) 'Strecken des gedrehten Vektors bx = Betrag(X()) 'Sollte nach Voraussetzung 1 sein br = Betrag(arrDblVecToPoint()) t(1) = X(1) * br / bx t(2) = X(2) * br / bx t(3) = X(3) * br / bx Dim dBuffer(1 To 3) As Double dBuffer(1) = io_arrVecToTransform(1) dBuffer(2) = io_arrVecToTransform(2) dBuffer(3) = io_arrVecToTransform(3) io_arrVecToTransform(1) = i_arrDblOrignToTransform(1) + t(1) io_arrVecToTransform(2) = i_arrDblOrignToTransform(2) + t(2) io_arrVecToTransform(3) = i_arrDblOrignToTransform(3) + t(3) io_arrVecToTransform(1) = io_arrVecToTransform(1) - i_arrDblOrignToTransform(1) io_arrVecToTransform(2) = io_arrVecToTransform(2) - i_arrDblOrignToTransform(2) io_arrVecToTransform(3) = io_arrVecToTransform(3) - i_arrDblOrignToTransform(3) Normieren io_arrVecToTransform dAngle = Winkel(io_arrVecToTransform, dBuffer, i_arrDblAxis) If (Abs(dAngle) - i_dWinkel) > EPSILON Then i_dWinkel = i_dWinkel - (i_dWinkel + dAngle) End If End Sub
Ich glaub es wäre einfacher die Funktion selbst zu bauen. Du hast ja auch nur einen Fall zu betrachten, das Programm war damals für weit mehr ausgelegt. Und so schwer isses nun auch nicht um ne Achse zu drehen. Edit1: Ich denk mal die Rotate() Funktion sollte Dir reichen, den Rest musst Du nur noch drumherum bauen. Edit2: Ich habe den anderen Käse mal rausgeschmissen, das bläht den Beitrag nur unnötig auf und passt sowieso nicht ganz zu dem Problem, da bei mir eine Rotation zu einem anderen System gemacht wurde und nicht der einfache Fall, nur ein Achsensystem zu drehen. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing [Diese Nachricht wurde von HoBLila am 23. Apr. 2014 editiert.] [Diese Nachricht wurde von HoBLila am 23. Apr. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
IAmTheFabian Mitglied Konstrukteur
Beiträge: 58 Registriert: 17.10.2013 CATIA V5 R19 Windows 7 Professionel Intel Core 2 Duo8GB RAM 64Bit System
|
erstellt am: 23. Apr. 2014 15:26 <-- editieren / zitieren --> Unities abgeben:
|
IAmTheFabian Mitglied Konstrukteur
Beiträge: 58 Registriert: 17.10.2013 CATIA V5 R19 Windows 7 Professionel Intel Core 2 Duo8GB RAM 64Bit System
|
erstellt am: 23. Apr. 2014 15:42 <-- editieren / zitieren --> Unities abgeben:
|
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 23. Apr. 2014 16:18 <-- editieren / zitieren --> Unities abgeben: Nur für IAmTheFabian
Ich behaupte, bin mir hier aber wirklich nicht sicher, dass Du immer alle 3 Achsen ausrechnen und dann deren Vektorkoordinaten setzen musst. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
IAmTheFabian Mitglied Konstrukteur
Beiträge: 58 Registriert: 17.10.2013 CATIA V5 R19 Windows 7 Professionel Intel Core 2 Duo8GB RAM 64Bit System
|
erstellt am: 19. Mai. 2014 11:15 <-- editieren / zitieren --> Unities abgeben:
Ja ich habe über Drehmatrizen die Koordinatenvektoren ausrechnen müssen. Würde auch mit Quaternionen funktionieren. Man muss nur die richtige Drehreihenfolge beachten. ------------------ Anfänger! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |