我试图通过向下拍摄光线投射和将角色旋转与地面法线对齐来将我的角色与地面对齐。
下面是一个代码片段:
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;
}当我试图平滑这种旋转时,它似乎根本没有发生。
这就是我试图解释这些值的方式。
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是四元数类的一个类变量。
发布于 2018-05-15 22:47:48
尝试:
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%达到目标。
https://stackoverflow.com/questions/50351122
复制相似问题