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

这篇具有很好参考价值的文章主要介绍了【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。文章来源地址https://www.toymoban.com/news/detail-440923.html

到了这里,关于【Unity3d】【相机】透视相机UI转换(3DUI+保持屏幕比例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity3D小功能】Unity3D中实现点击‘文字’出现‘UI面板’

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 QQ群:398291828 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 宠粉博主又来了,今天有粉丝问我如何实现点击一段文字然后出现的面板在那段文字附近显示: 深入了

    2024年04月13日
    浏览(42)
  • unity3D之UI

    1.canvas介绍 (1)Canvas属于Unity的UGUI,UGUI提供了强大的可视化编辑,大大提高了GUI的开发效率。 (2)Canvas是所有UI组件的父物体,也就是说每一个UI组件都必须在Canvas下,作为Canvas的子物体,当你创建一个UI控件时,如果在Hierarchy下没有Canvas组件的话,Unity会帮你自动创建一个Canva

    2024年02月04日
    浏览(98)
  • 【Unity3D小功能】Unity3D中实现UI擦除效果、刮刮卡功能

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 使用Unity3D实现UI的擦拭效果、刮刮卡功能的效果实现方式比较多,比如说用Shader、Texture渲染都是可以

    2024年02月04日
    浏览(201)
  • 【Unity3D】UI Toolkit容器

    1 前言         UI Toolkit简介 中介绍了 UI Builder、样式属性、UQuery、Debugger,UI Toolkit元素 中介绍了 Label、Button、TextField、Toggle、Radio Button、Slider、Progress Bar、Dropdown、Foldout 等元素,UI Toolkit样式选择器 中介绍了简单选择器、复杂选择器、伪类选择器等样式选择器,本文将

    2024年02月09日
    浏览(38)
  • 【Unity3D】UI Toolkit简介

            UI Toolkit 是一种基于 Web 技术的 GUI 框架,是为了解决 UGUI 效率问题而设计的新一代 UI 系统(UGUI 的介绍详见→UGUI概述)。与 UGUI 不同,UI Toolkit 没有采用 GameObject 的方式,而是参考了 Web 技术的 XML 和 CSS 方案。这意味着它只保存变化的数据,而不是整个界面状态,

    2024年02月10日
    浏览(39)
  • 【Unity3D】UI Toolkit元素

    1 前言         UI Toolkit简介 中介绍了 UI Builder、样式属性、UQuery、Debugger,UI Toolkit容器 中介绍了 VisualElement、ScrollView、ListView、GroupBox 等容器,UI Toolkit样式选择器 中介绍了简单选择器、复杂选择器、伪类选择器等样式选择器,本文将介绍 UI Toolkit 中的元素,主要包含

    2024年02月09日
    浏览(36)
  • 使用Unity生成UI预制体 (Unity3D)

    在Unity中,预制体(Prefab)是一种非常有用的工具,用于生成可重复使用的UI元素。预制体使得UI的创建和管理变得更加简单和高效。在本文中,我们将详细介绍如何使用Unity生成UI预制体,并提供相应的源代码示例。 步骤1:创建UI元素 首先,我们需要创建UI元素,例如按钮、

    2024年02月05日
    浏览(42)
  • 【Unity3D】实现UI点击事件穿透

              注意:EventSystem.current.RaycastAll获取到的对象列表是能够接受事件的,假如你的按钮Button自己身上没有Image,而是Button的子物体有,那么你就要给这个子物体也加上标签Tag才能响应到。 如果ExecuteEvents.Execute不管用,可以试试ExecuteEvents.ExecuteHierarchy

    2024年02月04日
    浏览(34)
  • Unity3D制作一个会移动的方块(还不会移动照相机)

    学习 Unity3D 这么久了,如果你还不会制作一个按下 WASD 就可以移动的方块的话,那么你的学习将没有一点成就感,我学习的时候,我决定 先学习移动 ,这样我就会对 Unity 更加感兴趣,学习起来的动力会更为充足 先创建一个项目,名为move,如果你手头有一个随便乱用的项目

    2024年02月14日
    浏览(36)
  • Unity3D学习之UI系统——NGUI

    资源商店搜索 学习版自行搜索 导入即可 创建UI 创建NGUI后,挂载在UI Root 和其 子Camera的脚本 分辨率自适应模式的基础 3.1.1 分辨率概念 3.1.2 Root的作用 3.1.3 root脚本各组件 Minimun Height 和 Maximum Height 用于拖动窗口时,如果窗口变得很小了,UI不缩放的话,会挡住游戏,使用Flex

    2024年03月17日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包