从面法线检索对象旋转

Retrieve object rotation from face normal

我想旋转一个物体以匹配它的地面。所以我投射了 3 条光线(在角落处)来计算下方平面的法线。 现在我需要相应地旋转对象但保持 y 旋转(因此它“面向”哪个方向)所以仅设置 transform.up = normal 不起作用。 我以为我可以只使用变换方向之间的点积来旋转它(所以 xRotation = Vector3.Dot(normal, transform.forward) 代表 x 和 zRotation = Vector3.Dot(normal, transform.right) 代表 z)这应该是法向量和 right/forward 之间的角度向量。但是结果我的对象只是面向天空的想法是完全错误的。 你知道我应该怎么做吗?

这是您问题的解决方案。虽然有不同的方法可以做到这一点,但我个人认为最好使用 Cross 轴。事实上,您需要 Vector3.Cross 而不是 Vector3.Dot。此代码的工作方式是,通过将玩家的 transform.right 乘以地面法向量,​​由于此轴计算的是垂直方向,因此您可以期望它给出与地面对应的前向。

public LayerMask groundLayer; // The Layer Ground
public Vector3 offset = Vector3.up;

private void Update()
{
    if (Physics.Raycast(transform.position, Vector3.down, out var groundHit, 2f, groundLayer.value))
    {
        var cross = Vector3.Cross(transform.right, groundHit.normal);

        var _lookRotation = Quaternion.LookRotation(cross, groundHit.normal);

        transform.position = groundHit.point + offset; // the offset is OPTIONAL, you can adjust it manuel or remove

        transform.rotation = _lookRotation;
    }   
}

结果:

您可以在下面看到结果。考虑你可以删除偏移代码并使其与地面兼容 CharacterControllerRigidbody.

等机制