首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Quaternion.Lerp平滑旋转

使用Quaternion.Lerp平滑旋转
EN

Stack Overflow用户
提问于 2018-05-15 21:10:46
回答 1查看 1.1K关注 0票数 0

我试图通过向下拍摄光线投射和将角色旋转与地面法线对齐来将我的角色与地面对齐。

下面是一个代码片段:

代码语言:javascript
复制
RaycastHit hit;
Vector3 ray = transform.TransformDirection(Vector3.down);

if(Physics.Raycast(transform.position, ray, out hit)) {
    transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.rotation;
}

当我试图平滑这种旋转时,它似乎根本没有发生。

这就是我试图解释这些值的方式。

代码语言:javascript
复制
RaycastHit hit;
Vector3 ray = transform.TransformDirection(Vector3.down);

if(Physics.Raycast(transform.position, ray, out hit)) {
    quatTargetRotation = Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.rotation;
    transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.FromToRotation(Vector3.up, hit.normal), 0.5f * Time.deltaTime);
}

quatTargetRotation是四元数类的一个类变量。

EN

回答 1

Stack Overflow用户

发布于 2018-05-15 22:47:48

尝试:

代码语言:javascript
复制
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(hit.normal), 0.5f);

看起来您正在使用, 0.5f * Time.deltaTime);作为t参数。

0.5f * Time.deltaTime将在某个较小的值处抖动,每一帧都不同。

创建一个在Update()调用中幸存的计时器变量。例如,一个public float timer = 0f;。然后像timer += Time.deltaTime一样增加该值。

替代方法:使用像0.5f这样的常量值-这将在每次调用时旋转50%的差值。当然,这种差异会缩小。因此,旋转速度将会减慢(可能需要平滑旋转),但永远不会100%达到目标。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50351122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档