如何解决计算摄像机位置,以固定的摄像机旋转角度查看所有对象
对于我的3D棋盘游戏,我试图构建一个“查看整个棋盘”功能,该功能应将摄像机移动到可以看到整个棋盘的位置,而无需改变摄像机的旋转角度。
就目前而言,我试图获取包含所有感兴趣对象的最小和最大点,并使用这两个点模拟围绕它们的球体(通过在程序中实际放置一个球体对其进行可视化),所以我最终像现在: Visualization of the sphere
我目前的问题是,我无法建立一个数学公式来实际计算摄像机的位置以查看整个球体(请记住:旋转必须保持不变)。
到目前为止,这是我的代码,用于找到较小的点和最大的点并通过构建球体使其可视化:
// 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);
您能帮我提供公式来实际计算相机的位置吗?
致谢
解决方法
最简单的方法是将带有或不带有代码的摄像机移回原位。只需使用游戏视图来检查球体是否在视线内。如果您明白了这一点,则可以将其保留在此处或使用代码来做到这一点:
Vector3 camPos;
//define the camera position in the inspector!
private void Start()
{
transform.position = camPos;
}
,
对于视锥面的每一侧,找到尽可能靠近场景的平行平面。这些平面中的每一个都应该仅触摸场景中的一个对象。
每对相对的平面将沿一条线相交。找到这两行。它们将是垂直的。
相机应位于距场景最远的那条线上,以便另一条线穿过视场的中心。
在生成的视图中,一对相对的侧面将仅接触场景中的某些对象,因为视图视锥的相应侧面将仅接触那些对象。在另一个维度上,对象将居中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。