我正在制作一个基于立方体的游戏(一切都是立方体),目前正试图通过不在视野之外绘制东西来优化它。
以下仅适用于x和y平面,我稍后会担心z ...所以现在只有侧面裁剪。
我知道我自己在世界上的位置和旋转以及每个立方体的位置,所以我们的想法是比较玩家和立方体相对于玩家的z和x旋转角度,只显示立方体在一个明确的范围内。
代码时间:
// this is how I turn
float zrotrad = (float)zrot*DEG2RAD;
float view_limit = .4;
// distance between the cube and me
float dist_x = box_x-xpos;
float dist_y = box_y-ypos;
float dist_z = box_z-zpos;
// total distance (I'll use fast sqrt later)
float dist_tot = sqrt(dist_x*dist_x+dist_y*dist_y);
float angle = acos(dist_y/dist_tot);
// need to add 2 pies because acos returns a value [0,2PI]
float zcuberot = dist_x<0?2*PI-angle:angle;
if(zcuberot > zrotrad-view_limit && zcuberot < zrotrad+view_limit)
{
drawcube(box_x, box_y, box_z);
}
正如你可能已经明白的那样,0度左右存在一个问题,因为我的左视野限制变为负值,zcuberot加了2个馅饼,范围变得混乱。同样的故事为359度 - 实际上更少,因为view_limit = .4
。
我已经乱了2天了,感觉就像问这个傻瓜一样。
答案 0 :(得分:3)
实现八叉树会更快,更容易出错。然后,您将能够通过丢弃不与您的视锥体相交的八叉树部分来剔除所有不可见的立方体。您不必为每个立方体执行此测试,并且您将能够减少测试以将单个较大的立方体与6个平面进行比较。
与您所拥有的相比,八叉树将更快几个数量级。
答案 1 :(得分:0)
你应该做的是夹在平截头体上。 在这里,您可以找到关于视锥体以及如何从视图矩阵中提取平面的所有相关信息,甚至还有一些代码可以测试多维数据集是否在视图体积内:http://www.crownandcutlass.com/features/technicaldetails/frustum.html