Unity:使用触摸式抓拍移动旋转时,相机跳动/抖动

时间:2019-05-20 19:49:28

标签: unity3d camera touch

使用Unity,我正在尝试通过第一人称相机通过触摸来移动炮塔旋转,我会从屏幕侧面抓取到我想在Google地图中找到的方向上的中心,触摸抓取会移动我相机平稳地放置在那里。

问题是相机非常生涩,位置不平稳。

在全球范围内

private float smoothTouchFactor = 5;

这是我在Update()中使用的代码

Quaternion rotation;

if (Input.touchCount > 0)
{
    if (Input.GetTouch(0).phase == TouchPhase.Moved)
    {
        Touch touch = Input.GetTouch(0);
        x += touch.deltaPosition.x * xSpeed * 0.02f;
        y -= touch.deltaPosition.y * ySpeed * 0.02f;

        rotation = Quaternion.Euler(y, x, 0f);
        turretHeadToMove.rotation = Quaternion.Slerp(turretHeadToMove.rotation, rotation, Time.deltaTime * smoothTouchFactor);
    }
}

rotation = Quaternion.Euler(y, x, 0f);
turretHeadToMove.rotation = Quaternion.Slerp(turretHeadToMove.rotation, rotation, Time.deltaTime * smoothTouchFactor);

如果我没有在if(touchCount)之后添加最后两行,那么当我将手指从屏幕上移开后,相机会返回到初始位置。


这是鼠标轴Mouse X / Y代码,可正常工作并且平稳地移动炮塔。

private float xSpeed = 40.0f;
private float ySpeed = 40.0f;

in Update()
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

Quaternion rotation = Quaternion.Euler(y, x, 0f);
turretHeadToMove.rotation = rotation;

1 个答案:

答案 0 :(得分:3)

从您最后需要那些“两行”的描述开始,听起来您在其他地方的代码正在不断尝试重置它们的轮换。因此,我们添加了一个变量,以使rotation与上次完成触摸控制时的Quaternion保持一致,只需确保在处理触摸控制之前将其分配给turretHeadToMove.rotation

然后,您可以使用Euler创建一个Quaternion来表示要旋转多少帧。然后将当前旋转次数乘以该数量即可获得新的旋转次数

总的来说,看起来像这样:

作为字段:

private Quaternion savedRotation = Quaternion.identity;

Update中:

// Add it before the block so that modifications to `localRotation` are consistent with memory
turretHeadToMove.rotation = savedRotation;

if (Input.touchCount > 0)
{
    if (Input.GetTouch(0).phase == TouchPhase.Moved)
    {
        Touch touch = Input.GetTouch(0);
        Quaternion previousRotation = turretHeadToMove.rotation;

        Quaternion rotationThisFrame = Quaternion.Euler(
                 touch.deltaPosition.y * ySpeed, 
                 touch.deltaPosition.x * xSpeed, 0f);

        turretHeadToMove.rotation = previousRotation * rotationThisFrame;

        savedRotation = turretHeadToMove.rotation;
    }
}