c# - 在统一 C# 中显示具有特定旋转的相机的完整对象
问题描述
我有不同类型的具有可变尺寸的对象,并且放置在场景中的不同位置。我想用硬编码旋转(北旋转)的相机聚焦/显示每个对象。与特定的相机旋转一样,我想将它完全显示到相机和屏幕中心的对象聚焦。出于这个原因,我写了这个代码片段 1
使用获取特定焦点对象后面的位置
TransformPoint
使用最大值提供高程
extent
,bound
以便显示对象的最大面积。分配
position
和固定rotation
Vector3 dest = destination.transform.TransformPoint(0, 0, behindPositionDistance);// GetBehindPosition(destination.transform, behindPositionDistance, elevation); Debug.Log(dest); float eleveMax = Mathf.Max(destination.GetComponent<MeshRenderer>().bounds.extents.x, destination.GetComponent<MeshRenderer>().bounds.extents.z); dest = new Vector3(dest.x, eleveMax, dest.z); camera.transform.position = dest; camera.transform.rotation = lookNorth;
但问题是,它不能准确地处理所有对象,因为每个对象都处于不同的位置和维度。我想使用相机聚焦整个对象,但不改变旋转。
解决方案
如果可以使用正交相机,则可以根据 GameObject 的属性动态orthographicSize
设置相机。这可能是最简单的解决方案。size
bounds
如果您需要透视相机,您可以通过或获取Plane
相机平截头体的 s 或角,并使用其中任何一个的结果来手动测试您是否完全在里面。GeometryUtility.CalculateFrustumPlanes(Camera.main)
Camera.CalculateFrustumCorners
Bounds
使用透视相机,您还可以根据对象边界的大小和相机的 FOV 计算与对象的必要距离。如果我没记错的话,这将类似于distance = 0.5 * size / tan(0.5 * fov)
,但函数不必精确;它只需要为您的相机工作。或者,您可以保持距离不变并根据对象的大小计算 FOV,尽管我不建议这样做,因为频繁的 FOV 变化会让观看者感到迷惑;我的观点是有很多选择。
推荐阅读
- javascript - 为什么我的 IIS 上的 nodejs 应用程序因为 os.userInfo() 而崩溃?
- php - 如何从在 url 中传递的 id 中获取名称,并将其作为隐藏值传递给 laravel 刀片中的另一个视图中的另一个表单?
- python - python discord bot,discord.ext.commands.errors.MissingRequiredArgument:数字是缺少的必需参数
- asp.net-mvc-4 - Edge:Asp.Net MVC 应用程序不再在 window.open() 上转发凭据(在 Internet Explorer 11 中工作)
- flutter - 将地图项添加到模型中的地图变量
- substrate - 如何安装基板验证器组托盘
- python - 在python中将数据框转换为分层字典
- google-apps-script - 用于更新 id = 1000 行上的电子表格单元格的宏 URL 链接
- python - Python Tkinter 网格设置
- java - “插入忽略”或“重复键更新”使用 @Query 和 @Modifying 而不使用 nativeQuery 或 save() 或 saveAndFlush() JPA Hibernate