Odpowiednie mnożenie macierzy dla rotacji / translacji
Aby obrócić / przetłumaczyć obiekt (obrót tylko wokół osi Z i translację tylko w płaszczyźnie xy) nie tylko wrd do centrum globalnego (centrum urządzenia), ale także wykreślić inne dowolne punkty, stworzyłem algorytm, który jest poprawny (ponieważ wszyscy starsi koderów, o których dyskutowałem, uważam za poprawne),ale zajmuje dużo czasu, aby usunąćniepożądane tłumaczenie w implementacji (algorytm został stworzony 4 sierpnia i został wdrożony tego samego dnia, od tego czasu kod został poprawiony 15 razy).
Oto implementacjahttp://www.pixdip.com/opengles/transform.php#ALGO1
Linie kodu, które powodują niepożądane tłumaczenie, znajdują się wewnątrz:
private static void updateModel(int upDown, float xAngle, float yAngle, float zAngle) {
i są wymienione poniżej:
Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);
objX = GLES20Renderer._uBodyCentreMatrix[0];
objY = GLES20Renderer._uBodyCentreMatrix[1];
Niepożądane tłumaczenie wzdłuż + Y utrzymuje się, nawet jeśli wprowadzono następujące zmiany:
objY = _uBodyCentreMatrix[1] - _uBodyCentre[1];
zAngle = 0;
ds = 0;
Wartość-0.545867f
jest dodawany do współrzędnej Y przy każdym wywołaniuonDrawFrame()
, z powodu tych pól klasy Renderer:
private static final float[] _uBodyCentre = new float[]{-0.019683f, -0.545867f, -0.000409f, 1.0f};
protected static float[] _uBodyCentreMatrix = new float[4];
whttp://www.pixdip.com/opengles/transform.php#FIELDS
Potrzebuję pomocy, aby zrozumieć, dlaczego to niepożądane tłumaczenie się dzieje, co jest nie tak z transformacjami, czy jest to algorytm, który jest błędny.
Czy blokada Gimbal może być problemem?
Proszę nie prosić mnie o wykonywanie / ćwiczenie prostszych przykładów, ponieważ przygotowałem klasę Renderer dla rotacji / tłumaczenia o globalnej osi Z, a to nowe zadanie, w które się wpakowałem, używa tej samej klasy z niewielką modyfikacją wupdateModel()
(Należy pamiętać, że pożądany obrót dotyczy tylko osi Z i tłumaczenia tylko w płaszczyźnie xy)
[API 10-> 15]
Rzeczywista klasa Renderer ma dwa obiekty: wieżyczkę zbiornika (dysza) i korpus zbiornika, podczas gdy wieżyczka (dysza) ma niepożądane przesunięcie do przodu, ciało ma niepożądane tłumaczenie wstecz
Apk do tłumaczenia / rotacji wokół centrum urządzenia (co jest łatwe do wykonania w opengles 2.0):http://www.pixdip.com/opengles/global.php
Apk za tłumaczenie / obrót o dowolne punkty (które ma niepożądane tłumaczenie wzdłuż + Y):http://www.pixdip.com/opengles/local.php
Apk za tłumaczenie / obrót o dowolne punkty, w których updateModel () jest nazywany tylko 4 razy:http://www.pixdip.com/opengles/limited.php i wymagany kod (który powinien być wystarczający) jest tutaj:http://www.pixdip.com/opengles/code.php
Części obiektu (dysza / wieżyczka, ciało) obracają się obecnie wokół własnych centrów, a nie centrum obiektu (którym jest _playerCentre), zmodyfikuję to później.
Próbowałem zademonstrować logikęhttp://www.pixdip.com/opengles/images.php