使用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;
答案 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;
}
}