这是我用C++计算3D旋转的函数,该旋转由围绕轴的辐射角度定义.
Vector rotate(const Vector& axis, const Vector& input, const double angle) {
double norm = 1/axis.norm();
if(norm != 1)
axis *= norm;
double cos = std::cos(angle);
double mcos = 1 - cos;
double sin = std::sin(angle);
double r1[3];
double r2[3];
double r3[3];
double t_x, t_ym t_z;
r1[0] = cos + std::pow(axis.x, 2)*mcos;
r1[1] = axis.x*axis.y*mcos - axis.z * sin;
r1[2] = axis.x*axis.z*mcos - axis.y * sin;
r2[0] = axis.x*axis.y*mcos + axis.z*sin;
r2[1] = cos + std::pow(axis.y, 2)*mcos;
r2[2] = axis.x*axis.z*mcos - axis.x * sin;
r3[0] = axis.x*axis.z*mcos - axis.y * sin;
r3[1] = axis.z*axis.y*mcos - axis.x * sin;
r3[2] = cos - std::pow(axis.z, 2) * mcos;
return Vector(t_x, t_y, t_z);
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果你尝试自己旋转矢量n次pi/4,其中n multiple of 4(做四个四分之一转,这样你就彻底的革命绕轴)的误差将传播非常快.
示例(其中err = input-output):
input: (1.265, 3.398, 3.333)
rotation axis: (2.33, 0.568, 2.689)
n: 8 (so two completes revolutions)
output: (1.301967, 1.533389, 4.138940)
error: (0.038697, -0.864611, 0.805940)
n: 400 (so 100 completes revolutions)
error: (472..., 166..., 673...)
Run Code Online (Sandbox Code Playgroud)
我能做什么 ?
约束:
angle = pi/4 *n % 2*pi像@molbdnilo建议的那样.因为我必须链转换和旋转来测试是否存在碰撞.最后我使用了罗德里格斯的轮换公式,表现好多了。
尽管这不是 @ComicSansMs 指出的解决方案:
首先避免链接浮动操作!
因此,结合新算法并使用罗德里格斯公式就可以了。
我怀疑我的第一个矩阵实现中存在错误。
感谢大家的回答和见解。
| 归档时间: |
|
| 查看次数: |
725 次 |
| 最近记录: |