在java中通过角度和轴旋转矢量

时间:2015-07-04 20:58:40

标签: java matrix vector

我知道有很多关于这个主题或相关的问题和答案,但我已经尝试了2个小时但仍然无法想象它。

我想得到一个看起来像这样的函数:

public static Vector rotateVector(Vector v, Vector axis, double angle){

}

其中轴是定义旋转平面的单位矢量(如果角度为正,则矢量v朝向量轴旋转)

我已经看过旋转矩阵,但还没能实现上述函数

4 个答案:

答案 0 :(得分:3)

单位向量(u,v,w)逆时针旋转(x,y,z)角度theta产生一个向量(xPrime,yPrime,zPrime):

double xPrime = u*(u*x + v*y + w*z)*(1d - Math.cos(theta)) 
                + x*Math.cos(theta)
                + (-w*y + v*z)*Math.sin(theta);
double yPrime = v*(u*x + v*y + w*z)*(1d - Math.cos(theta))
                + y*Math.cos(theta)
                + (w*x - u*z)*Math.sin(theta);
double zPrime = w*(u*x + v*y + w*z)*(1d - Math.cos(theta))
                + z*Math.cos(theta)
                + (-v*x + u*y)*Math.sin(theta);

来源here

答案 1 :(得分:2)

知道了,谢谢@Chris K.这是java函数:

public static Vector rotateVectorCC(Vector vec, Vector axis, double theta){
    double x, y, z;
    double u, v, w;
    x=vec.getX();y=vec.getY();z=vec.getZ();
    u=axis.getX();v=axis.getY();w=axis.getZ();
    double xPrime = u*(u*x + v*y + w*z)*(1d - Math.cos(theta)) 
            + x*Math.cos(theta)
            + (-w*y + v*z)*Math.sin(theta);
    double yPrime = v*(u*x + v*y + w*z)*(1d - Math.cos(theta))
            + y*Math.cos(theta)
            + (w*x - u*z)*Math.sin(theta);
    double zPrime = w*(u*x + v*y + w*z)*(1d - Math.cos(theta))
            + z*Math.cos(theta)
            + (-v*x + u*y)*Math.sin(theta);
    return new Vector(xPrime, yPrime, zPrime);
}

但是,我会继续检查克里斯的回答。

答案 2 :(得分:1)

这是旋转矢量的正确方法。

private Vector rotateZ(Vector vector,double angle) { // angle in radians

  //normalize(vector); // No  need to normalize, vector is already ok...

  float x1 = (float)(vector.x * Math.cos(angle) - vector.y * Math.sin(angle));

  float y1 = (float)(vector.x * Math.sin(angle) + vector.y * Math.cos(angle)) ;

  return new Vector(x1, y1);

}

答案 3 :(得分:0)

如果你想要旋转x,y和z轴,那么你应该一次使用旋转矩阵。

NewVector = [Rotation_X] [Rotation_Y] [Rotation_Z] * OldVector

这里Rotation_X,Rotation_Y和Rotation_Z是3x3矩阵。 (你可以看到http://mathworld.wolfram.com/RotationMatrix.html

乘法的顺序取决于问题,但我猜你只想要一个轴旋转(即其他两个矩阵成为单位矩阵)

所以只需放置一个if-block就可以设置正确的矩阵,剩下的就是身份矩阵。

希望这有帮助。