首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出光线是否与Voxel相交而不行进

找出光线是否与Voxel相交而不行进
EN

Stack Overflow用户
提问于 2015-10-22 21:11:53
回答 2查看 909关注 0票数 2

我很清楚行军/ DDA算法,但我希望能够在恒定的时间内完成每条体素射线对的检查,而不必在体素空间中“行进”。我该怎么做?

要明确的是,我不是试图找到第一个体素射线相交,而是,给出一个射线和一个体素,确定那个体素细胞是否位于射线的路径之内。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-25 16:33:19

射线是P = O + t D,其中POD是向量,t是正实。如果下面的系统有一个解决方案,则与体素[x,y,z]x[x+1,y+1,z+1]有一个交集:

代码语言:javascript
复制
x < Ox + t Dx < x + 1
y < Oy + t Dy < y + 1
z < Oz + t Dz < z + 1
0 < t

为了简洁,我们重写了(用x' = (x - Ox) / Dx .)

代码语言:javascript
复制
x' < t < x"
y' < t < y"
z' < t < z"
 0 < t

如果是Dx < 0,则必须反转不等式。如果是Dx == 0,则不等式在x < Ox < x + 1中退化,这可以直接决定。

对所有三个轴重复相同的讨论,并检查所有括号是否兼容。

例如,对于Dx, Dy, Dz > 0,您必须有

代码语言:javascript
复制
max(0, x', y', z') < min(x", y", z").

有27个符号组合需要考虑,这是分开的三个级联三方面的比较。

作为一种微观优化,您可以通过Dx Dy Dz来消除最后的不等式并简化,以换取(更快)的乘数。

如果许多射线忽略了体素,你可以通过使用包围球来稍微加速这个过程。假设体素中心为C,体素半径为R,向量D为归一化,则预检验为

代码语言:javascript
复制
(OC x D)² < R²
票数 2
EN

Stack Overflow用户

发布于 2015-10-23 02:37:33

您可以使用任何射线盒(AABB)交叉算法。

任意一

如果需要交点坐标,则选择三维直线裁剪算法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33290838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档