Чтобы вращать/перемещать объект (вращение только вокруг оси z -и перемещение только в плоскости xy )не только относительно глобального центра (центра устройства ), но и относительно других произвольных точек, я создал алгоритм, который является правильным (, потому что все старшие программисты, с которыми я обсуждал, считают его правильным ), , но требуется много времени, чтобы удалить нежелательный перевод в алгоритм реализации (был создан 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];
Нежелательный перенос вдоль +Y сохраняется даже при следующих изменениях:
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
Мне нужна помощь, чтобы понять, почему происходит этот нежелательный перевод, что именно не так с преобразованиями или это неправильный алгоритм.
Может ли блокировка карданного подвеса быть здесь проблемой?
Пожалуйста, не просите меня выполнять/упражняться в более простых примерах, потому что я подготовил класс 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