需要一些帮助,以了解如何使该算法更好。因此,我有一些用于平移工具的代码,该工具可以根据用户拖动鼠标来移动摄像机,从而移动摄像机。但是,除非在很短的拖动中完成,否则它确实是跳跃的。即场景中的对象似乎在振动,这很可能是相机和画布“在振动”,而不是对象本身。
该代码通过使用dragging
和SystemEvent
方法OnPointerDown
切换布尔值OnPointerUp
并在世界坐标中分配MouseStart
Vector3以及{ {1}} Vector3。
CameraStart
然后在public void OnPointerDown(PointerEventData EventData)
{
if (!dragging)
{
dragging = true;
MouseStart = new Vector3(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y, 0f);
CameraStart = TheCamera.transform.position;
}
}
public void OnPointerUp(PointerEventData EventData)
{
if (dragging)
{
dragging = false;
}
}
变量为true的更新循环中,根据当前鼠标位置与原始鼠标位置(相机位置)相比,确定dragging
和xChange
浮点值然后根据这些进行调整。我的思维过程是,因为它相对于固定的yChange
(因为它仅在单击指针并拖动= 0的单帧中更改),因此如果要拖动然后说保持鼠标静止,坐标不会发生变化,因为它会反复将Camera置于相同位置。完整的代码如下:
MouseStart
感谢您的帮助。
编辑:只是为了澄清这是一个2d环境
答案 0 :(得分:1)
之所以发生这种情况,是因为您要从中确定鼠标的世界位置的相机会根据鼠标的世界位置每帧更新一次 ,这会导致反馈回路(并因此产生噪音) +抖动)。
您可以通过使摄像机的运动随时间平滑(有效地是低通)来减少反馈环路中的噪声,或者尝试通过更改计算以使摄像机位置和目标位置(鼠标)不完全消除反馈环路彼此依赖-虽然我不确定如果您的意图确实可行的话该怎么做。
随着时间的流逝,逐渐将矢量朝着理想目标变化。
通过一些类似于弹簧阻尼器的函数对矢量进行平滑处理, 永不过分。最常见的用途是使跟随摄像机平滑。