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

Rotation and Translation about arbitrary point

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

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

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

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

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

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

  2. objX = GLES20Renderer._uBodyCentreMatrix[0];

  3. objY = GLES20Renderer._uBodyCentreMatrix[1];

Нежелательный перенос вдоль +Y сохраняется даже при следующих изменениях:

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

  2. zAngle = 0;

  3. 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

Мне нужна помощь, чтобы понять, почему происходит этот нежелательный перевод, что именно не так с преобразованиями или это неправильный алгоритм.

Может ли блокировка карданного подвеса быть здесь проблемой?

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

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

.

[API 10 ->15]

Фактический класс Renderer имеет два объекта :башня танка (сопло )и корпус танка , в то время как башня (сопло )имеет нежелательное перемещение вперед, корпус имеет нежелательное перемещение назад

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

19
задан GLES 17 August 2012 в 18:35
поделиться