从相机发出的射线

原文链接:从相机发出的射线
在[理解视锥]

(https://docs.unity3d.com/Manual/UnderstandingFrustum.html)部分中,解释了相机视图中每个点都对应世界空间中的一条线。对这条线进行数学表达有时候很有用,Unity使用Ray对象的形式提供这个功能。射线总是对应视图中的一个点,因此Camera类提供了ScreenPointToRayViewPointToRay函数。两者的区别是,ScreenPointToRay接收以像素形式提供的点坐标,而ViewportPointToRay接收归一化后的坐标(0代表视图的底部和左边,1代表视图的顶部和右边)。两者都返回一条射线,包含射线原点,和一个表示射线方向的向量。射线从近裁切平面发出,而不是相机的transform位置。

Raycasting

相机发出的射线最常见的用途,是向场景中进行raycast。raycast从原点沿着射线方向发出想象的“激光束”,直到碰到场景中的collider。碰撞物体的信息和碰撞点的信息会在一个RaycastHit对象中返回。这在根据屏幕上的图像来定位一个物体时非常有用。比如当前鼠标位置处的物体可以使用下面的代码确定:

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    public Camera camera;

    void Start(){
        RaycastHit hit;
        Ray ray = camera.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out hit)) {
            Transform objectHit = hit.transform;

            // Do something with the object that was hit by the raycast.
        }
    }
}

沿着一条射线移动相机

获取一个屏幕点对应的射线后,沿着射线移动相机的功能有时候很有用。比如说,想要根据用户当前选中的物体放大屏幕,同时保持物体固定在相同的屏幕位置(比如使用相机查看一个战术地图时也许有用)。实现这个功能的代码很简单:

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    public bool zooming;
    public float zoomSpeed;
    public Camera camera;

    void Update() {
        if (zooming) {
            Ray ray = camera.ScreenPointToRay(Input.mousePosition);
            float zoomDistance = zoomSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
            camera.transform.Translate(ray.direction * zoomDistance, Space.World);
        }
    }
}
Unity中,要实现点击事件并发送射线检测物体的功能,你可以按照以下步骤操作: 1. **创建场景**:首先,在Unity编辑器中创建一个新的场景,添加必要的游戏对象。 2. **添加UI元素**:创建一个UI Canvas,并为其添加一个RaycastEventData类型的脚本组件(如ClickRayCast),该组件将用于处理点击事件和存储射线信息。 3. **编写脚本**: - 在`ClickRayCast`脚本中,重写`OnPointerClick(PointerEventData eventData)`方法。这个方法会在用户点击屏幕时被调用。 - 在该方法内,通过`eventData.GetRay()`获取从点击位置到相机射线。 - 使用`Physics.Raycast(ray, out RaycastHit hit)`函数发射射线并检测是否击中了任何游戏对象。如果`hit.collider`不为空,说明找到了目标物体。 ```csharp using UnityEngine; using UnityEngine.UI; public class ClickRayCast : MonoBehaviour, IPointerClickHandler { public void OnPointerClick(PointerEventData eventData) { Ray ray = Camera.main.ScreenPointToRay(eventData.position); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { Debug.Log("Clicked on object: " + hit.collider.gameObject.name); // 这里可以进一步处理击中对象的操作,比如显示相关信息、触发交互等 } else { Debug.Log("No collision detected."); } } } ``` 4. **关联脚本**:在Canvas上添加一个UI元件(如Image或Text)作为点击触发器,然后将其`OnPointerClick`属性设置为你的`ClickRayCast`脚本实例。 5. **运行测试**:在Unity中构建并运行项目,点击Canvas上的区域,会看到控制台输出射线检测结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值