2012-08-15 66 views
19

Rotation and Translation about arbitrary pointmultiplicación apropiado de matrices de rotación/traslación

Con el fin de rotación/traslación objeto (sólo rotación sobre el eje z y la traducción solamente en el plano xy) no sólo WRT a centro global (centro de dispositivo), sino también wrt otros puntos arbitrarios, creé un algoritmo, que es correcto (porque todos los codificadores senior que he discutido lo consideran correcto), pero está tomando mucho tiempo eliminar una traducción no deseada en la implementación (se creó el algoritmo el 4 de agosto y se implementó el mismo día, desde entonces el código ha sido revisado 15 veces).

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

Las líneas de código que están produciendo traducción no deseado están en el interior:

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

y se enumeran a continuación:

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

  2. objX = GLES20Renderer._uBodyCentreMatrix[0];

  3. objY = GLES20Renderer._uBodyCentreMatrix[1];

La traducción no deseada a lo largo de + Y persiste incluso si se realizan los siguientes cambios:

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

  2. zAngle = 0;

  3. ds = 0;

El valor -0.545867f se añade a la coordenada Y en cada llamada a onDrawFrame(), debido a estos campos de la clase de procesador:

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

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

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

que necesitan ayuda para entender por qué ocurre esto traducción no deseada, lo que es exactamente malo con las transformaciones, o es el algoritmo que es erróneo.

Can Gimbal lock ser un problema aquí?

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

(tenga en cuenta que la rotación deseada es sólo alrededor del eje Z y la traducción solamente en el plano xy)

[API 10-> 15]

la clase de procesador real tiene dos objetos: torreta del tanque (boquilla) y cuerpo del tanque, mientras torreta (boquilla) ha indeseados hacia adelante traducción, el cuerpo tiene indeseados traducción hacia atrás

Apk una traducción/rotación alrededor del 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 alrededor de puntos arbitrarios (que ha indeseados traslación a lo largo + y): http://www.pixdip.com/opengles/local.php

Apk una traducción/rotación alrededor de puntos arbitrarios en el que UpdateModel() se llama 4 veces solamente: http://www.pixdip.com/opengles/limited.php y código necesario (w que debería ser suficiente) está aquí: http://www.pixdip.com/opengles/code.php

Partes del objeto (boquilla/torreta, cuerpo) giran actualmente sobre sus propios centros, no el centro del objeto (que es _playerCentre), lo modificaré más adelante.

he tratado de demostrar la lógica http://www.pixdip.com/opengles/images.php

+0

yo no lo entiendo, ¿por qué tienes traducción no deseada? ¿Tu algoritmo los está produciendo? ¿De dónde están viniendo? Sugeriría que elimines la traducción no deseada antes de que surjan. – RaphMclee

+0

Las líneas de código que producen traducción no deseada no se pueden eliminar porque son parte del algoritmo, no tengo otra opción. El algoritmo es correcto o no, todavía no estoy seguro, y la implementación está produciendo una traducción automática, no sé cómo eliminarlo, porque tengo un solo algoritmo y no puedo usar uno alternativo, pruebe el API para entender es más claro – GLES

+0

Veo que ha puesto mucho esfuerzo en esta cuestión, pero debo decir que realmente no puedo entender de lo que está hablando. No puedo entender lo que está tratando de decir en su página 'images.php', y descargué su aplicación' local.php' pero parece que no hace nada. Solo veo dos botones y un cuadrado morado, y no sucede nada cuando toco los botones. Usted sigue mencionando una traducción no deseada, pero no está claro en ninguna parte exactamente qué es o qué es lo que no desea. ¿Puedes tratar de vincular una sola imagen y marcar claramente con un círculo y anotar cuál es el problema? – Tim

Respuesta

4

[Solucionado] java errores de punto flotante eran la única causa

M = T * I ​​* T [inv]

no dio como resultado en una matriz de identidad, así que en vez de utilizar Matrix.MultiplyMM

escribo todas las multiplicaciones entre las matrices

4

Se puede usar un método como este:

public void rotateToAbritrary(float[] arbitraryPoint, float xAngle, float yAngle, float zAngle) { 
    Matrix.translateM(modelMatrix, 0, arbitraryPoint[0], arbitraryPoint[1], arbitraryPoint[2]); 
    float max = Math.max(xAngle, Math.max(yAngle, zAngle)); 
    if(max != 0.0f) Matrix.rotateM(modelMatrix, 0, max, xAngle/max, yAngle/max, zAngle/max); 
    Matrix.translateM(modelMatrix, 0, -arbitraryPoint[0], -arbitraryPoint[1], -arbitraryPoint[2]); 
} 

Así es como lo veo yo, al menos, os dejo con la aplicación. Supongo que su código no sufre el bloqueo de Gimbal.

5

Parece que el problema es:

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

Matrix.multiplyMV es un método para multiplicar un vector de 4 elemento por una matriz 4x4 y almacenar el resultado en un vector columna 4 elemento. En notación de matriz: result = lhs x rhs. Los valores del elemento resultVector no están definidos si los elementos resultVector se superponen a los elementos lhsMatrix o rhsVector.

No creo que hayas publicado todo el código, así que no puedo asegurarlo, pero a juzgar por tu nombre de '_uBodyCentreMatrix' probablemente estés encontrando un error porque no es un vector de columna de 4 elementos.

Supongo que '_ModelMatrixBody' es una matriz 4x4 y '_uBodyCentre' es un vector de 4 elementos, de lo contrario, esto podría ser problemático.

+0

Hola Joseph, ¿puedes decirme cómo aplicar la traducción y la rotación a GLSurfaceview en OpenGL ES2.0 en Android. – harikrishnan

Cuestiones relacionadas