首页 文章

平移工具算法非常跳跃

提问于
浏览
1

寻找一些帮助,看看我如何使这个算法更好一点 . 所以我有一些平移工具的代码,根据用户拖动鼠标移动相机来移动相机 . 然而,除非它是在非常短暂的拖拽中完成的,否则它真的很蠢 . 即场景中的物体似乎会振动,这更可能是相机和画布“振动”而不是物体本身 .

该代码通过使用 SystemEvent 方法 OnPointerDownOnPointerUp 切换 dragging 布尔值并在世界坐标中分配 MouseStart Vector3以及 CameraStart Vector3 .

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

然后在 dragging 变量为真的更新循环中,基于当前鼠标位置与原始鼠标位置相比确定 xChangeyChange 浮点值,然后根据这些调整相机位置 . 我的思维过程是因为它相对于一个固定的 MouseStart (因为它只在点击指针并拖动= 0的单帧中更改)如果我要拖动然后说保持鼠标静止,那么就会有没有坐标的变化,因为它会反复将相机放在相同的位置 . 完整代码如下所示:

private bool dragging;

private string CurrentTool;

private ButtonController[] DrawingTools;

public Camera TheCamera;

public Vector3 MouseStart;
public Vector3 CameraStart;

public float sensitivity;

// Use this for initialization
void Start () {
    TheCamera = FindObjectOfType<Camera>();
    DrawingTools = FindObjectsOfType<ButtonController>();
}

// Update is called once per frame
void Update () {
    for (int i = 0; i < DrawingTools.Length; i++)
    {
        if (DrawingTools[i].Pressed)
        {
            CurrentTool = DrawingTools[i].gameObject.name;
        }
    }

    if (dragging && CurrentTool == "PanTool Button")
    {
        float xChange;
        float yChange;
        Vector3 MousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        if (MousePosition.x > MouseStart.x)
        {
            xChange = -Mathf.Abs(MousePosition.x - MouseStart.x);
        }
        else
        {
            xChange = Mathf.Abs(MousePosition.x - MouseStart.x);
        }

        if (MousePosition.y > MouseStart.y)
        {
            yChange = -Mathf.Abs(MousePosition.y - MouseStart.y);
        }
        else
        {
            yChange = Mathf.Abs(MousePosition.y - MouseStart.y);
        }

        TheCamera.transform.position = new Vector3(CameraStart.x + xChange*sensitivity, CameraStart.y + yChange*sensitivity, CameraStart.z);
    }
}

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

任何帮助表示赞赏,谢谢 .

编辑:只是为了澄清这是一个二维环境

1 回答

  • 1

    发生这种情况是因为根据鼠标的世界位置,每帧都会更新用于确定鼠标世界位置的摄像机,这会导致反馈循环(因此会产生噪声抖动) .

    您可以通过平滑相机随时间的移动(实际上是低通)来减少来自反馈回路的噪声,或者尝试通过改变计算来完全移除反馈回路,以便相机位置和目标位置(鼠标)不依赖于每个其他 - 虽然我不确定如果你的意图实际上是可能的 .

    看看Vector3.SmoothDamp .

    随着时间的推移,逐渐将向量更改为所需目标 . 矢量通过一些类似 spring 阻尼器的功能进行平滑,这种功能永远不会过冲 . 最常见的用途是平滑后续相机 .

相关问题