繁体   English   中英

C ++,OpenGL裁剪

[英]C++, OpenGL clipping

我正在制作一个基于多维数据集的游戏(一切都是多维数据集),当前正在尝试通过不在视场外绘制内容来对其进行优化。

以下内容仅适用于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

我已经为此纠缠了两天了,问这个问题真是愚蠢。

这将是非常非常快(和不易出错)来实现八叉树 然后,您将可以通过丢弃八叉树与观察视锥不相交的部分来剔除所有不可见的立方体。 您不必对每个多维数据集都执行此测试,并且可以减少将单个较大的多维数据集与6个平面进行比较的测试。

与您所拥有的相比,八叉树速度要快几个数量级

WikipediaFlipcode上 ,您可以找到很多有关八叉树的信息。

您应该做的就是夹住平截头平面。 在这里,您将找到有关平截头体以及如何从视图矩阵中提取平面的几乎所有知识,甚至还有一些代码可以测试多维数据集是否在视图体积之内: http : //www.crownandcutlass.com /features/technicaldetails/frustum.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM