根据物体的位置将物体分类到正面或背面

时间:2014-05-24 13:52:31

标签: c++ sorting object direct3d scenegraph

我正在尝试正确地对我的renderables / actor进行排序,并注意到我有一些墙壁问题因为它们按照它们的中心点排序。因此,我在绘制它们之前对所有演员进行排序,具体取决于它们与插入排序相机的距离。在那之后,我试图确定是否应该在游戏场后面或前面绘制墙。为了解释这一点,游戏发生在6个飞机中的立方体内。因为我可以围绕那个立方体旋转相机,所以我需要进行分类,这将根据它将飞机放在前/后。所以这是一张图片,所以你知道我们在说什么:

enter image description here

你可以清楚地看到这些蛇前面发生的渲染事件。

好的,这是我目前的排序:

//list of Actors the abstract class which Wall and cube and so on extend
void Group::insertionSort(vector<Actor *> &actors)
{
    int j;

    for (int i = 1; i < actors.size(); i++)
    {
        Actor *val = actors[i];
        j = i - 1;

        while (j >= 0 && distanceToCamera(*actors[j]) < distanceToCamera(*val))
        {
            actors[j + 1] = actors[j];
            j = j - 1;
        }
        actors[j + 1] = val;
    }
}

float Group::distanceToCamera(Actor &a)
{
    float result = 0;
    XMVECTOR posActor = XMLoadFloat3(&a.getPosition()); //here i get the centerpoint of the object
    XMVECTOR posCamera = XMLoadFloat3(&m_camera->getPosition());
    XMVECTOR length = XMVector3Length(posCamera - posActor);
    XMStoreFloat(&result, length);
    return result;
}

要确定它是Wall我使用了类似dynamic_cast<Wall*>(val)的类型,但我根据此不能将它们放在向量的前面/后面。要记住对象返回其中心点。 任何人都可以以正确的方式引导我吗?

1 个答案:

答案 0 :(得分:1)

很难回答你的问题,因为这是一个复杂的系统,你在这里没有完全解释,你也应该在发布之前简化为更简单的事情。有可能你会在路上找到自己修复的方法。无论如何,我会做一些猜测...

现在,我要解决的第一件事就是排序算法。如果不深入分析它是否在所有情况下都能正常工作,我就把它抛出并使用std :: sort(),这既有效又不太可能包含错误。

在替换它时,你需要仔细考虑两个渲染对象之间的顺序:问题是什么时候需要在另一个对象之前绘制一个对象?您正在使用中心点到相机的距离。我不确定您是要对2D对象还是3D对象进行排序,但在这两种情况下,很容易找到不起作用的示例!例如,即使较小的正方形中心较近,也不会直接面对相机的大正方形可以覆盖较小的正方形。另一个问题是当两个物体相交时。类似地,对于3D对象,如果它们具有不同的大小或相交,则您的算法不起作用。如果你的对象都具有相同的大小并且它们不能相交,那么你应该没问题。

仍然,在这里我怀疑一个问题,可能是一个物体的表面和立方体网格的表面具有完全相同的位置。一种方法是稍微缩小对象或放大外部网格,以便顺序始终清晰。这也可以解决您遇到浮点舍入错误的问题。由于这些原因,两个在数学上没有订单的对象可能会根据情况最终处于不同的位置。这可能表现为它们在可见到覆盖之间闪烁,具体取决于摄像机角度。

最后一件事:我假设您想出于教育原因自己解决这个问题,对吗?否则,现有的渲染工具包就会浪费时间,甚至可以将所有计算工作卸载到图形硬件上。