Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Z序几何_C++_C_Opengl_Rendering - Fatal编程技术网

C++ Z序几何

C++ Z序几何,c++,c,opengl,rendering,C++,C,Opengl,Rendering,我正在制作一个完全由立方体组成的游戏。我注意到,当我向前走的时候,它跑得很快,但是如果我把播放器向相反的方向旋转,它的速度会非常慢。所以我所做的是根据角度排序的,但我仍然得到一些角度有点慢。我是这样做的: 我基本上是在某些角度进行反向迭代,但如何使其一致,使每个角度都变快,一些直线角度,如88-92或178-182,非常慢(超速) 谢谢 SetPlayerPosition(); PlayerPosition.x -= 70; PlayerPosition.y -= 20; PlayerP

我正在制作一个完全由立方体组成的游戏。我注意到,当我向前走的时候,它跑得很快,但是如果我把播放器向相反的方向旋转,它的速度会非常慢。所以我所做的是根据角度排序的,但我仍然得到一些角度有点慢。我是这样做的:

我基本上是在某些角度进行反向迭代,但如何使其一致,使每个角度都变快,一些直线角度,如88-92或178-182,非常慢(超速)

谢谢

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);
                    }
                }

            }
        }
    }
}


}
SetPlayerPosition();
PlayerPosition.x-=70;
玩家位置y-=20;
播放位置z-=70;
collids.clear();
CBox*tmp;
浮动偏移量=-10;
如果(包裹(Camera.roty+偏移量)>180和包裹(Camera.roty+偏移量)<270)
{
对于(int i=140;i>0;--i)
{
对于(int j=0;j<40;++j)
{
对于(int k=0;k<140;++k)
{
tmp=GetCube(PlayerPosition.x+i,PlayerPosition.y+j,PlayerPosition.z+k);
如果(tmp!=0)
{
如果(平截头体球壳(tmp->center,25)!=NULL)
{
碰撞。推回(tmp);
}
}
}
}
}
}
否则如果(包裹(Camera.roty+偏移量)>0和包裹(Camera.roty+偏移量)<90)
{
对于(int i=0;i<140;++i)
{
对于(int j=0;j<40;++j)
{
对于(int k=140;k>0;--k)
{
tmp=GetCube(PlayerPosition.x+i,PlayerPosition.y+j,PlayerPosition.z+k);
如果(tmp!=0)
{
如果(平截头体球壳(tmp->center,25)!=NULL)
{
碰撞。推回(tmp);
}
}
}
}
}
}
否则,如果(包裹(Camera.roty+偏移量)>90和包裹(Camera.roty+偏移量)<180)
{
对于(int i=0;i<140;++i)
{
对于(int j=0;j<40;++j)
{
对于(int k=0;k<140;++k)
{
tmp=GetCube(PlayerPosition.x+i,PlayerPosition.y+j,PlayerPosition.z+k);
如果(tmp!=0)
{
如果(平截头体球壳(tmp->center,25)!=NULL)
{
碰撞。推回(tmp);
}
}
}
}
}
}
否则如果(包裹(Camera.roty+偏移量)>270和包裹(Camera.roty+偏移量)<360)
{
对于(int i=140;i>0;--i)
{
对于(int j=0;j<40;++j)
{
对于(int k=140;k>0;--k)
{
tmp=GetCube(PlayerPosition.x+i,PlayerPosition.y+j,PlayerPosition.z+k);
如果(tmp!=0)
{
如果(平截头体球壳(tmp->center,25)!=NULL)
{
碰撞。推回(tmp);
}
}
}
}
}
}
}
Yikes

在不知道GetCube正在做什么的情况下,我无法猜测它是如何影响您的性能的,但很清楚为什么事情会如此显著地放缓。你在做很多不必要的工作

您只需采取不同的方法即可消除大部分循环:忽略角度,并进行更简化的测试。对于
i
j
k
的任何值,如果它在“播放器”后面标记一个立方体,请不要执行任何操作。仅此一项就可以平衡帧率并简化循环。(您不需要四组不同的嵌套循环!)

更好的方法是,使用空间图(类似八叉树或kd树)来存储多维数据集(或其他对象)的实例,并在树的节点上进行相交测试。通过这种方式,您可以一次消除绝不会位于平截头体内部的大量对象,并显著提高性能。

Yikes

在不知道GetCube正在做什么的情况下,我无法猜测它是如何影响您的性能的,但很清楚为什么事情会如此显著地放缓。你在做很多不必要的工作

您只需采取不同的方法即可消除大部分循环:忽略角度,并进行更简化的测试。对于
i
j
k
的任何值,如果它在“播放器”后面标记一个立方体,请不要执行任何操作。仅此一项就可以平衡帧率并简化循环。(您不需要四组不同的嵌套循环!)

更好的方法是,使用空间图(类似八叉树或kd树)来存储多维数据集(或其他对象)的实例,并在树的节点上进行相交测试。这样,您可以一次消除绝不会位于平截头体内部的大量对象,并显著提高性能