返回介绍

相机射线

发布于 2021-06-19 18:03:26 字数 1250 浏览 1063 评论 0 收藏 0

了解视锥体部分解释了相机视图中的任一点对应世界空间的一条线。有时有这条线的数学表示很有用,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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文