0

我正在开发一款 XNA 风格的“MinecraftGame”小游戏。

因为有很多立方体要绘制。我创建了一个函数,只允许你在相机前绘制立方体!但问题是,如果一个立方体在我的视野中没有完全充满,它就不会被绘制出来。正如您在下面的“屏幕截图”中看到的那样。不绘制位于边缘的立方体。如何绘制完全和部分显示在镜头前的立方体?而且不仅完全。

非常感谢

这是我检查 Frustum 是否包含模型的代码:

//Initialize frustum
private void GenerateFrustum()
{
    Matrix viewProjection = View * Projection;
    Frustum = new BoundingFrustum(viewProjection);
}

//private void UpdateFrustum
{
    Matrix viewProjection = View * Projection;
    Frustum.Matrix = viewProjection;
}

//Function that will add models instantiated in the transformation matrix only if the    model is in the field of view !
private udpateTransformModelInstancied()
{
     for (int i = 0; i < ListInstance.Count; i++)
     {
         if(camera.Frustum.Contains(ListInstance[i].Transform.Translation) != ContainmentType.Disjoint)
         {
               instanceTransforms.Add(ListInstance[i].Transform);
         }

      }
 .......
}

截图: 在此处输入图像描述

4

3 回答 3

3

您正在检查立方体的位置。这意味着您没有考虑立方体的物理尺寸;您将它们视为一个点,如果该点不在视野范围内,那么您将不会渲染它。您需要做的是检查立方体的任何部分是否可见。两种最简单的方法是计算一个边界形状并使用它来检查,或者检查您的视图是否包含立方体的任何角点,而不仅仅是它的位置点。

于 2013-03-13T12:58:48.310 回答
1

据我所知,您只是在检查每个立方体的位置。最有效的解决方法是制作一个完全包含您的立方体之一的 BoundingSphere,将其转换为立方体位置并使用该球体而不是位置完成 Frustum.Contains :)

还; 使球体比考虑平截头体边缘所需的稍大一点。记住;如果你想制作一个我的世界克隆,你将需要使用某种批量渲染技术。我建议使用实例缓冲区,因为发送到 GPU 的数据会更少,而且更容易实现。

于 2013-03-13T12:54:03.407 回答
1

测试立方体边界结构的包容性而不是立方体的位置会起作用,但这会增加游戏的复杂性,因为需要管理一堆边界结构以及测试边界结构而不是点的数学。如果您需要其他东西的边界结构,那就走那条路。但如果不是,那么我将简单地获取立方体的位置,确定立方体宽度左侧或右侧的点并测试这些点。如果其中任何一个是“在”,则绘制立方体。

Vector3 leftRightVector = Matrix.Transpose(view).Right;//calc once for each frame(or only when camera rotates)

Vestor3 testPoint1 = cubePosition + (leftRightVector * maxCubeWidth);//calc for each cube
Vestor3 testPoint2 = cubePosition + (leftRightVector * -maxCubeWidth);
if(frustum.Contains(testPoint1 || testPoint2)
{
  //draw
}
于 2013-03-13T13:26:21.403 回答