查看: 1134|回复: 0
打印 上一主题 下一主题

[其他] Unity3D技术之相机使用技巧-相机射线浅析

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38266
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2015-1-31 20:11:43 |只看该作者 |倒序浏览
相机射线

了解视锥体部分解释了相机视图中的任一点对应世界空间的一条线。有时有这条线的数学表示很有用,Unity 会以射线 (Ray) 对象的形式提供。射线 (Ray) 始终对应视图中的一个点,所以相机 (Camera) 类提供了 ScreenPointToRay 和 ViewportPointToRay 函数。两者的区别在于 ScreenPointToRay 将该点作为一个像素坐标点,而 ViewportPointToRay 采用 0..1 的标准坐标(0 表示视图底部或左边,1 表示视图顶部或右边)。每种函数返回射线 (Ray),该射线包含一个起点和表示从起点开始线条方向的矢量。射线 (Ray) 源自近端裁剪平面,而非相机 (Camera) 的 transform.position 点。

光线投射

相机射线 (Ray) 最常用于执行 光线投射 (raycast) 到场景中。光线投射 (raycast) 发出一个虚拟“激光束 (laser beam)”,从射线起点开始沿着射线方向,直至触及场景中的碰撞体。之后返回有关对象和 RaycastHit 对象上被触及的点的信息。这是根据屏幕图像找到对象的有用方法。例如,鼠标位置的对象可由下列代码确定:-
  1. var hit: RaycastHit;
  2. var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);

  3. if (Physics.Raycast(ray, hit)) {
  4.         var objectHit: Transform = hit.transform;

  5.         // Do something with the object that was hit by the raycast.
  6. }
复制代码
沿着一条射线移动相机

有时有一条射线对应屏幕位置很有用,可沿着这条射线移动相机。例如,您可能想让用户用鼠标选择一个对象,然后放大并将其“固定”到鼠标下的相同屏幕位置(当相机对准战术图等时比较有用)。完成该任务的代码非常简单:-
  1. var zooming: boolean;
  2. var zoomSpeed: float;

  3. if (zooming) {
  4.         var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);
  5.         zoomDistance = zoomSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
  6.         camera.transform.Translate(ray.direction * zoomDistance, Space.World);
  7. }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-5-2 10:21 , Processed in 0.081594 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部