如何解决特定阈值后相机旋转抖动视频
所以我有这个设置:
-
相机旋转被限制在 Y 轴上。只能左右旋转-75度到75度,旋转由鼠标控制。
-
玩家身体可以绕其 Y 轴旋转,并将其 Y 旋转值添加到 -75 和 75 度相机夹,以保持玩家身体前方的相机旋转空间。示例:如果玩家在 Y 轴上旋转 90 度,则钳位值将更改为 15 度和 165 度。
当玩家身体在 Y 轴上超过 359 度时会出现问题,因为相机钳位值从 284 和 434 跳回 -75 和 75,这会导致相机移动明显卡顿。我怎样才能消除这个快照?
Video example - Note the camera clamps (Limit L,Limit R) in the MouseLook script after 00:40
*handleBodyRotation 方法只是旋转玩家身体以面对红色立方体,它是相机的子节点。
public class MouseLook : MonoBehavIoUr
{
public Transform CameraBox;
public Transform lookAtPivot;
public Transform lookAtObject;
public Transform playerBody;
public float sensitivity;
public float bodyRotSpeed;
float xRotation = 0f;
float yRotation = 0f;
public float limitL;
public float limitR;
void Start()
{
Cursor.lockState = CursorLockMode.Locked;
}
void handleCamRotation()
{
float mouseX = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;
float mouseY = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime;
xRotation -= mouseY;
xRotation = Mathf.Clamp(xRotation,-45,35);
yRotation += mouseX;
yRotation = Mathf.Clamp(yRotation,limitL,limitR);
//Handle and clamp Camera,lookAtPivot,and lookAtObject rotation
transform.rotation = Quaternion.Euler(xRotation,yRotation,0f);
//Handle left limit and right limit
limitL = -75 + playerBody.transform.rotation.eulerAngles.y;
limitR = 75 + playerBody.transform.rotation.eulerAngles.y;
}
void handleBodyRotation()
{
Quaternion targetRotation = Quaternion.Euler(playerBody.transform.rotation.eulerAngles.x,lookAtObject.transform.rotation.eulerAngles.y,playerBody.transform.rotation.eulerAngles.z);
playerBody.transform.localRotation = Quaternion.Lerp(playerBody.transform.localRotation,targetRotation,bodyRotSpeed * Time.deltaTime);
}
void Update()
{
//Camera Rotation (clamped)
handleCamRotation();
//Body Rotation
if (Input.GetKey(KeyCode.W))
{
handleBodyRotation();
}
}
}
解决方法
当您读取 .eulerAngles 属性时,Unity 会将四元数的内部旋转表示转换为欧拉角。因为,使用欧拉角表示任何给定旋转的方法不止一种,您读出的值可能与您指定的值大不相同。如果您尝试逐渐增加值以生成动画,这可能会导致混淆。
特别是 eulerAngles 将始终返回一个介于 0
和 359.9999...
之间的值!
你自己说它跳转到 284
和 434
,然后返回到 -75
和 75
。
为什么?
因为
-
359 - 75
是284
而359 + 75
是434
-
0 - 75
是-75
,0 + 75
是75
。
您的 eulerAngles.y
值接近 359.999...
0
处的包裹点。
我认为你必须围绕这些值,例如
limitL = -75 + playerBody.transform.rotation.eulerAngles.y;
limitR = 75 + playerBody.transform.rotation.eulerAngles.y;
if(limitR > 360) limitR -= 360;
if(limitR < 0) limitR += 360;
if(limitL > 360) limitL -= 360;
if(limitL < 0) limitL += 360;
不确定,但我想你也必须像这样夹起来
if(limitR > limitL)
{
yRotation = Mathf.Clamp(yRotation,limitL,limitR);
}
else
{
yRotation = Mathf.Clamp(yRotation,limitR,limitL);
}
不知道 Unity 如何处理这种情况.. 可能是多余的。
注意:在智能手机上打字,但我希望思路清晰
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。