所以我导出了这样的旋转函数:
我想绕 x 轴旋转 (a, b, c)
a
的值不会改变这相当于在 2d map 中围绕原点旋转 (b, c)
对于极坐标中的二维 map ,旋转
d
度非常简单:θ = θ + d
对于点 P(x, y),
x = Rcos(θ)
和y = Rsin(θ)
设Q为旋转后的点,则
Q = (Rcos(θ + d), Rsin(θ + d))
因为 R2 = x2 + y2 且 θ = arctan(y/x):
Q = (sqrt(x2 + y2) * cos(arctan(y/x) + d, sqrt(x2) > + y2) * sin(arctan(y/x) + d)
然后我创建了一个给出坐标的 C 函数:a
和 rot_amount
(通常为 1),它会为我旋转坐标。
static void xrotate_coor(t_coor *a, int rot_amount)
{
double d;
double e;
d = a->y;
e = a->z;
if (e == 0 && d == 0)
return ;
if (d == 0)
{
a->y = sqrt(d * d + e * e) * cos(atan(INFIN) + rot_amount * M_PI / 50);
a->z = sqrt(d * d + e * e) * sin(atan(INFIN) + rot_amount * M_PI / 50);
return ;
}
a->y = sqrt(d * d + e * e) * cos(atan(e / d) + rot_amount * M_PI / 50);
a->z = sqrt(d * d + e * e) * sin(atan(e / d) + rot_amount * M_PI / 50);
}
INFIN是一个宏,我设置为999999。
我不确定这是否正确,因为使用这个公式,我旋转的形状正在变形,所以我觉得我的逻辑在某个地方有缺陷......
最佳答案
您在计算中遇到了累积的错误。这是由计算机中数字表示方式的本质造成的。
在计算机图形学中处理此问题的典型方法是保持对象的坐标固定并将其转换到渲染帧所需的位置。在您的情况下,这意味着不是逐渐旋转对象,而是将对象保留在其原始位置,并根据当前应显示的位置简单地计算到绕 X 轴的当前角度的平移。
换句话说,如果您一次平移 360 度总共 20 度,则在第一次迭代中显示 20 度处的平移坐标,在第二次迭代中显示 40 度处的平移坐标,而不是每次实际平移 20 度.
关于c - 我无法判断这个旋转功能是否按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45703833/