w GLScene mamy trzy parametry (RollAngle, PitchAngle i TurnAngle) dla obrotu wokół orientacji lokalnej. na obrazku poniżej, w jaki sposób mogę obrócić sześcian wokół orientacji globalnej (oś pomarańczowa)?Global Rotation
Odpowiedz
Może mógłbyś użyć obiektu "DummyCube" jako obiektu nadrzędnego. Następnie możesz obrócić najpierw kostkę wewnątrz kostki manekina, a następnie DummyCube.
Dzięki za Advanced. Tak, masz całkowitą rację. – Ata
Trzeba by przekształcić Kąt obrotu osi do kątów Eulera. Oto link wyjaśnienia tego procesu w niektórych szczegółach z kodem:
http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToEuler/index.htm
Z artykułu:
yaw = atan2(y * sin(angle)- x * z * (1 - cos(angle))
, 1 - (y2 + z2) * (1 - cos(angle)))
pitch = asin(x * y * (1 - cos(angle)) + z * sin(angle))
roll = atan2(x * sin(angle)-y * z * (1 - cos(angle))
, 1 - (x2 + z2) * (1 - cos(angle)))
EDIT: przemianowany na zmienne być zgodne z konwencją pitch, yaw, rolka nazewnictwa.
@ Mikola, sprawdziłem twoją sugerowaną stronę. Myślę, że poniższy kod to: 'heading = atan2 (y * sin (kąt) - x * z * (1 - cos (kąt)), 1 - (y2 + z2) * (1 - cos (kąt))) '--- ' attitude = asin (x * y * (1 - cos (kąt)) + z * sin (kąt)) '--- ' bank = atan2 (x * sin (kąt) -y * z * (1 - cos (kąt)), 1 - (x2 + z2) * (1 - cos (kąt))) " – Ata
Czy możesz wyjaśnić ten kod? – Ata
Witamy w 3d geometrii. –
To jest brudny cheat, ale jeśli obiekt jest na początku (0,0,0) i jest tylko jeden obiekt w scenie, można obrócić kamerę (i źródło światła) wokół obiektu, zamiast obracanie obiektu.
O ile mi wiadomo, powinniśmy użyć konwersji między orientacją lokalną a orientacją globalną. Tak masz rację. ale chcę wiedzieć, w jaki sposób mogę użyć algorytmu matematycznego, aby obrócić obiekt wokół orientacji globalnej. Myślę, że powinienem użyć kątów Eulera. ale jak ... – Ata
Z tym zrzutem ekranu nie pozostawia mi innego wyboru, jak tylko odpowiedzieć na pytanie :) –
'@Wouter van Nifterick' przepraszam, nie rozumiem cię, co masz na myśli? – Ata
Co to jest GLScene? Normalnie powiedziałbym po prostu glRotatef (angle, rot_axis.x, rot_axis.y, rot_axis.z), lub jakąś równoważną transformację. – datenwolf