Pregunta

He estado jugando con algunos algoritmos en Internet por un tiempo y parece que no puedo hacer que funcionen, así que estoy lanzando la pregunta aquí;

Estoy intentando representar una línea vectorial de velocidad desde un punto. Dibujar la línea no es difícil: simplemente inserte una línea con longitud velocity.length en el gráfico. Esto coloca la línea centrada en el punto en la dirección del eje y. Necesitamos obtener esto ahora en la rotación y traducción adecuadas.

El vector traslacional no es difícil de calcular: es la mitad del vector de velocidad. La matriz rotacional, sin embargo, me resulta extremadamente difícil de alcanzar. Dado un vector direccional <x, y, z>, ¿cuál es la matriz que necesito?

Editar 1: Mira; Si no comprende la pregunta, probablemente no podrá darme una respuesta.

Esto es lo que tengo actualmente:

                    Vector3f translation = new Vector3f();
                    translation.scale(1f/2f, body.velocity);

                    Vector3f vec_z = (Vector3f) body.velocity.clone();
                    vec_z.normalize();

                    Vector3f vec_y; // reference vector, will correct later
                    if (vec_z.x == 0 && vec_z.z == 0) {
                        vec_y = new Vector3f(-vec_z.y, 0f, 0f); // could be optimized
                    } else {
                        vec_y = new Vector3f(0f, 1f, 0f);
                    }
                    Vector3f vec_x = new Vector3f();
                    vec_x.cross(vec_y, vec_z);
                    vec_z.normalize();

                    vec_y.cross(vec_x, vec_z);
                    vec_y.normalize();
                    vec_y.negate();

                    Matrix3f rotation = new Matrix3f(
                        vec_z.z, vec_z.x, vec_z.y,
                        vec_x.z, vec_x.x, vec_x.y,
                        vec_y.z, vec_y.x, vec_y.y
                    );

                    arrowTransform3D.set(rotation, translation, 1f);

basado en este artículo . Y sí, probé la matriz de rotación estándar (vec_x.x, vec_y.x, etc.) y no funcionó. He estado girando las columnas y filas para ver si hay algún efecto.

Editar 2:

Disculpas por la grosera redacción de mis comentarios.

Entonces parece que hubo una combinación de dos errores; uno de los cuales señaló House MD (muy mal nombre de las variables: vec_z en realidad era vec_y, y así sucesivamente), y el otro era que necesitaba invertir la matriz antes de pasarla al motor de renderizado (la transposición era ¡cerca!). Entonces el código modificado es:

                    Vector3f vec_y = (Vector3f) body.velocity.clone();
                    vec_y.normalize();

                    Vector3f vec_x; // reference vector, will correct later
                    if (vec_y.x == 0 && vec_y.z == 0) {
                        vec_x = new Vector3f(-vec_y.y, 0f, 0f); // could be optimized
                    } else {
                        vec_x = new Vector3f(0f, 1f, 0f);
                    }

                    Vector3f vec_z = new Vector3f();
                    vec_z.cross(vec_x, vec_y);
                    vec_z.normalize();

                    vec_x.cross(vec_z, vec_y);
                    vec_x.normalize();
                    vec_x.negate();

                    Matrix3f rotation = new Matrix3f(
                        vec_x.x, vec_x.y, vec_x.z,
                        vec_y.x, vec_y.y, vec_y.z,
                        vec_z.x, vec_z.y, vec_z.z
                    );
                    rotation.invert();
¿Fue útil?

Solución

Dupe.

  

La pregunta allí implica llevar una rotación a un determinado eje, mientras que me preocupa obtener una matriz de rotación.

Gee, me pregunto si podrías convertir convierte uno a el otro ?

Por cierto, su solución actual de elegir un eje y arbitrario y luego reortogonalizar debería funcionar bien; Sin embargo, parece tener errores, o al menos está mal escrito. 'z_vec' no es un buen nombre de variable para el eje y. ¿Qué pasa con el pedido 'z, x, y', de todos modos?

Si todavía no funciona, intente hacer cambios aleatorios hasta que lo haga: transponga la matriz, niegue los vectores hasta que tenga un número par de errores de signos, ese tipo de cosas.

Además, su tono de voz se muestra como algo grosero, dado que le está pidiendo a extraños que pasen su tiempo ayudándole.

Otros consejos

Esto debería hacerlo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top