旋转一组向量

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


如果正确,则随机采样的半球将与三角形对齐。


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


但似乎“刚好”

http://img3.mukewang.com/5d8dbcb30001456706680525.jpg

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


森栏
浏览 873回答 3
3回答

元芳怎么了

构造4x4变换矩阵而不是四元数。不要忘记OpenGL具有列明智矩阵所以对于double m[16]; 是X轴向量in m[ 0],m[ 1],m[ 2] 是Y轴向量in m[ 4],m[ 5],m[ 6] 是Z轴向量in m[ 8],m[ 9],m[10] 和位置in m[12],m[13],m[14]该LCS意味着局部坐标系(你的三角形或对象或其他)和GCS意味着全球坐标系(世界或其他)。所有X,Y,Z矢量都应归一化为单位矢量,否则会发生缩放。施工将Z轴矢量设置为三角形法线将位置(LCS原点)设置为三角形的中点(或其顶点的平均点)现在你只需要X和Y轴系这是很容易让X = any triangle vertex - triangle midpoint 或X = substraction of any 2 vertexes of triangle必须满足的唯一条件X是它必须位于三角形平面上。 现在Y = X x Z,叉积将创建垂直于X和的矢量Z(其也位于三角形平面中)。现在,将所有这些内容放入矩阵中,并将其作为矩阵或任何形式加载到OpenGLModelView。

米琪卡哇伊

不知道万向节锁定的含义(我的词典只知道万向节头),但是如果您想将点对准/锁定到三角形(而不仅仅是其平面),则将原点(x0,y0,z0)和一个在每帧或每次迭代中,以相同的方式(相对于三角形)进行轴旋转。因此,例如,如果原点是三角形(中点(P0+P1+P2)/3)的平均顶点,并且X(或Y)轴指向相同的三角形顶点,(P0-((P0+P1+P2)/3))那么您的半球所处的三角形位置/方向将始终以相同的方式对齐(即使三角形改变了)形状)

MYYA

万向节锁定是一系列旋转(即next_transform = rotate_func(current_transform))的一部分,失去了自由度。您要在此处执行的操作并不是从数量上随时间变化的意义上进行轮换。它只是根据输入在每一帧生成一个新的变换。
打开App,查看更多内容
随时随地看视频慕课网APP