vectores una transformacion rotar rotacion para matriz imagen grafica ejes desplazar demostracion cubo como algoritmo opengl math quaternions

opengl - una - Girar un grupo de vectores



rotacion de vectores (1)

Construya matriz de transformación 4x4 en lugar de Quaternions .

  1. No olvide que OpenGL tiene una matriz de columnas sabias

    entonces para el double m[16];
    es el vector del eje X en m[ 0],m[ 1],m[ 2]
    es el vector del eje Y en m[ 4],m[ 5],m[ 6]
    es el vector del eje Z en m[ 8],m[ 9],m[10]
    y la posición está en m[12],m[13],m[14]

    LCS significa sistema de coordenadas local (su triángulo u objeto o lo que sea)
    y GCS significa sistema de coordenadas global (mundo o lo que sea).

    Todos los vectores X,Y,Z deben normalizar a los vectores unitarios, de lo contrario se producirá una escala.

  2. construcción

    1. establece el vector del eje Z en tu triángulo normal
    2. posición establecida (origen LCS ) en el punto medio de su triángulo (o punto medio desde sus vértices)
    3. ahora solo necesitas ejes X e Y lo cual es fácil

      deje X = any triangle vertex - triangle midpoint
      o X = substraction of any 2 vertexes of triangle

      La única condición que se debe cumplir para X es que debe estar en el plano triangular.
      Ahora, deje que Y = X x Z el producto cruzado creará un vector perpendicular a X y Z (que también se encuentra en el plano del triángulo).

    4. Ahora coloque todo esto dentro de la matriz y cárguelo en OpenGL como matriz ModelView o lo que sea.

Estoy tratando de rotar un grupo de vectores que muestre a la normalidad de un triángulo

Si esto fuera correcto, el hemisferio muestreado al azar se alinearía con el triángulo.

Actualmente lo genero en el eje Z y estoy tratando de rotar todas las muestras a la normalidad del triángulo.

pero parece estar "justo fuera"

glm::quat getQuat(glm::vec3 v1, glm::vec3 v2) { glm::quat myQuat; float dot = glm::dot(v1, v2); if (dot != 1) { glm::vec3 aa = glm::normalize(glm::cross(v1, v2)); float w = sqrt(glm::length(v1)*glm::length(v1) * glm::length(v2)*glm::length(v2)) + dot; myQuat.x = aa.x; myQuat.y = aa.y; myQuat.z = aa.z; myQuat.w = w; } return myQuat; }

Lo saqué de la parte inferior de esta página: http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors

Entonces yo :

glm::vec3 zaxis = glm::normalize( glm::vec3(0, 0, 1) ); // hardcoded but test orginal axis glm::vec3 n1 = glm::normalize( glm::cross((p2 - p1), (p3 - p1)) ); //normal glm::quat myQuat = glm::normalize(getQuat(zaxis, n1)); glm::mat4 rotmat = glm::toMat4(myQuat); //make a rotation matrix glm::vec4 n3 = rotmat * glm::vec4(n2,1); // current vector I am trying to rotate