为啥我的光线投射会击中错误的对象?

Posted

技术标签:

【中文标题】为啥我的光线投射会击中错误的对象?【英文标题】:Why is my raycast hitting the wrong object?为什么我的光线投射会击中错误的对象? 【发布时间】:2021-03-21 02:44:09 【问题描述】:

我正在尝试使用带有透视投影的相机在 3d Unity 环境中实现拖放功能。

以下代码应生成从当前鼠标(最终触摸)位置到屏幕上鼠标下方的对象的射线。

private Ray GenerateMouseRay()

    Vector3 mousePositionFar = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.farClipPlane);
    Vector3 mousePositionNear = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane);

    Vector3 positionNear = Camera.main.ScreenToWorldPoint(mousePositionNear);
    Vector3 positionFar = Camera.main.ScreenToWorldPoint(mousePositionFar);

    Ray mouseRay = new Ray(positionNear, positionFar - positionNear);

    return mouseRay;

在我的 Update 方法中,当检测到鼠标活动时,我会打印射线击中对象的名称和坐标。一旦我让光线正确投射,我将能够实现拖放功能。

// Update is called once per frame
void Update()

    //CalculatePosition();

    if (Input.GetMouseButtonDown(0))
    
        Ray mouseRay = GenerateMouseRay();
        RaycastHit hit;

        if(Physics.Raycast(mouseRay.origin, mouseRay.direction, out hit))
        
            hitObject = hit.transform.gameObject;
            objectPlane = new Plane(Camera.main.transform.forward * -1, hitObject.transform.position);

            Debug.Log(hitObject.name);
            Debug.Log(hitObject.transform.position.x + ", " + hitObject.transform.position.y + ", " + hitObject.transform.position.z);
        
    

预期输出: 播放器 13.57, -8.5, 6.07

实际输出: 海洋水域 .5536325, -1.1, 1.218224

感谢任何帮助。

【问题讨论】:

你的玩家需要一个对撞机才能让光线投射产生影响。是这样吗? 我在玩家对象上有一个刚体和一个碰撞器。 【参考方案1】:

通过在我的水上飞机上禁用碰撞来解决。

【讨论】:

您可能希望通过使用LayerMask in your Physics.Raycast call来限制您尝试与之交互的对象

以上是关于为啥我的光线投射会击中错误的对象?的主要内容,如果未能解决你的问题,请参考以下文章

正交相机和使用光线投射选择对象

我如何添加光线投射统一命中的对象并将它们添加到列表中

使用光线投射的对象拾取

用于在世界中放置对象时的光线投射抖动

在 Unity 中沿光线投射实例化预定义数量的对象

使用光线投射和实例化对象问题检查与多边形碰撞器的碰撞(统一)