为了账号安全,请及时绑定邮箱和手机立即绑定

旋转一组向量

旋转一组向量

森栏 2019-09-27 15:39:06
我正在尝试将一组采样的矢量旋转到三角形的法线如果正确,则随机采样的半球将与三角形对齐。目前,我在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;}我是从此页面底部提取的: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 axisglm::vec3 n1 = glm::normalize( glm::cross((p2 - p1), (p3 - p1)) ); //normalglm::quat myQuat = glm::normalize(getQuat(zaxis, n1));glm::mat4 rotmat = glm::toMat4(myQuat); //make a rotation matrixglm::vec4 n3 = rotmat * glm::vec4(n2,1); // current vector I am trying to rotate
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

构造4x4变换矩阵而不是四元数

//img1.sycdn.imooc.com//5d8dbcc80001342305850199.jpg

  1. 不要忘记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矢量都应归一化为单位矢量,否则会发生缩放。

  2. 施工

    1. Z轴矢量设置为三角形法线

    2. 将位置(LCS原点)设置为三角形的中点(或其顶点的平均点)

    3. 现在你只需要XY轴系这是很容易

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

      必须满足的唯一条件X是它必须位于三角形平面上。 
      现在Y = X x Z,叉积将创建垂直于X和的矢量Z(其也位于三角形平面中)。

    4. 现在,将所有这些内容放入矩阵中,并将其作为矩阵或任何形式加载到OpenGLModelView


查看完整回答
反对 回复 2019-09-27
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-09-27
?
MYYA

TA贡献1868条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-09-27
  • 3 回答
  • 0 关注
  • 868 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信