Multiplicación apropiada de matrices para rotación / traslación.

Con el fin de rotar / trasladar el objeto (rotación solo sobre el eje zy la traducción solo en el plano xy), no solo se colocó en el centro global (centro del dispositivo) sino también en otros puntos arbitrarios, creé un algoritmo, que es correcto (porque todos Los codificadores con los que he hablado lo consideran correcto),pero está tomando mucho tiempo para eliminar unatraducción no deseada en la implementación (el algoritmo se creó el 4 de agosto y se implementó el mismo día, ya que el código ha sido revisado 15 veces).

Aquí está la implementación.http://www.pixdip.com/opengles/transform.php#ALGO1

Las líneas de código que están produciendo una traducción no deseada están dentro:

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

y se enumeran a continuación:

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

objX = GLES20Renderer._uBodyCentreMatrix[0];

objY = GLES20Renderer._uBodyCentreMatrix[1];

La traducción no deseada en + Y persiste incluso si se realizan los siguientes cambios:

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

zAngle = 0;

ds = 0;

El valor-0.545867f se agrega a la coordenada Y en cada llamada aonDrawFrame(), debido a estos campos de la clase Renderer:

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

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

enhttp://www.pixdip.com/opengles/transform.php#FIELDS

Necesito ayuda para comprender por qué se produce esa traducción no deseada, qué es exactamente incorrecto con las transformaciones o si es el algoritmo el que está equivocado.

¿Puede Gimbal bloquear ser un problema aquí?

Por favor, no me pida que realice / practique ejemplos más simples, porque he preparado la clase de Renderer para rotación / traducción sobre el eje z global, y esta nueva tarea en la que estoy, utiliza la misma clase con una ligera modificación enupdateModel()

(Tenga en cuenta que la rotación deseada es solo sobre el eje z y la traducción solo en el plano xy)

[API 10-> 15]

La clase de Renderer real tiene dos objetos: torreta del tanque (boquilla) y cuerpo del tanque, mientras que la torreta (boquilla) tiene una traducción hacia adelante no deseada, el cuerpo tiene una traducción hacia atrás no deseada

Apk para traducción / rotación sobre el centro del dispositivo (que es fácil de hacer en opengles 2.0):http://www.pixdip.com/opengles/global.php

Apk para la traducción / rotación sobre puntos arbitrarios (que tiene una traducción no deseada a lo largo de + Y):http://www.pixdip.com/opengles/local.php

Apk para la traducción / rotación sobre puntos arbitrarios en los que se llama a updateModel () solo 4 veces:http://www.pixdip.com/opengles/limited.php y el código requerido (que debería ser suficiente) está aquí:http://www.pixdip.com/opengles/code.php

Las partes del objeto (boquilla / torreta, cuerpo) actualmente giran alrededor de sus propios centros, no del centro del objeto (que es _playerCentre), lo modificaré más adelante.

He tratado de demostrar la lógicahttp://www.pixdip.com/opengles/images.php

Respuestas a la pregunta(4)

Su respuesta a la pregunta