我正在制作一个基于立方体的游戏(一切都是立方体),目前正在尝试通过不在视野之外绘制东西来优化它。
以下仅适用于 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 天,并且觉得问这个问题真是个笨蛋。