Camera.main.ScreenToWorldPoint(Input.mousePosition) 和 ray.GetPoint(distance) 的区别

在Unity开发中,Camera.main.ScreenToWorldPoint(Input.mousePosition) 和 ray.GetPoint(distance) 的结果通常是不同的。

  1. Camera.main.ScreenToWorldPoint(Input.mousePosition) 将屏幕坐标(鼠标位置)转换为世界坐标。这个转换是基于相机的近平面和远平面之间的线性插值,返回的是一个三维世界坐标点。

  2. ray.GetPoint(distance) 是通过射线(从相机到屏幕点的射线)和某个平面(在这个例子中是 Plane 对象)的交点来计算的。这个点是射线在给定距离上的点。

具体来说,Camera.main.ScreenToWorldPoint(Input.mousePosition) 返回的是一个点,这个点是鼠标位置在相机近平面和远平面之间的插值点。而 ray.GetPoint(distance) 返回的是射线与平面相交的点。

因此,pos 和 ray.GetPoint(distance) 通常不会相同,除非你特意设置了一个平面使得射线与平面的交点正好是 Camera.main.ScreenToWorldPoint(Input.mousePosition) 的结果。

以下是一个简单的Unity脚本示例,展示了如何使用这两种方法:

csharp

复制

using UnityEngine;

public class MousePositionExample : MonoBehaviour
{
    void Update()
    {
        // 获取鼠标在屏幕上的位置
        Vector3 mouseScreenPosition = Input.mousePosition;

        // 将屏幕坐标转换为世界坐标
        Vector3 pos = Camera.main.ScreenToWorldPoint(mouseScreenPosition);

        // 创建一条从相机到屏幕点的射线
        Ray ray = Camera.main.ScreenPointToRay(mouseScreenPosition);

        // 创建一个平面,法线方向为向上,通过原点
        Plane plane = new Plane(Vector3.up, Vector3.zero);

        // 检查射线是否与平面相交
        if (plane.Raycast(ray, out float distance))
        {
            // 获取射线与平面相交的点
            Vector3 intersectionPoint = ray.GetPoint(distance);

            // 打印两个点的坐标
            Debug.Log("ScreenToWorldPoint: " + pos);
            Debug.Log("Raycast Intersection: " + intersectionPoint);
        }
    }
}

在这个示例中,pos 和 intersectionPoint 的值通常是不同的,除非你特意设置了一个平面使得射线与平面的交点正好是 Camera.main.ScreenToWorldPoint(Input.mousePosition) 的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值