我正在尝试制作一个第一人称角色控制器,并且我遇到了平滑我的外观轮换的问题。我的LookRotation
脚本接受我的鼠标输入并使用它来旋转角色。尽管使用Quaternion.Slerp()
存在问题,但我已使用Quaternion.Slerp()
来平滑外观轮换。一旦所需的旋转距离当前旋转大于180度,它将采用较短的路线(相反的方式)。问题出现在最后两行代码中。有没有人有办法防止这个问题?提前谢谢!
#region Variables
// Sensitivity variables
[Range(0.0f, 10.0f)] public float horizontalSensitivity = 2.0f, verticalSensitivity = 2.0f;
// Smoothing Variables
[Range(0.0f, 30.0f)] public float smoothAmount = 5.0f;
// Character rotation variables
private Quaternion characterTargetRotation;
private Quaternion cameraTargetRotation;
public Transform character;
public Transform characterCamera;
#endregion
private void Update()
{
float horizontalRotation = Input.GetAxis("Mouse X") * horizontalSensitivity;
float verticalRotation = Input.GetAxis("Mouse Y") * verticalSensitivity;
characterTargetRotation *= Quaternion.Euler(0.0f, horizontalRotation, 0.0f);
cameraTargetRotation *= Quaternion.Euler(-verticalRotation, 0.0f, 0.0f);
character.localRotation = Quaternion.Lerp(_character.localRotation, characterTargetRotation, smoothAmount * Time.deltaTime);
characterCamera.localRotation = Quaternion.Lerp(_characterCamera.localRotation, cameraTargetRotation, smoothAmount * Time.deltaTime);
}
答案 0 :(得分:1)
无法使用Quaternions和Lerp完成,我使用欧拉角解决了这个问题。
Lerp
使用此方法会创建您必须处理的备用问题,但使用Quaternions和Lerp
会出现无法解决的问题。如上所述,float
将始终找到最短距离。 Euler可以达到你想要的高度(或者更准确地说与数据类型允许的一样高),因此它没有这个问题。
虽然如果你继续添加角度,这对普通玩家来说不太可能是一个问题,但在这种情况下Lerp
的数据类型最终会失去精确度。为了避免这种情况,只需减去或添加(取决于值是正还是负)从角度360的任意倍数和平滑的角度,数字足够高,以免影响$scope.selected = function (selectedItem) {
$scope.chart.data.rows[selectedItem.row].c[0].v;
$scope.selectedBarId = $scope.chart.data.rows[selectedItem.row].c[0].v;
alert("Selected bar : " + $scope.selectedBarId);
};
$scope.chartClick = function( event ) {
alert('in chartClick');
if($scope.selectedBarId){
// your business if a bar is selected
}
};
。
使用此方法获取x轴上的起始角度存在一些问题,但与此问题无关,因此任何想要知道如何操作的人都必须找到解决该问题的替代来源。