旋转一组vector

我正在试图将我采样的一组向量旋转到三angular形的法线上

如果这是正确的,随机抽样的半球将与三angular形alignment。

目前我在Z轴上生成它,并试图将所有样本旋转到三angular形的法线。

但它似乎是“刚刚closures”

在这里输入图像描述

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

我从这个页面底部拉出来的: http : //lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors

然后我 :

 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 

构造4×4变换matrix而不是四元数

IMG

  1. 不要忘记,OpenGL具有列明智matrix

    所以对于double m[16];
    m[ 0],m[ 1],m[ 2] X轴向量,
    m[ 4],m[ 5],m[ 6] Y轴向量,
    m[ 8],m[ 9],m[10] Z轴向量,
    位置在m[12],m[13],m[14]

    LCS意味着局部坐标系(你的三angular形或物体或其他)
    GCS是指全球坐标系(世界或其他)。

    所有的X,Y,Z向量应归一化为单位向量,否则会出现缩放。

  2. 施工

    1. Z轴vector设置为你的三angular形法线
    2. 设置位置( LCS原点)到三angular形的中点(或平均点形成其顶点)
    3. 现在你只需要XY X ,这很容易

      X = any triangle vertex - triangle midpoint
      或者X = substraction of any 2 vertexes of triangle

      X必须满足的唯一条件是它必须位于三angular形平面上。
      现在令Y = X x Z ,叉积将创build垂直于XZvector(也存在于三angular形平面中)。

    4. 现在把所有这些内部matrix,并加载到OpenGL作为ModelViewmatrix或什么。