摘要

本文探讨如何用lerp实现近似的匀速旋转,当然如果运用本文给出的方法,使用slerp则可以实现匀速旋转,并指出Unity官方lerp示例代码的一些缺陷。

现有问题

比如四元数Lerp API:

Interpolates between a and b by t and normalizes the result afterwards. The parameter t is clamped to the range [0, 1].

public static Quaternion Lerp(Quaternion a, Quaternion b, float t);

以及使用示例

using UnityEngine;
using System.Collections; public class ExampleClass : MonoBehaviour {
public Transform from;
public Transform to;
public float speed = 0.1F;
void Update() {
transform.rotation = Quaternion.Lerp(from.rotation, to.rotation, Time.time * speed);
}
}

如果这样使用,会有如下几个问题值得我们注意:

1)这样的旋转不是匀速的旋转,这种是逐渐减速的旋转。

2)永远无法旋转到目标角度,可以无限的接近。

3)旋转速度与帧数相关,请注意from.rotation在变化,举例来说单位时间内移动2次2%和移动1次4%并不相同。

正确的使用方法

首先可以参考如下文章  如何正确使用lerp

这篇文章的观点和我的观点是一致的,再没看过此文之前,我并不能100%确认我想法的正确性,毕竟示例代码是Unity官方给出的。

实际上,我的项目不是基于Unity,而是基于公司自研的游戏引擎。

我的方法和链接英文提供的方法并不完全相同,以下为示例代码如下:

static f32 GetRotateScale(VEC3 speedDir,VEC3 eulerAngleLast,int dt,f32 rotateSpeed)
{ VEC3 eulerAngleCur = speedDir.getHorizontalAngle();
f32 deltaAngle = ABS(eulerAngleLast.getY() - eulerAngleCur.getY());
deltaAngle = fmod(deltaAngle, 360.f);
if (deltaAngle > 180.f) deltaAngle = 360 - deltaAngle; f32 scale = 1;
if (FLOAT_EQUALS_ZERO_ROUGH(deltaAngle))
scale = 1;
else scale = (dt / 1000.f) * rotateSpeed / deltaAngle;
if (scale > 1)
scale = 1;
return scale;
}

我解释一下函数参数。speeddir是指模型需要朝向的方向,euleranglelast是指当前模型朝向,dt就是deltaTime,rotateSpeed就是指给定的旋转速度。

函数返回值是0-1的比例。该值会传递给lerp做最终的角度旋转。

这个函数功能比较简单,根据角度差,旋转速度来设置scale,当scale等于1时,就会瞬间转到指定角度。每次旋转前需要获取下该次旋转需要的scale。

scale并不是简单的deltaTime * speed 这么简单。

总结

使用slerp可以做到完美的匀速旋转,但是并没有十分必要。实际上采用上述方法采用lerp,肉眼观察已感知不到转速的差异。

1)这是匀速旋转

2)你可以到达目标角度

3)和帧数是无关的

解决问题的方法有很多,每个人都可以有自己的想法。重要的是要先意识到问题的存在。

如何正确的使用Lerp In Unity的更多相关文章

  1. Unity模型导入的若干问题

    原地址:http://tieba.baidu.com/p/2807225555 我觉得有三点感觉在导出时比较重要的1.单位的设置3dsmax系统单位设置就设成厘米显示单位公制也设成厘米这样在max里的 ...

  2. 使用Unity制作游戏关卡的教程(一)

    转自: http://gamerboom.com/archives/74131 作者:Matthias Zarzecki 我正在制作<Looking For Group – The Fork O ...

  3. HoloLens开发手记 - 入门学习阶段总结

    伴随着数月的期待,终于拿到了预订的HoloLens开发者版本套件.随着VR/AR/MR技术的热潮,国内外均对它们的应用与盈利前景持有积极的预期,这也直接导致了国内外当前投资VR/AR/MR技术的热潮. ...

  4. Unity5.2如何使用VS调试

    今天不想使用Mono了,想用VS调试Unity,上百度搜了很久无果,VPN又连不上,结果搞两个小时没搞定.11点终于可以上谷歌了,十分钟搞定.由此可见,百度真的很坑爹...废话不多说下面上正文. 误区 ...

  5. Unity的Lerp函数实现缓动

    在Unity里面Lerp函数可以实现缓动效果 下面例子实现点光源的移动 在场景中创建好一个平面,一个点光源,我在这里随便放了一个模型. 然后新建c#脚本,代码如下: using UnityEngine ...

  6. unity linear space时 photoshop blend的正确设置

    gamma correction的dcc设置 ps在线性空间下工作 blend的时候颜色设置 勾选用灰度系数混合rgb 1.0 这样就是在线性空间下工作了 这样素材在数学上是正确的 r8g8b8a8格 ...

  7. Unity插值函数Lerp()与增量时间Time.deltatime

    一.Unity插值函数Lerp() 通过官方文档简单了解插值函数(https://docs.unity3d.com/ScriptReference/index.html),可以看到插值函数有很多 Ma ...

  8. a biped was detected but cannot be configured properly (Bipe导入Unity 无法正确识别)

    OP stated "I export the biped with 'animation' and 'bake animation' ticked and the correct fram ...

  9. Unity关于用LoadLevelAdditiveAsync导致新场景的Navmesh数据不正确Loading条的实践

    为了解决用Application.LoadLevelAdditiveAsync 导致新场景的Navmesh数据不正确(我们用的是4.63),我们现在loading条做法是先切到Loading的场景,然 ...

随机推荐

  1. HackerRank "Manasa and Prime game"

    Intuitive one to learn about Grundy basic :) Now every pile becomes a game, so we need to use Spragu ...

  2. LintCode "Heapify"

    My first try was, using partial sort to figure out numbers layer by layer in the heap.. it only fail ...

  3. 通过profile 用maven命令打不同配置的变量包

    profiles定义如下 <profiles>         <profile>             <id>local</id>         ...

  4. MySQL中order by中关于NULL值的排序问题

    MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的. 如果我们 ...

  5. 【maven】之开发pom配置常用插件

    1.打包跳过测试代码 <plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId&g ...

  6. Perl 模块 Getopt::Std 和 Getopt::Long

    示例程序: getopt.pl; 1 2 3 4 5 6 7 8 #!/usr/bin/perl -w #use strict; use Getopt::Std; use vars qw($opt_a ...

  7. 黄聪:WordPress 多站点建站教程(七):多站点函数

    1.get_blog_details(获取子站点信息) 返回多站点博客信息即wp_blogs表. //显示站点名称 $blog_details = get_blog_details(1); echo ...

  8. [jQuery]attr和prop的区别

    转自:http://www.cnblogs.com/Showshare/p/different-between-attr-and-prop.html 在高版本的jquery引入prop方法后,什么时候 ...

  9. qt上用opencv显示摄像头视频

    参考:http://blog.csdn.net/augusdi/article/details/8865541 代码如下: 注意,要在ui界面上放置一个“Vertical Layout”控件,调整到合 ...

  10. web.xml配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...