旋转一组矢量

Joe*_*Joe 3 opengl math quaternions

我试图将我采样的一组矢量旋转到三角形的法线

如果这是正确的,随机抽样的半球将与三角形对齐.

目前我在Z轴上生成它并尝试将所有样本旋转到三角形的法线.

但它似乎"刚刚关闭"

在此输入图像描述

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;
}
Run Code Online (Sandbox Code Playgroud)

我从本页底部提取的内容: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
Run Code Online (Sandbox Code Playgroud)

Spe*_*tre 8

构造4x4变换矩阵而不是Quaternions.

IMG

  1. 不要忘记OpenGL具有列式矩阵

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

    LCS意味着局部坐标系(你的三角形或对象或其他)
    GCS意味着全球坐标系(世界或其他).

    X,Y,Z应将所有矢量标准化为单位矢量,否则将发生缩放.

  2. 施工

    1. Z-axis矢量设置为三角法线
    2. 将位置(LCS原点)设置为三角形的中点(或平均点形成其顶点)
    3. 现在你只需要XY轴很容易

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

      必须满足的唯一条件X是它必须位于三角形平面上.
      现在让Y = X x Z十字产品创建垂直于XZ(也位于三角形平面中)的向量.

    4. 现在将所有这些放在矩阵中并将其加载到OpenGL作为ModelView矩阵或者什么.