寻找一些帮助,看看我如何能使这个算法更好一点所以我有一个平移工具的代码,它根据用户拖动鼠标来移动相机来移动相机。不过,除非是在短时间内完成,否则它真的很紧张也就是说,场景中的对象似乎在振动,这更可能是相机和画布在“振动”,而不是对象本身。
该代码通过使用dragging
方法SystemEvent
和OnPointerDown
切换OnPointerUp
布尔值来工作,并在世界坐标中指定MouseStart
矢量3和CameraStart
矢量3。
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
变量为真时,xChange
和yChange
浮点值根据当前鼠标位置与原始鼠标位置的比较确定,然后根据这些值调整相机位置。我的思维过程是,因为它是相对于固定的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;
}
}
感谢您的帮助。
编辑:澄清一下这是一个二维环境
最佳答案
之所以会发生这种情况,是因为用于确定鼠标世界位置的相机会根据鼠标世界位置更新每一帧,这会导致一个反馈循环(因此噪声+抖动)。
您可以通过平滑相机随时间的移动(实际上是低通)来减少来自反馈回路的噪声或者试着通过改变你的计算来完全消除反馈回路,这样相机的位置和目标位置(鼠标)就不会相互依赖了——尽管我不知道如果你的意图真的可行的话,该怎么做。
查看Vector3.SmoothDamp。
随着时间的推移,逐渐将向量向所需的目标改变。
矢量被一些类似弹簧阻尼器的函数平滑,这将
永远不要超调。最常见的用途是平滑跟随摄影机。