给出以下算法:
public static void Casteljau(Vector3 p1, Vector3 p2, Vector3 p3 , Vector3 p4, ArrayList L)
{
float stepping = (float)(0.02);
for (float x = 0.0f; x <= 1.0f; x += stepping)
{
Vector3 ap1 = Vector3.Lerp(p1, p2, x);
Vector3 ap2 = Vector3.Lerp(p2, p3, x);
Vector3 ap3 = Vector3.Lerp(p3, p4, x);
Vector3 bp1 = Vector3.Lerp(ap1, ap2, x);
Vector3 bp2 = Vector3.Lerp(ap2, ap3, x);
Vector3 p = Vector3.Lerp(bp1, bp2, x);
L.Add(p);
}
}
得到四个点并返回表示它们之间曲线的点列表,并且给定传递给该函数的相同四个点,我得到不同的结果在两个不同的端点\ clients。其中一个计算点在运行之间有一点0.1f
的偏差(差异非常小,但对我的使用至关重要)。
此算法用于多人游戏(使用Unity3D),并且两端运行此算法时具有完全相同四个点。
Vector
的每个值都是浮点数,语言是C#
,两端都在同一台PC上运行(一个客户端使用Unity编辑器运行,另一个客户端是使用Unity构建的可执行文件),操作系统在Windows
。
Lerp
功能 -
http://docs.unity3d.com/ScriptReference/Vector3.Lerp.html
答案 0 :(得分:0)
如果0.1准确度对你的眼睛很重要,那么使用双打可能是一个更好的主意,因为用浮子制作的每一个计算都会增加一些不精确性。在你的情况下,你处于一个使用浮动的for循环中,所以一些不精确可能会导致很大的差异。
有一个很好的stackOverflow答案: Floating point inaccuracy examples
建议将这些vector3包装成vector3的双重版本。至于exe和编辑器之间的区别,它可能是因为Exe和编辑器不是为同一个目标构建的。而且他们两个可用的资源都不一样。现在如果你在同一台PC上设法找到差异,你可能无法从不同的架构上的多台PC获得干净的结果。