我如何用固定大小的立方体填充相机的视锥?

问题描述 投票:0回答:1

我相信这将是梯形(相机的视锥)的packing problem。我想用固定大小的立方体填充整个相机的视锥。每次移动相机时,我都需要一组适合于相机视锥中的立方体。

[我最初的想法是创建一个从起始点p=(0,0,0)开始循环的大量(大于世界大小的)立方体,将p设为立方体的中心,如果大小为2,则将p2=(2,0,0)放置为下一个立方体的中心点,p3=(0,2,0)代表第三个立方体,依此类推...问题在于,我会在场景中添加比实际所需数量更多的多维数据集,并且每次移动相机时,我都必须遍历所有多维数据集以检查它们是否相交或包含在相机的视锥中。 ,我相信这种方法可能会非常昂贵。

我该怎么做,有没有更聪明的方法?

附带说明,如果包装问题可以用尺寸可变的3D四边形完成,那么解决这个问题会更容易吗?以及如何做?

math three.js 3d geometry frustum
1个回答
0
投票

生成每层长方体的非常简单的方法是在相机空间中创建长方体,然后使用逆视图矩阵将它们转换为世界空间。要获取相机空间的长方体,可以对一个简单的透视相机执行以下操作:

tanFovy = Math.tan(fovy / 2) //fovy is the vertical field of view
for i from 0 to noOfLayers (exclusive)
    depthFront = znear + i * (zfar - znear) / noOfLayers
    depthBack  = znear + (i + 1) * (zfar - znear) / noOfLayers
    halfHeight = tanFovy * depthBack
    halfWidth  = halfHeight * aspectRatio
    create a new cuboid with the corners
        (-halfWidth, -halfHeight, depthFront),
        ( halfWidth, -halfHeight, depthFront),
        (-halfWidth,  halfHeight, depthFront),
        ( halfWidth,  halfHeight, depthFront), 
        (-halfWidth, -halfHeight, depthBack),
        ( halfWidth, -halfHeight, depthBack),
        (-halfWidth,  halfHeight, depthBack),
        ( halfWidth,  halfHeight, depthBack)

最后,通过计算inv(viewMatrix) * cornerCoordinate变换长方体。在那里,您的长方体充满了平截头体。

一种替代方法是在剪辑空间中生成图层,这些图层只是单位多维数据集的切片。使用反投影矩阵将它们转换为相机空间,校正正面的宽度和高度(以确保它们是长方体),然后如上所述继续进行。这将更通用,因为它可以适应您的相机模型,但是您会得到不同的图层深度。我以为你不想那样。因此,上述方法。

© www.soinside.com 2019 - 2024. All rights reserved.