欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    绕任意轴旋转.doc

    • 资源ID:24064474       资源大小:302.50KB        全文页数:9页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    绕任意轴旋转.doc

    【精品文档】如有侵权,请联系网站删除,仅供学习与交流绕任意轴旋转.精品文档.几何变换详解在三维图形学中,几何变换大致分为三种,平移变换(Translation),缩放变换(Scaling),旋转变换(Rotation)。以下讨论皆针对DirectX,所以使用左手坐标系。平移变换将三维空间中的一个点x, y, z, 1移动到另外一个点x', y', z', 1,三个坐标轴的移动分量分别为dx=Tx, dy=Ty, dz=Tz, 即x' = x + Txy' = y + Tyz' = z + Tz平移变换的矩阵如下。缩放变换将模型放大或者缩小,本质也是对模型上每个顶点进行放大和缩小(顶点坐标值变大或变小),假设变换前的点是x, y, z, 1,变换后的点是x', y', z', 1,那么x' = x * Sxy' = y * Syz' = z * Sz缩放变换的矩阵如下。旋转变换这是三种变换中最复杂的变换,这里只讨论最简单的情况,绕坐标轴旋转,关于绕任意轴旋转,在后续的随笔中介绍。绕X轴旋转绕X轴旋转时,顶点的x坐标不发生变化,y坐标和z坐标绕X轴旋转度,旋转的正方向为顺时针方向(沿着旋转轴负方向向原点看)。x, y, z, 1表示变换前的点,x', y', z', 1表示变换后的点。变换矩阵如下。关于旋转的正方向,OpenGL与多数图形学书籍规定旋转正方向为逆时针方向(沿着坐标轴负方向向原点看),比如Computer Graphics C Version,p409。绕Y轴旋转绕Y轴旋转时,顶点的y坐标不发生变化,x坐标和z坐标绕Y轴旋转度。x, y, z, 1表示变换前的点,x', y', z', 1表示变换后的点。变换矩阵如下。绕Z轴旋转绕Z轴旋转时,顶点的z坐标不发生变化,x坐标和y坐标绕Z轴旋转度。x, y, z, 1表示变换前的点,x', y', z', 1表示变换后的点。变换矩阵如下。绕坐标轴旋转的矩阵推导上面三个旋转矩阵是如何得来的呢?我们推导一下,首先看一下二维的情况,再扩展到三维即可。实际上上面三种绕坐标轴旋转的情况属于特殊的二维旋转,比如绕Z轴旋转,相当于在与XOY平面上绕原点做二维旋转。假设点P(x, y)是平面直角坐标系内一点,其到原点的距离为r,其与X轴的夹角为A,现将点P绕原点旋转度,得到点P'(x', y'),P'与X轴的夹角为B,则A = B - 。(注意,在二维坐标中,逆时针旋转时角度为正,顺时针旋转时角度为负,下图中由P旋转到P',角度为,若是由P'转到P,则角度为-)。于是可得下面的转换方程(式一)写成矩阵的形式就是求得旋转矩阵为由于这里使用齐次坐标,所以还需加上一维,最终变成如下形式绕Z轴旋转矩阵和前面给出的绕Z轴旋转矩阵完全吻合。对于绕X轴旋转的情况,我们只需将式一中的x用y替换,y用z替换,z用x替换即可。替换后得到(式二)对应的旋转矩阵为绕X轴旋转矩阵对于绕Y轴旋转的情况,只需对式二做一次同样的替换即可,的到的变换方程为对应的变换矩阵为绕Y轴旋转矩阵逆矩阵平移变换矩阵的逆矩阵与原来的平移量相同,但是方向相反。旋转变换矩阵的逆矩阵与原来的旋转轴相同但是角度相反。缩放变换的逆矩阵正好和原来的效果相反,如果原来是放大,则逆矩阵是缩小,如果原来是缩小,则逆矩阵是放大。= Happy Coding =作者:zdd出处:绕任意轴旋转绕任意轴旋转的情况比较复杂,主要分为两种情况,一种是平行于坐标轴的,一种是不平行于坐标轴的,对于平行于坐标轴的,我们首先将旋转轴平移至与坐标轴重合,然后进行旋转,最后再平移回去。· 将旋转轴平移至与坐标轴重合,对应平移操作· 旋转,对应操作· 步骤1的逆过程,对应操作 整个过程就是对于不平行于坐标轴的,可按如下方法处理。(该方法实际上涵盖了上面的情况)1 将旋转轴平移至原点2 将旋转轴旋转至YOZ平面3 将旋转轴旋转至于Z轴重合4 绕Z轴旋转度5 执行步骤3的逆过程6 执行步骤2的逆过程7 执行步骤1的逆过程假设用v1(a1, b2, c2)和v2(a2, b2, c2)来表示旋转轴,表示旋转角度。为了方便推导,暂时使用右手系并使用列向量,待得出矩阵后转置一下即可,上面步骤对应的流程图如下。步骤1是一个平移操作,将v1v2平移至原点,对应的矩阵为步骤2是一个旋转操作,将p(p = v2 -v1)旋转至XOZ平面,步骤3也是一个旋转操作,将p旋转至与Z轴重合,这两个操作对应的图如下。做点p在平面YOZ上的投影点q。再过q做Z轴垂线,则r是p绕X轴旋转所得,且旋转角度为,且于是旋转矩阵为现在将r绕Y轴旋转至与Z轴重合,旋转的角度为-beta(方向为顺时针),且于是得到旋转矩阵为最后是绕Z轴旋转,对应的矩阵如下如果旋转轴是过原点的,那么第一步和最后一步的平移操作可以省略,也就是把中间五个矩阵连乘起来,再转置一下,得到下面的绕任意轴旋转的矩阵即对应的函数代码如下。void RotateArbitraryAxis(D3DXMATRIX* pOut, D3DXVECTOR3* axis, float theta) D3DXVec3Normalize(axis, axis); float u = axis->x; float v = axis->y; float w = axis->z; pOut->m00 = cosf(theta) + (u * u) * (1 - cosf(theta); pOut->m01 = u * v * (1 - cosf(theta) + w * sinf(theta); pOut->m02 = u * w * (1 - cosf(theta) - v * sinf(theta); pOut->m03 = 0; pOut->m10 = u * v * (1 - cosf(theta) - w * sinf(theta); pOut->m11 = cosf(theta) + v * v * (1 - cosf(theta); pOut->m12 = w * v * (1 - cosf(theta) + u * sinf(theta); pOut->m13 = 0; pOut->m20 = u * w * (1 - cosf(theta) + v * sinf(theta); pOut->m21 = v * w * (1 - cosf(theta) - u * sinf(theta); pOut->m22 = cosf(theta) + w * w * (1 - cosf(theta); pOut->m23 = 0; pOut->m30 = 0; pOut->m31 = 0; pOut->m32 = 0; pOut->m33 = 1;如果旋转轴是不过原点的,那么第一步和最后一步就不能省略,将所有七个矩阵连乘起来,得到如下变换矩阵对应如下这个超长的矩阵,在这里(u, v, w) = (a2, b2, c2) - (a1, b1, c1),且是单位向量,a, b, c分别表示(a1, b1, c1)将上面的过程写成函数,该函数接受四个参数,第一个参数是一个输出参数,用来保存得到的旋转矩阵,第二个和第三个参数是旋转轴的两个端点,最后一个参数是旋转角度,注意,在函数中我们已经将上面的矩阵转置了,因为上面是按照列向量计算的。void RotateArbitraryLine(D3DXMATRIX* pOut, D3DXVECTOR3* v1, D3DXVECTOR3* v2, float theta) float a = v1->x; float b = v1->y; float c = v1->z; D3DXVECTOR3 p = *v2 - *v1; D3DXVec3Normalize(&p, &p); float u = p.x; float v = p.y; float w = p.z; float uu = u * u; float uv = u * v; float uw = u * w; float vv = v * v; float vw = v * w; float ww = w * w; float au = a * u; float av = a * v; float aw = a * w; float bu = b * u; float bv = b * v; float bw = b * w; float cu = c * u; float cv = c * v; float cw = c * w; float costheta = cosf(theta); float sintheta = sinf(theta); pOut->m00 = uu + (vv + ww) * costheta; pOut->m01 = uv * (1 - costheta) + w * sintheta; pOut->m02 = uw * (1 - costheta) - v * sintheta; pOut->m03 = 0; pOut->m10 = uv * (1 - costheta) - w * sintheta; pOut->m11 = vv + (uu + ww) * costheta; pOut->m12 = vw * (1 - costheta) + u * sintheta; pOut->m13 = 0; pOut->m20 = uw * (1 - costheta) + v * sintheta; pOut->m21 = vw * (1 - costheta) - u * sintheta; pOut->m22 = ww + (uu + vv) * costheta; pOut->m23 = 0; pOut->m30 = (a * (vv + ww) - u * (bv + cw) * (1 - costheta) + (bw - cv) * sintheta; pOut->m31 = (b * (uu + ww) - v * (au + cw) * (1 - costheta) + (cu - aw) * sintheta; pOut->m32 = (c * (uu + vv) - w * (au + bv) * (1 - costheta) + (av - bu) * sintheta; pOut->m33 = 1;

    注意事项

    本文(绕任意轴旋转.doc)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开