首页 > 解决方案 > 在统一 C# 中显示具有特定旋转的相机的完整对象

问题描述

我有不同类型的具有可变尺寸的对象,并且放置在场景中的不同位置。我想用硬编码旋转(北旋转)的相机聚焦/显示每个对象。与特定的相机旋转一样,我想将它完全显示到相机和屏幕中心的对象聚焦。出于这个原因,我写了这个代码片段 1

  1. 使用获取特定焦点对象后面的位置 TransformPoint

  2. 使用最大值提供高程extentbound以便显示对象的最大面积。

  3. 分配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;
    

但问题是,它不能准确地处理所有对象,因为每个对象都处于不同的位置和维度。我想使用相机聚焦整个对象,但不改变旋转。

标签: c#unity3d

解决方案


如果可以使用正交相机,则可以根据 GameObject 的属性动态orthographicSize设置相机。这可能是最简单的解决方案。sizebounds

如果您需要透视相机,您可以通过或获取Plane相机平截头体的 s 或角,并使用其中任何一个的结果来手动测试您是否完全在里面。GeometryUtility.CalculateFrustumPlanes(Camera.main)Camera.CalculateFrustumCornersBounds

使用透视相机,您还可以根据对象边界的大小和相机的 FOV 计算与对象的必要距离。如果我没记错的话,这将类似于distance = 0.5 * size / tan(0.5 * fov),但函数不必精确;它只需要为您的相机工作。或者,您可以保持距离不变并根据对象的大小计算 FOV,尽管我不建议这样做,因为频繁的 FOV 变化会让观看者感到迷惑;我的观点是有很多选择。


推荐阅读