1

我正在制作一个基于立方体的游戏(一切都是立方体),目前正在尝试通过不在视野之外绘制东西来优化它。

以下仅适用于 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 天,并且觉得问这个问题真是个笨蛋。

4

2 回答 2

3

实现octree会快得多(而且不容易出错)。然后,您将能够通过丢弃八叉树中与您的视锥体不相交的部分来剔除所有不可见的立方体。您不必对每个立方体都执行此测试,并且可以将测试简化为将单个较大的立方体与 6 个平面进行比较。

与你所拥有的相比,八叉树会快几个数量级。

您可以在WikipediaFlipcode以及其他地方找到大量有关八叉树的信息。

于 2010-12-18T19:48:18.737 回答
0

你应该做的是夹在平截头体平面上。在这里,您将找到几乎所有您需要了解的关于截锥体以及如何从视图矩阵中提取平面的信息,甚至还有一些用于测试立方体是否在视图体积内的代码:http ://www.crownandcutlass.com /features/technicaldetails/frustum.html

于 2010-12-18T19:51:48.530 回答