【问题标题】:How do I get a vector that faces away from (perpendicular from ) arbitrary terrain如何获得背离(垂直于)任意地形的矢量
【发布时间】:2023-01-20 06:34:44
【问题描述】:

像上图一样,我想放置一个物体,使其背对表面(我正在使用图形实例化来创建草)。我假设这将不得不对表面法线/光线投射做一些事情,但我不知道该怎么做。我正在使用 unity 和 c#,所以与此相关的答案会很棒。

我还没有真正解决这个问题,但我尝试旋转它以使其始终朝上,但这会导致很多剪裁和奇怪的行为。

【问题讨论】:

  • 您可以在您感兴趣的点向下投射到表面上,RaycastHit.normal 将包括表面法线。然后你可以将法线传递给Quaternion.LookRotation或一些类似的函数,瞧。
  • 你怎么画地形?它可能会影响最佳方法。
  • 这就是我的想法,但由于我在 GPU 上实例化了数千个草对象,我担心对所有这些对象使用光线投射会降低性能

标签: c# unity3d


【解决方案1】:

Unity 已经有解决方案的复杂问题。这是一个自动将其与法线对齐的脚本。我还添加了一个 LayerMask 选项,这样您就可以在检查时只点击正确的图层以及最大高度值。请记住从 Inspector 中设置两者。

public class NormalRotation : MonoBehaviour
{
    public float maxHeight = 2f;
    public LayerMask layer;
        
    void Update() => RotateTransformToNormal();
    
    void RotateTransformToNormal() => 
        transform.rotation = Quaternion.FromToRotation(transform.up, GetNormal()) * transform.rotation;
    
    Vector3 GetNormal()
    {
        // Raycast down from the transform
        Ray ray = new Ray(transform.position, Vector3.down);
        RaycastHit hit;
        
        if (Physics.Raycast(ray, out hit, maxHeight, layer))
        {
            return hit.normal;
        }
        
        return transform.up;
    }
}

【讨论】:

    猜你喜欢
    • 2016-12-16
    • 1970-01-01
    • 2021-04-23
    • 2019-05-31
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多