2015-11-04 111 views
1

我一直在研究旋转函数。每个周期点都会轻微移动到旋转中心。这取决于一个函数来获取中心与点之间的距离旋转:旋转函数奇怪的行为

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; 
} 

我不知道这两者之间有什么逻辑差异。 感谢您的任何建议。

+1

什么不行?错误的结果? – Downvoter

回答

3

在更新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之前存储在单独的变量需要的值。

+0

好的,那时我全力阻滞。非常感谢 – tomatocake