寻找一些帮助,看看我如何使这个算法更好一点 . 所以我有一些平移工具的代码,根据用户拖动鼠标移动相机来移动相机 . 然而,除非它是在非常短暂的拖拽中完成的,否则它真的很蠢 . 即场景中的物体似乎会振动,这更可能是相机和画布“振动”而不是物体本身 .
该代码通过使用 SystemEvent
方法 OnPointerDown
和 OnPointerUp
切换 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
变量为真的更新循环中,基于当前鼠标位置与原始鼠标位置相比确定 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;
}
}
任何帮助表示赞赏,谢谢 .
编辑:只是为了澄清这是一个二维环境
1 回答
发生这种情况是因为根据鼠标的世界位置,每帧都会更新用于确定鼠标世界位置的摄像机,这会导致反馈循环(因此会产生噪声抖动) .
您可以通过平滑相机随时间的移动(实际上是低通)来减少来自反馈回路的噪声,或者尝试通过改变计算来完全移除反馈回路,以便相机位置和目标位置(鼠标)不依赖于每个其他 - 虽然我不确定如果你的意图实际上是可能的 .
看看Vector3.SmoothDamp .