Zaczynam na Molehill i mam wiele problemów z uchwyceniem Matrix3D. Mój pierwszy problem polega na zarządzaniu Matrix3D, który opisuje orientację jednego modelu.Jak połączyć rotacje X, Y i Z w lokalnej przestrzeni modelu (nie globalnej)?
Do tego celu używam Matrix3D.appendRotation(). Ale w zależności od kolejności, do której dołączam, otrzymuję inny wynik (oczywiście, ponieważ obracam się jeden po drugim w przestrzeni globalnej). Wiem, że jest to częsty problem, do którego doszłam z 3d modelowaniem oprogramowania. Ale tym razem muszę to programować. Tutaj potrzebuję pomocy.
Po pierwsze, w przypadku jakichkolwiek niejasności, tu jest problem na zdjęciach:
Krok 1: I renderowania modelu.
Etap 2a: obrócić ją na osi x. Wygląda poprawnie!
Etap 2b: obrócić ją na osi. Wygląda poprawnie!
Więc ... jeśli obracają się na osi X i Z w modelu Chcę to:
Ale sadface, otrzymuję to:
Mogę Zobacz problem. Załączam rotacje pojedynczo w przestrzeni globalnej. Muszę obracać się w lokalnej przestrzeni obiektu. Nie mam pojęcia, jak to zrobić lub czego powinienem szukać (terminologia itp.). Kod jest prosty (i źle):
modelLocalMatrix.identity();
modelLocalMatrix.appendRotation(modelZRot, Vector3D.Z_AXIS);
modelLocalMatrix.appendRotation(modelXRot, Vector3D.X_AXIS);
//eventually y-axis rotation as well...
renderMatrix.append(modelLocalMatrix);
ja domyślam się, że zamiast używać stałych osi Vector3D, chcę użyć trochę znormalizowany wektor a niektóre ... uh, rzecz ... zamiast modelZRot , modelXRot i ostatecznie modelYRot. Czy ktoś może mi powiedzieć, jakie jest najlepsze rozwiązanie do zastosowania powyższego rodzaju rotacji?
AKTUALIZACJA: Po spędzeniu dnia na "książkach" (aka KhanAcademy na YouTube) i rozpoczęciu tej prezentacji: The Mathematics of the 3d Rotation Matrix Natknąłem się na rodzaj metody "spojrzenia", która jest bardzo zbliżona do mojego pożądanego rozwiązania. Niestety, tylko 50% to rozumiem. Wciąż mam nadzieję, że ktoś może rzucić trochę światła na ten temat!
var angleOfRotation:Number = Math.PI/2; //90 degrees...
var axisOfRotation:Vector3D = new Vector3D(0, 1, 0); //some point to look at...
//normalize the vector!
axisOfRotation.normalize();
var x:Number = axisOfRotation.x;
var y:Number = axisOfRotation.y;
var z:Number = axisOfRotation.z;
var c:Number = Math.cos(angleOfRotation);
var s:Number = Math.sin(angleOfRotation);
var t:Number = 1 - c;
//Graphics Gems (Glassner, Academic Press, 1990).
modelLocalMatrix = new Matrix3D(new <Number>[
t * (x * x) + c, t * x * y - s * z, t * x * z + s * y, 0,
t * x * y + s * z, t * (y * y) + c, t * y * z - s * x, 0,
t * x * z - s * y, t * y * z + s * x, t * (z * z) + c, 0,
0, 0, 0, 1
]);
Chodzi o to, wydaje się raczej niezgrabne. Zwłaszcza, że kąt obrotu dla Vector3D powinien być czwartą (w) wartością. Co ważniejsze, Matrix3D wydaje się już mieć metodę lookAt(). Nie rozumiem jeszcze ... proszę, niech ktoś mnie uratuje od wielu godzin prób i błędów!