我知道有很多关于这个主题或相关的问题和答案,但我已经尝试了2个小时但仍然无法想象它。
我想得到一个看起来像这样的函数:
public static Vector rotateVector(Vector v, Vector axis, double angle){
}
其中轴是定义旋转平面的单位矢量(如果角度为正,则矢量v朝向量轴旋转)
我已经看过旋转矩阵,但还没能实现上述函数
答案 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就可以设置正确的矩阵,剩下的就是身份矩阵。
希望这有帮助。