Unity3D EulerAngles可以一轴平滑地改变

马克西姆·托奇洛

我尝试通过一个轴将多维数据集旋转90度,如果任何轴位于0位置,则一切正常。但是,如果任何轴在任何位置(例如90或-90),他都会开始无休止地旋转。

视频外观:https//youtu.be/PE4YH19ndCc

public Vector3 targetEulerAngles;
public float spd = 0.1f;
GameObject mainCube;
public void Awake()
{
    mainCube = GameObject.FindGameObjectWithTag("mainCube");
}
public void FixedUpdate()
{
    mainCube.transform.eulerAngles = Vector3.Lerp(mainCube.transform.eulerAngles, targetEulerAngles, spd);
}
public void RotateToLeft()
{
    targetEulerAngles = new Vector3(targetEulerAngles.x + 90f, targetEulerAngles.y, targetEulerAngles.z);
}
public void RotateToRight()
{
    targetEulerAngles = new Vector3(targetEulerAngles.x - 90f, targetEulerAngles.y, targetEulerAngles.z);
}
public void RotateToUp()
{
    targetEulerAngles = new Vector3(targetEulerAngles.x, targetEulerAngles.y, targetEulerAngles.z - 90f);
}
public void RotateToDown()
{
    targetEulerAngles = new Vector3(targetEulerAngles.x, targetEulerAngles.y, targetEulerAngles.z + 90f);
}
尤里·纽德曼(Yuri Nudelman)

@ joel64在他的回答中说的确实是正确的,但这不是这里的问题。

问题是您不正确地使用了Lerp。Lerp(a,b,c)的最后一个参数不是SPEED,它是从0到1的进度,其中c <= 0表示结果= a,c> = 1表示结果= b,所有其他值都在两者之间。您的代码不断旋转立方体,并且永不停止,只是随着时间的推移它旋转的越来越少。

使用欧拉角时,由于存在转换错误,因此非常明显;使用四元数时,它的可见性较小,但仍然-旋转不会停止。

为了正确地完成这些工作,您需要编写更多代码。您需要一些变量来保存当前的旋转进度,并且必须记住旋转的开始位置。然后在给定进度的情况下将立方体从起始位置旋转到目标位置,并每帧增加进度。

哦,如果您希望在任何FPS上的旋转都相同,请不要忘记deltaTime。

最终代码为:

public Vector3 targetEulerAngles;
public float spd = 0.1f;
GameObject mainCube;

private Quaternion startRotation;
private float progress = 0;

public void Awake() {
    mainCube = GameObject.FindGameObjectWithTag("mainCube");
}
public void FixedUpdate() {
    if (progress == 0) startRotation = mainCube.transform.rotation;
    mainCube.transform.rotation = Quaternion.Lerp(startRotation, Quaternion.Euler(targetEulerAngles), progress);
    progress += spd*Time.fixedDeltaTime;
}
public void RotateToLeft() {
    targetEulerAngles = new Vector3(targetEulerAngles.x + 90f, targetEulerAngles.y, targetEulerAngles.z);
    progress = 0;
}
public void RotateToRight() {
    targetEulerAngles = new Vector3(targetEulerAngles.x - 90f, targetEulerAngles.y, targetEulerAngles.z);
    progress = 0;
}
public void RotateToUp() {
    targetEulerAngles = new Vector3(targetEulerAngles.x, targetEulerAngles.y, targetEulerAngles.z - 90f);
    progress = 0;
}
public void RotateToDown() {
    targetEulerAngles = new Vector3(targetEulerAngles.x, targetEulerAngles.y, targetEulerAngles.z + 90f);
    progress = 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Unity3D为什么将轴与SPEED相乘?

获取相对于Unity3d旋转的轴

是否可以在 Rider 内运行 Unity3D 测试?

Unity3D像镜子一样变换?

Unity3D - 按钮未触发一次?

Unity3d根据俯仰,横滚和偏航角度列表平滑地旋转对象

是否可以使Unity3D UI滑块遵循时间轴?

在x轴上移动对象,就像鼠标位置的移动一样(Unity3d)

使用 Vector3 和 1 轴的浮点值在 Unity3D 中缩短代码

如何在 Unity3D 中在 X 轴和 Z 轴上进行拖放?

不能在一个对象Unity3D上播放3个动画

根据其在unity3d中的当前位置改变主摄像头的位置

为什么在Unity3D中摄像机绕z轴旋转?

强制模式仅在Y轴上起作用Unity3D

特定轴上向量/方向之间的Unity3D角度

将对象限制为沿x轴的屏幕边缘-Unity3d

刚体操作在 Y 轴上不起作用?(Unity3D 2020.1)

如何在Unity3D中高效地捕获当前桌面和跨平台?

尽可能靠近目的地-Unity3d

NavMeshAgent 在到达目的地之前停止 Unity3D

是否可以在wordpress页面上插入unity3d播放器?

我可以在Unity3d 2017.2中使用Java脚本语言吗?

Unity3D:是否可以在纹理上显示正在运行的移动应用程序?

是否可以在 Unity3D 上集成 Firebase ML-Kit?

unity3d和git子模块可以吗?

有什么方法可以将触摸输入限制为Unity3D中的面板?

可以在Unity3D中创建更高效的寻的导弹系统吗?

用于C#mono和Unity3d的Consulo IDE,可以吗?

我可以在Unity3d中使用多个游戏手柄吗?