相机射线
了解视锥体部分解释了相机视图中的任一点对应世界空间的一条线。有时有这条线的数学表示很有用,Unity 会以射线 (Ray) 对象的形式提供 。射线 (Ray) 始终对应视图中的一个点,所以相机 (Camera) 类提供 了 ScreenPointToRay 和 ViewportPointToRay 函数。两者的区别在于 ScreenPointToRay 将该点作为一个像素坐标点,而 ViewportPointToRay 采用 0..1 的标准坐标(0 表示视图底部或左边,1 表示视图顶部或右边)。每种函数返回射线 (Ray),该射线包含一个起点和表示从起点开始线条方向的矢量。射线 (Ray) 源自近端裁剪平面,而非相机 (Camera) 的 transform.position 点。
光线投射
相机射线 (Ray) 最常用于执行 光线投射 (raycast) 到场景中。光线投射 (raycast) 发出一个虚拟“激光束 (laser beam)”,从射线起点开始沿着射线方向,直至触及场景中的碰撞体。之后返回有关对象和 RaycastHit 对象上被触及的点的信息。这是根据屏幕图像找到对象的有用方法。例如,鼠标位置的对象可由下列代码确定:-
var hit: RaycastHit;var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, hit)) {var objectHit: Transform = hit.transform;// Do something with the object that was hit by the raycast.}
沿着一条射线移动相机
有时有一条射线对应屏幕位置很有用,可沿着这条射线移动相机。例如,您可能想让用户用鼠标选择一个对象,然后放大并将其“固定”到鼠标下的相同屏幕位置(当相机对准战术图等时比较有用)。完成该任务的代码非常简单:-
var zooming: boolean;var zoomSpeed: float;if (zooming) {var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);zoomDistance = zoomSpeed * Input.GetAxis("Vertical") * Time.deltaTime;camera.transform.Translate(ray.direction * zoomDistance, Space.World);},