空间栅格化(体素化)及射线选择原理
对于一个空间的多个primitive栅格化是计算这些primitive的AABB包围盒bbox定义或者估计x y z方向分割为多少栅格m n k例如bbox的x方向长度xh12.6 m3则分割的每个小栅格x方向长度xdxh/m4.2对于图元i假设它的包围盒i.bbox的最小角点i.bbox.minpt对于一个double的值v确定它栅格索引这样计算int celli(v-v0)/dd是栅格该维度的长度, v0是该维度的最小值假设d1.1 v00.7 v3.5则计算后celli 2 即v在第2个cell里组织为函数 int geiId(double v, double v0, double d)对于一个三维点vec3d pt则落在空间cell 或者叫体素索引 计算函数为vec3i getPointI(vec3d pt, vec3d minpt, vec3d d){int xigetId(pt.x, minpt.x, d.x);int yigetId(pt.y, minpt.y, d.y);int zigetId(pt.z, minpt.z, d.z);return vec3i(xi,yi,zi);}这个第一阶段是栅格化对于n个primitive 先确定每个cell包含哪些primitive这个阶段是比较耗时一般是场景才建立时候然后射线查询阶段这个经常性要求快通过ray和整个bbox求交计算得到ray和bbox六个面的两个交点a, b基于getPointId或者由a b确定遍历的cell范围或者是由a b算出的栅格索引坐标计算哪些cell被ray碰到了可以参考直线线段的光栅化算法这样其实得到小数量的可能cells设置tmin为DBL_MAXprimitive_i为-1然后对于cells每个cell遍历cell包含的每个primitive进行更精细的ray和primitive相交判断算法计算和primitive的交点距离射点的距离t 记录最小tmin及primitive_iif(ttmin){tmint; primitive_iprimitive}遍历完cells后就得到射到的primitive_i有可能在分配图元到栅格阶段.一个图元可能分到不同的cell里这是存在的例如一条线段就划到多个cell.
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2417170.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!