【问题标题】:Display complete object from camera with specific rotation in unity C#在统一 C# 中显示具有特定旋转的相机的完整对象
【发布时间】:2019-05-21 20:50:24
【问题描述】:

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

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

  2. 使用bound 中最大的extent 提供高程,以便显示对象的最大面积。

  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;
    

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

【问题讨论】:

  • 您可以只在摄像机 fov 的外部边界处对与对象的交点进行光线追踪。如果没有交集,则对象是完全可见的。我认为这将是一种更安全的方式来实现您想要的结果。

标签: c# unity3d


【解决方案1】:

也许创建一个空的游戏对象作为你的对象的子对象。在运行时将其用作您的相机位置。

【讨论】:

    【解决方案2】:

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

    如果您需要透视相机,您可以通过GeometryUtility.CalculateFrustumPlanes(Camera.main)Camera.CalculateFrustumCorners 获取相机平截头体的Planes 或角,并使用两者的结果手动测试您的Bounds 是否完全在里面。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 2015-02-07
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      相关资源
      最近更新 更多