Girando um grupo de vetores

Eu estou tentando girar um grupo de vetores que eu amostrado para o normal de um triângulo

Se isso estivesse correto, o hemisfério amostrado aleatoriamente se alinharia com o triângulo.

Atualmente eu gero no eixo Z e estou tentando girar todas as amostras para a normal do triângulo.

mas parece ser “apenas desligado”

insira a descrição da imagem aqui

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; } 

Que eu tirei da parte inferior desta página: http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors

Então eu :

 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 

Construir matriz de transformação 4×4 em vez de Quaternions .

img

  1. Não se esqueça que o OpenGL tem matriz de colunas

    por isso, para double m[16];
    é o vetor do eixo X em m[ 0],m[ 1],m[ 2]
    é o vetor do eixo Y em m[ 4],m[ 5],m[ 6]
    é o vetor do eixo Z em m[ 8],m[ 9],m[10]
    e posição está em m[12],m[13],m[14]

    O LCS significa sistema de coordenadas local (seu triângulo ou object ou qualquer outro)
    e GCS significa sistema de coordenadas global (mundo ou qualquer outro).

    Todos os vetores X,Y,Z devem ser normalizados para os vetores unitários, caso contrário o escalonamento ocorrerá.

  2. construção

    1. defina o vetor de eixos Z para seu triângulo normal
    2. definir posição (origem do LCS ) para o ponto médio do seu triângulo (ou ponto médio formar seus vértices)
    3. agora você só precisa de axises X e Y que é fácil

      seja X = any triangle vertex - triangle midpoint
      ou X = substraction of any 2 vertexes of triangle

      A única condição que deve ser satisfeita para X é que ela deve estar no plano triangular.
      Agora, se Y = X x Z o produto cruzado criará um vetor perpendicular a X e Z (que também está no plano do triângulo).

    4. Agora coloque tudo isso dentro da matriz e carregue-o no OpenGL como matriz ModelView ou o que nunca.