opengl - una - Girar un grupo de vectores
rotacion de vectores (1)
Construya matriz de transformación 4x4 en lugar de Quaternions .
No olvide que OpenGL tiene una matriz de columnas sabias
entonces para el
double m[16];
es el vector del ejeX
enm[ 0],m[ 1],m[ 2]
es el vector del ejeY
enm[ 4],m[ 5],m[ 6]
es el vector del ejeZ
enm[ 8],m[ 9],m[10]
y la posición está enm[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.construcción
- establece el vector del eje
Z
en tu triángulo normal - posición establecida (origen LCS ) en el punto medio de su triángulo (o punto medio desde sus vértices)
ahora solo necesitas ejes
X
eY
lo cual es fácildeje
X = any triangle vertex - triangle midpoint
oX = 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 queY = X x Z
el producto cruzado creará un vector perpendicular aX
yZ
(que también se encuentra en el plano del triángulo).Ahora coloque todo esto dentro de la matriz y cárguelo en OpenGL como matriz
ModelView
o lo que sea.
- establece el vector del eje
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