Соответствующее умножение матриц для вращения / перевода

Rotation and Translation about arbitrary point

Чтобы вращать / перемещать объект (вращение только вокруг оси z и перемещение только в плоскости xy) не только по отношению к глобальному центру (центру устройства), но и по отношению к другим произвольным точкам, я создал алгоритм, который является правильным (потому что все старшие кодеры, с которыми я обсуждал, считают это правильным),but это займет много времени, чтобы удалитьundesired translation в реализации (алгоритм был создан 4 августа и был реализован в тот же день, с тех пор код был пересмотрен 15 раз).

Вот реализацияhttp://www.pixdip.com/opengles/transform.php#ALGO1

Строки кода, которые производят нежелательный перевод, находятся внутри:

private static void updateModel(int upDown, float xAngle, float yAngle, float zAngle) {

и перечислены ниже:

Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);

objX = GLES20Renderer._uBodyCentreMatrix[0];

objY = GLES20Renderer._uBodyCentreMatrix[1];

The undesired translation along +Y persists even if the following changes are made:

objY = _uBodyCentreMatrix[1] - _uBodyCentre[1];

zAngle = 0;

ds = 0;

Значение-0.545867f добавляется к координате Y при каждом вызовеonDrawFrame()из-за этих полей класса Renderer:

private static final float[] _uBodyCentre = new float[]{-0.019683f, -0.545867f, -0.000409f, 1.0f};

protected static float[] _uBodyCentreMatrix = new float[4];

вhttp://www.pixdip.com/opengles/transform.php#FIELDS

I need help to understand why does that undesired translation happen, what is exactly wrong with the transformations, or is it the algorithm that is wrong.

Can Gimbal lock be an issue here ?

Пожалуйста, не просите меня выполнять / практиковать более простые примеры, потому что я подготовил класс Renderer для ротации / перевода о глобальной оси Z, и в этой новой задаче, в которой я работаю, используется тот же класс с небольшими изменениями вupdateModel()

(Обратите внимание, что желаемое вращение происходит только вокруг оси z, а перемещение только в плоскости xy)

[API 10-> 15]

The actual Renderer class has two objects: tank turret(nozzle) and tank bodyв то время как турель (сопло) имеет нежелательный прямой перевод, тело имеет нежелательный обратный перевод

Apk для перевода / поворота по центру устройства (что легко сделать в opengles 2.0): http://www.pixdip.com/opengles/global.php

Apk для перевода / вращения вокруг произвольных точек (который имеет нежелательный перевод по + Y): http://www.pixdip.com/opengles/local.php

Apk для перевода / вращения относительно произвольных точек, в которых updateModel () вызывается только 4 раза: http://www.pixdip.com/opengles/limited.php и требуемый код (которого должно быть достаточно) находится здесь:http://www.pixdip.com/opengles/code.php

Части объекта (насадка / турель, тело) в настоящее время вращаются вокруг своих собственных центров, а не центра объекта (то есть _playerCentre), я изменю это позже.

Я пытался продемонстрировать логикуhttp://www.pixdip.com/opengles/images.php

Ответы на вопрос(4)

Ваш ответ на вопрос