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

questionAnswers(4)

yourAnswerToTheQuestion