我正在尝试正确排序我的可渲染对象/演员,并注意到我在墙壁上遇到了一些问题,因为它们是按中心点排序的。因此,我在绘制所有演员之前,根据他们与相机的距离,使用插入排序对他们进行排序。在那之后,我试图确定墙应该画在比赛场地的后面还是前面。为了解释这一点,游戏发生在一个由 6 个平面组成的立方体内。因为我可以围绕那个立方体旋转相机,所以我需要一个排序,根据这个排序将飞机放在前面/后面。所以这是一张图片,所以你知道我们在说什么:
你可以清楚地看到在那种蛇的前面发生了什么。
好的,这是我目前的排序:
//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)
但我没有将它们放在矢量的前面/后面,这取决于它。要记住对象返回它们的中心点。谁能引导我走向正确的道路?