返回列表 发帖

[原创]扩展旋转方法的讨论[一]

众所周知,下面的代码是三维旋转的经典(Classical)算法,其核心是平面坐标系下围绕原点的旋转方法的扩展。在xyz坐标系下,将任意角度的旋转分解为绕三个轴的旋转,具有简单高效的优点。为了提高执行效率,还将入口参数改成了需要旋转角度的三角函数值,这样在处理大批量同角度旋转的向量数组时就显示出了较高的执行效率。经典方法可以适用于绝大多数场合。
    前段时间答应给老婆用Flash做一个魔方,这里面就涉及到一个问题,因为魔方有自己的旋转轴,当这些轴与整体的xyz体系不重合时,魔方的旋转如何描述?再直接点就是如何解决绕任意向量旋转的问题。相对于围绕特殊向量{(x,0,0)、(0,y,0)、(0,0,z)}而言,这个要更为复杂和实用。所以不妨称为扩展(Advanced)算法。
    如何实现这个算法是我一直没有解决的问题。就目前的想法而言,有以下几种可能的实现方法:
    1.仍然建立在经典算法的基础上,将基准向量(即被围绕的向量)旋转回基本坐标轴,旋转完之后再反向转回原地。这种方法毫无疑问,效率比较低,而且难度在于如何将基准向量分解为三个角度转回。虽然原理上比较简单,但是作为三维类的核心代码,执行效率低下就意味着失败!
    2.按照数学方法将围绕任意向量旋转的公式计算出来。显而易见,这种方法执行效率比较高,但其对我的理论工作要求好高啊。目前在犹豫中……
    3.综合前两种方法,结合其角速度和坐标点的关系计算出线速度,利用梯度分解为三个方向的线速度,再反变换为三个坐标轴的角速度调用经典方法解决。其中线速度可以去掉,直接将基准向量的角速度分解。目前来说可能是最高效、最简单的算法了。其可行性还没有太深入的思考。
    好了,今天一时心血来潮写了点东西,但愿若干天后能在这个问题上有所建树,解决这个问题,让我能真的给老婆做出来这个魔方。呵呵
    最后附上经典算法,它是那么的优美,以至于我都有点爱它了。但愿老婆不会吃醋,哈哈
  1. private function Xrotate(c:Number, s:Number):Object {
  2. var ny = this.y*c+this.z*s;
  3. var nz = this.z*c-this.y*s;
  4. return new v3d(this.x, ny, nz);
  5. }
  6. private function Yrotate(c:Number, s:Number):Object {
  7. var nz = this.z*c+this.x*s;
  8. var nx = this.x*c-this.z*s;
  9. return new v3d(nx, this.y, nz);
  10. }
  11. private function Zrotate(c:Number, s:Number):Object {
  12. var nx = this.x*c+this.y*s;
  13. var ny = this.y*c-this.x*s;
  14. return new v3d(nx, ny, this.z);
  15. }
复制代码
欢迎光临我的个人空间:★四维空间★

看到强银

TOP

支持强银!但好象一年喽,进展如何呢,有些事情要坚持下去才会成功呢

TOP

返回列表