首页 > 解决方案 > 计算相机位置以使所有对象都在视图中,并具有固定的相机旋转

问题描述

对于我的 3d 棋盘游戏,我正在尝试构建一个“查看整个棋盘”功能,该功能应该将相机移动到能够看到整个棋盘的位置,但不会改变相机的旋转。

现在,我试图获得包括所有感兴趣对象的最小和最大点,并使用这两个点来模拟它们周围的球体(通过以编程方式实际放置一个球体来可视化它),所以我现在就这样结束了: 球体的可视化

我目前的问题是,我无法建立一个数学公式来实际计算相机的位置以使整个球体都在视野中(记住:旋转必须保持不变)。

到目前为止,这是我的代码,用于查找最小点和最大点并通过构建球体来可视化它:

        // Find smallest and biggest point of all objects
        var p1 = new Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
        var p2 = new Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
 
        foreach (var gameObject in gameObjects)
        {
            foreach (var vertice in gameObject.GetComponent<MeshFilter>().sharedMesh.vertices)
            {
                var p = vertice + gameObject.transform.position;
 
                p1.x = Math.Min(p1.x, p.x);
                p1.y = Math.Min(p1.y, p.y);
                p1.z = Math.Min(p1.z, p.z);
 
                p2.x = Math.Max(p2.x, p.x);
                p2.y = Math.Max(p2.y, p.y);
                p2.z = Math.Max(p2.z, p.z);
            }
        }
 
        // Center of all objects
        var average = (p1 + p2) / 2;
 
        // Visualize by creating a sphere
        var diameter = Vector3.Distance(p1, p2);
        var sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = average;
        sphere.transform.localScale = new Vector3(diameter, diameter, diameter);

你能帮我用公式来实际计算我的相机的位置吗?

问候

标签: c#unity3dmathgraphics

解决方案


对于视锥体的每一侧,找到尽可能靠近场景的平行平面。这些平面中的每一个都应该只接触场景中的一个对象。

每对相对的平面将沿一条线相交。找到这两行。它们将是垂直的。

摄像机应位于离场景最远的那条线上,并且使另一条线穿过视场的中心。

在生成的视图中,一对相对的边只会接触场景中的一些对象,因为视锥体的对应边只会接触那些对象。在另一个维度中,对象将居中。


推荐阅读