旋转功能的怪异行为

Rotation function weird behaviour

本文关键字:功能 旋转      更新时间:2023-10-16

我一直在研究一个旋转函数。每个循环中,点都会向旋转中心轻微移动。它取决于一个函数来获得中心和要旋转的点之间的距离:

struct Vector3F
{
    float x, y, z;
};
inline float GetDistance3FX_inline(Vector3F* v1, Vector3F* v2) 
{ 
    return v1->x - v2->x; 
}
inline float GetDistance3FZ_inline(Vector3F* v1, Vector3F* v2) 
{ 
    return v1->z - v2->z; 
}

执行工作的实际旋转功能:

void Rotate3FY(Vector3F* point, Vector3F* center, float rad)
{
    float x = GetDistance3FX_inline(point, center);
    float z = GetDistance3FZ_inline(point, center);
    point->x = x * cos(rad) - z * sin(rad) + center->x;
    point->z = z * cos(rad) + x * sin(rad) + center->z;
}

不工作的功能

void Rotate3FY(Vector3F* point, Vector3F* center, float rad)
{
    point->x = GetDistance3FX_inline(point, center) * cos(rad) - GetDistance3FZ_inline(point, center) * sin(rad) + center->x;
    point->z = GetDistance3FZ_inline(point, center) * cos(rad) + GetDistance3FX_inline(point, center) * sin(rad) + center->z;
}

我不知道这两者之间有什么逻辑上的区别。谢谢你的建议。

在第二个函数中,当您更新point->x时,您正在更改point的属性。因此,当您稍后在设置point->z时再次调用相同的函数时,point->x的值已经发生了变化。

void Rotate3FY(Vector3F* point, Vector3F* center, float rad)
{
    point->x = GetDistance3FX_inline(point, center) * cos(rad) - GetDistance3FZ_inline(point, center) * sin(rad) + center->x;
    // point is now different to what it was at the start because you just 
    // changed is x member!!!!!!!
    point->z = GetDistance3FZ_inline(point, center) * cos(rad) + GetDistance3FX_inline(point, center) * sin(rad) + center->z;
}

在第一个函数中,在修改point之前,将所需的值存储在单独的变量中。