视锥的基本理解

了解视锥

__视锥体__一词表示看起来像顶部切割后平行于底部的金字塔的实体形状。这是透视摄像机可以看到和渲染的区域的形状。以下思维实验应该有助于解释为什么会这样。

想象一下,将一根直杆(例如扫帚柄或一支铅笔)正对着摄像机,然后拍照。如果杆垂直于摄像机镜头保持在图片中心位置,那么只有其一端可在图片上显示为圆圈;所有其他部分都会被遮挡。如果将杆向上移动,下侧将开始变得可见,但可通过向上倾斜杆再次将其隐藏。如果继续向上移动杆并进一步将其向上倾斜,则圆形末端最终将到达图片的顶部边缘。此时,在世界空间中由此杆跟踪的界线上方的任何对象在图片上都不可见。

在这里插入图片描述

很容易将杆向左、向右或向下(或者水平和垂直方向的任何组合方式)移动或旋转。“隐藏”杆的角度仅取决于它在两个轴上距离屏幕中心的距离。

这一思维实验的意义在于,摄像机图像中的任何一点实际上都对应于世界空间中的一条线,在图像中只能看到这条线上的一个点。这条线上该位置背后的一切都会被遮挡。

图像的外边缘由对应于图像四个角的发散线界定。如果这些线向后追踪到摄像机,它们最终会聚合到同一个点。在 Unity 中,此点恰好位于摄像机的变换位置,也称为透视中心。从屏幕顶部和底部中心聚合到透视中心处的线所形成的角度称为视野(通常缩写为 FOV)。

如上所述,任何落在图像边缘的发散线之外的物体对摄像机而言均不可见,但是针对摄像机渲染的内容还有另外两个限制。近剪裁面和远剪裁面平行于摄像机的 XY 平面,两者沿中心线相隔一定的距离。比近剪裁面更靠近摄像机的任何对象以及比远裁剪面更远离摄像机的任何对象都不会被渲染。

在这里插入图片描述

图像的发散角线以及两个裁剪面定义了截头金字塔:视锥体。

原文连接:https://docs.unity3d.com/2020.3/Documentation/Manual/UnderstandingFrustum.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 相机视锥(Camera Frustum)是在计算机图形学中用于表示相机在三维空间中可见范围的几何形状。通过计算相机视锥代码,我们可以获得相机的射线方向和野范围,从而帮助我们进行可化渲染等操作。 以下是一个简单的计算相机视锥的代码示例: 1. 首先,我们需要获取相机的投影矩阵(projection matrix)和相机的图矩阵(view matrix),这两个矩阵通常由引擎或库提供。 2. 然后,我们可以使用这两个矩阵来计算相机视锥的六个面(near, far, left, right, top, bottom)。 3. 首先,我们需要将投影矩阵和图矩阵相乘,得到投影图矩阵(projection-view matrix)。 4. 接下来,我们使用逆转置矩阵的转置以及四个坐标分量计算各个面的法线和距离。根据相机视锥的特性,这些面的法线向量和距离可以帮助我们计算视锥的六个面的方程式。 5. 最后,我们可以将这些值存储在一个数据结构中,以供后续的计算和使用。 这只是计算相机视锥的一个简单示例,实际上,相机视锥的计算可能涉及更多复杂的操作和算法,我们需要考虑到相机的位置、方向、角等因素。 通过计算相机视锥,我们可以实现一些基于相机的功能和效果,比如裁剪不可见物体、实现可见性检测、绘制远近景物体等。这对于实现高性能的可化渲染是非常重要的。 ### 回答2: 相机视锥是指在计算机图形学中,用来确定在屏幕上显示的可见场景的范围。在3D图形渲染中,相机视锥由近裁剪面、远裁剪面、左裁剪面、右裁剪面、上裁剪面和下裁剪面六个平面组成,形成一个截锥体。计算相机视锥的代码通常需要用到图矩阵、投影矩阵和顶点坐标等信息。 一个简单的计算相机视锥的代码示例如下: 1. 定义图矩阵和投影矩阵。 ``` matrix4 viewMatrix = ...; matrix4 projectionMatrix = ...; ``` 2. 定义顶点坐标。 ``` vec3 vertex1 = ...; vec3 vertex2 = ...; ... ``` 3. 将顶点坐标变换到裁剪空间。 ``` vec4 clipVertex1 = projectionMatrix * viewMatrix * vec4(vertex1, 1.0); vec4 clipVertex2 = projectionMatrix * viewMatrix * vec4(vertex2, 1.0); ... ``` 4. 计算裁剪空间中的四个顶点(左下、左上、右下、右上)。 ``` vec4 bottomLeft = clipVertex1; vec4 topLeft = clipVertex2; vec4 bottomRight = clipVertex2; vec4 topRight = clipVertex1; ``` 5. 将裁剪空间中的顶点坐标变换到规范化设备坐标空间(NDC)。 ``` vec3 ndcVertex1 = bottomLeft.xyz / bottomLeft.w; vec3 ndcVertex2 = topLeft.xyz / topLeft.w; ... ``` 6. 计算相机视锥的近裁剪面、远裁剪面以及左、右、上、下裁剪面在规范化设备坐标空间中的位置。 ``` float nearPlane = ndcVertex1.z; float farPlane = -ndcVertex2.z; float leftPlane = ndcVertex1.x; float rightPlane = ndcVertex2.x; float bottomPlane = ndcVertex1.y; float topPlane = ndcVertex2.y; ``` 以上是一个简单的计算相机视锥的代码示例。一般来说,还可以根据需要添加更多功能,例如视锥的可体积、剔除不可见的物体等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值