Я делаю игру, полностью сделанную из кубов. Я замечаю, что когда я иду вперед, он быстро горит, но если я поверную игрока в противоположном направлении, он будет падать медленно. Итак, то, что я сделал, упорядочивается на основе угла, но у меня все еще есть некоторые углы, которые немного медленны. Вот как я это сделал:Z геометрия упорядочения
Я в основном обратный итерации под определенными углами, но как я могу сделать это согласованным, чтобы каждый угол быстро осветлялся, некоторые из прямых углов, например 88-92 или 178-182, действительно медленный (overdraw).
Благодаря
SetPlayerPosition();
PlayerPosition.x -= 70;
PlayerPosition.y -= 20;
PlayerPosition.z -= 70;
collids.clear();
CBox* tmp;
float offset = -10;
if(Wrap(Camera.roty + offset) > 180 && Wrap(Camera.roty + offset) < 270)
{
for(int i = 140; i > 0; --i)
{
for(int j = 0; j < 40; ++j)
{
for(int k = 0; k < 140; ++k)
{
tmp = GetCube(PlayerPosition.x + i, PlayerPosition.y + j, PlayerPosition.z + k);
if(tmp != 0)
{
if(frustum.sphereInFrustum(tmp->center,25) != NULL)
{
collids.push_back(tmp);
}
}
}
}
}
}
else if(Wrap(Camera.roty + offset) > 0 && Wrap(Camera.roty + offset) < 90)
{
for(int i = 0; i < 140; ++i)
{
for(int j = 0; j < 40; ++j)
{
for(int k = 140; k > 0; --k)
{
tmp = GetCube(PlayerPosition.x + i, PlayerPosition.y + j, PlayerPosition.z + k);
if(tmp != 0)
{
if(frustum.sphereInFrustum(tmp->center,25) != NULL)
{
collids.push_back(tmp);
}
}
}
}
}
}
else if(Wrap(Camera.roty + offset) > 90 && Wrap(Camera.roty + offset) < 180)
{
for(int i = 0; i < 140; ++i)
{
for(int j = 0; j < 40; ++j)
{
for(int k = 0; k < 140; ++k)
{
tmp = GetCube(PlayerPosition.x + i, PlayerPosition.y + j, PlayerPosition.z + k);
if(tmp != 0)
{
if(frustum.sphereInFrustum(tmp->center,25) != NULL)
{
collids.push_back(tmp);
}
}
}
}
}
}
else if (Wrap(Camera.roty + offset) > 270 && Wrap(Camera.roty + offset) < 360)
{
for(int i = 140; i > 0; --i)
{
for(int j = 0; j < 40; ++j)
{
for(int k = 140; k > 0; --k)
{
tmp = GetCube(PlayerPosition.x + i, PlayerPosition.y + j, PlayerPosition.z + k);
if(tmp != 0)
{
if(frustum.sphereInFrustum(tmp->center,25) != NULL)
{
collids.push_back(tmp);
}
}
}
}
}
}
}