【Unity3d】【相机】透视相机UI转换(3DUI+保持屏幕比例)

0. 基础知识点

  1. 正交相机
    正交相机的的orthographicSize ,是 二分之一的屏幕高度,即 orthographicSize = H/2。

  2. 透视相机
    相机的aspect为相机的视口的宽高比: aspect = W/H
    即: W = H * aspect
    透视相机的屏幕高度H 随着相机的中心距离和fov变化。公式为:
    H = distance * tan(fov*0.5) * 2

  3. 相机视口尺寸和屏幕分辨率

  4. 相机的宽高比aspect 等于 屏幕的 宽高比

  5. 当视口尺寸高度为H时,屏幕的高度为ScreenH,则可获得比例 PixelsPerSize = ScreenH / H

  6. Unity3d中,Sprite 的设置选项 Pixels Per Unit = 100,表示sprite的一个单位代表100像素。

  7. 因此,当设置正交相机渲染Sprite,若SpriteSize = ScreenSize时,正好将屏幕盖上,则有:
    SpriteSize.H * PixelsPerUnit = ScreenSize.H = orthSize*2 * PixelsPerUnit

因此得到:orthSize = ScreenSize.H / PixelsPerUnit / 2
此时,Sprite scale = 1的时候,就与UGUI相机渲染的结果一致。

1. 整合转换:

当需要物体在正交相机中的大小与在透视相机中的大小相同时,以正交相机中的显示大小为基础(eg.UI相机中的显示)

  • 方法1.0:在透视相机中移动物体的位置,来保证同样的显示大小。 (近大远小的原理)
    原理: 保证透视相机中的尺寸与正交相机的尺寸相同:
    即: H(透视) = H (正交)
    则:H(正交) = H(透视) = distance * tan(fov * 0.5) * 2 ,
    得到,在透视相机中,此物体应该距离相机 distance = H(正交)/ (tan(fov * 0.5) * 2).
    其中H(正交)= orthSize*2。
  • 方法1.1:由方法1.0可以知道,H与距离和fov都有关系。因此也可以单独修改fov,或者**同时修改distance和fov,**以得到相同的结果:
    • tan(fov*0.5) = H/(distance * 2) = orthSize * 2 /(distance * 2) = orthSize / distance
    • fov = Atan(orthSize / distance) / 0.5 = Atan(orthSize / distance) *2。
  • 方法2:在透视相机中,进行缩放,以保证显示同样的大小。
    1. 首先,需要获取在透视相机中,与在UI相机中相同比例时,与透视相机的距离和透视相机的fov,作为标准:
      标准时: scale = 1 时,得到 distance(0) 和 fov(0)。
      • 若标准尺寸安装UGUI的尺寸来计算,根据 [0.3.相机视口尺寸和屏幕分辨率] 中原理可以得到:
        • 实际的正交相机 orthSize = Screen.H /100 *0.5
        • H(正交)= distance (tan(fov0.5)*2)= orthSize *2
        • 所以,得到 distance * tan(fov*0.5) = Screen.H /100
        • 若fov固定,则可以得到distance
        • 若distance固定,则可以得到fov
        • 也可以获取distance * tan(fov*0.5) 的值,作为后面的计算。
        • (令 DXF = distance * tan(fov0.5) )(DXF: Distance x tan(Fov0.5f)
          由相机视口尺寸 H = distance * tan(fov*0.5) * 2 得到,
          H(x) = distance(x) * tan(fov(x)*0.5) *2
          所以,当distance和fov变化后,变化的比例为:
          S(x) = H(x)/ H(0)
          = distance(x) * tan(fov(x)*0.5) *2 /(distance(0)*tan(fov(0)*0.5)*2)
          = distance(x)*tan(fov(x)*0.5) / ( distance(0) * tan(fov(0)*0.5) )
          = DXF(x) / DXF(0)
          所在x时候的Scale(x) = scale(0) * S(x) ,即为放大后的比例。
    • 当fov不变的时候,简化为:
      S(x) = distance(x) / distance(0)

2. 注意:物体与透视相机的距离

  1. 普通情况下,物体与透视相机的距离向量为 deltaVec = camTr.position - tr.postion
  2. 但是,在计算透视相机中物体的缩放时,应当使用到物体在透视平接头中的平面距离:
    1. projDistance =Abs( Vector3.Dot(deltaVec,camTr.forward) )

3. 其他: 透视相机中,物体永远朝向相机:

设置 tr.transform.forward = camTr.forward。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Unity是一款强大的跨平台开发引擎,可以用于制作各种类型的游戏和交互应用程序。其中的2D UI3D场景功能是Unity中的两个核心特性。 2D UI即2D用户界面,可以在游戏或应用程序中创建各种交互元素,如按钮、文本框、滑块等。通过UnityUI系统,我们可以轻松地设计和布局用户界面,使其适应不同屏幕大小和分辨率。可以根据需求添加各种转换效果和动画,使界面更加生动和吸引人。 3D场景是Unity中的另一个重要功能,可以创建逼真的三维环境。开发者可以利用Unity的编辑器工具导入和编辑各种3D模型,如建筑物、道具、角色等。还可以添加光源、投影和特效来增强场景的真实感。在3D场景中,我们可以自由移动摄像机,探索虚拟世界的各个角落,并与其中的对象进行交互。 Unity的2D UI3D场景功能可以结合使用,使得游戏或应用程序更加丰富和有趣。例如,在一个3D游戏中,可以使用2D UI来设计游戏菜单、积分板和任务提示等界面元素。通过2D UI可以方便地与玩家进行交互和显示游戏信息。而3D场景则提供了一个沉浸式的游戏世界,让玩家感受到身临其境的体验。 总之,Unity的2D UI3D场景功能为开发者提供了丰富多样的设计元素和交互方式。无论是开发2D游戏、3D游戏还是其他类型的应用程序,这些功能都能够给用户带来极佳的使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

延澈左

小小心意

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值