旋转功能的怪异行为
Rotation function weird behaviour
我一直在研究一个旋转函数。每个循环中,点都会向旋转中心轻微移动。它取决于一个函数来获得中心和要旋转的点之间的距离:
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
之前,将所需的值存储在单独的变量中。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 与互斥锁相比,旋转锁可以保证上下文切换
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 绘制旋转的三角形
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 位旋转功能
- 我可以将 AVX/SSE 与旋转功能用于 AoS 布局,而不是 SoA 吗?
- 是否有更好的方法(性能提高 /内置功能)获得矩形的旋转角度
- 在OpenGL中实现自己的旋转功能
- 旋转功能C++
- 制作旋转器的功能,每天每分钟创建一个时间戳
- 旋转功能的怪异行为
- 旋转QLabel并保留其功能/样式表
- 使用OpenGL固定功能旋转和平移2D图像