前段时间答应给老婆用Flash做一个魔方,这里面就涉及到一个问题,因为魔方有自己的旋转轴,当这些轴与整体的xyz体系不重合时,魔方的旋转如何描述?再直接点就是如何解决绕任意向量旋转的问题。相对于围绕特殊向量{(x,0,0)、(0,y,0)、(0,0,z)}而言,这个要更为复杂和实用。所以不妨称为扩展(Advanced)算法。
如何实现这个算法是我一直没有解决的问题。就目前的想法而言,有以下几种可能的实现方法:
1.仍然建立在经典算法的基础上,将基准向量(即被围绕的向量)旋转回基本坐标轴,旋转完之后再反向转回原地。这种方法毫无疑问,效率比较低,而且难度在于如何将基准向量分解为三个角度转回。虽然原理上比较简单,但是作为三维类的核心代码,执行效率低下就意味着失败!
2.按照数学方法将围绕任意向量旋转的公式计算出来。显而易见,这种方法执行效率比较高,但其对我的理论工作要求好高啊。目前在犹豫中……
3.综合前两种方法,结合其角速度和坐标点的关系计算出线速度,利用梯度分解为三个方向的线速度,再反变换为三个坐标轴的角速度调用经典方法解决。其中线速度可以去掉,直接将基准向量的角速度分解。目前来说可能是最高效、最简单的算法了。其可行性还没有太深入的思考。
好了,今天一时心血来潮写了点东西,但愿若干天后能在这个问题上有所建树,解决这个问题,让我能真的给老婆做出来这个魔方。呵呵
最后附上经典算法,它是那么的优美,以至于我都有点爱它了。但愿老婆不会吃醋,哈哈

CODE:
private function Xrotate(c:Number, s:Number):Object {
var ny = this.y*c+this.z*s;
var nz = this.z*c-this.y*s;
return new v3d(this.x, ny, nz);
}
private function Yrotate(c:Number, s:Number):Object {
var nz = this.z*c+this.x*s;
var nx = this.x*c-this.z*s;
return new v3d(nx, this.y, nz);
}
private function Zrotate(c:Number, s:Number):Object {
var nx = this.x*c+this.y*s;
var ny = this.y*c-this.x*s;
return new v3d(nx, ny, this.z);
}
最新回复