python - 光线投射来计算空间的体积
问题描述
我正在尝试使用光线投射来收集房间中的所有表面并确定它的体积。我有一个质心位置,光线将来自该位置,但我对如何获得所有 360 度(在 3D 空间中)的光线一无所知。
我在地板或天花板上没有得到任何点,就像它正在围绕 Z 轴旋转 60 度展开。我想我已经完成了剩下的工作,但这让我很难过。
for y in range(360):
for x in range(360):
vector = DB.XYZ(math.sin(math.radians(x)), math.cos(math.radians(x)), math.cos(math.radians(y))).Normalize()
prox = ri.FindNearest(origin, direction).Proximity
point = origin + (direction * prox)
解决方案
以这种方式看待它:x 和 yvector
是从角度创建的x
(-> 平面中的一个圆),然后添加位于 -1 和 1 之间的 az 分量(cos 确实如此)。所以很明显,你最终得到了一个圆柱形分布。
您可能想要的是球坐标。像这样修改你的代码:
for y in range(-90, 91):
for x in range(360):
vector = DB.XYZ(math.sin(math.radians(x)) * cos(math.radians(y)),
math.cos(math.radians(x)) * cos(math.radians(y)),
math.sin(math.radians(y))) # Normalize unnecessary, since vector² = sin² * cos² + cos² * cos² + sin² = 1
prox = ri.FindNearest(origin, direction).Proximity
point = origin + (direction * prox)
但请注意,使用球坐标时光线的角度分布并不均匀。在两极它比在赤道更密集。您可以减轻这种情况,例如通过按比例缩小密度x
,具体取决于y
. 表面元素按比例缩小cos(y)²
,所以我认为你必须按比例缩小cos(y)
。
推荐阅读
- ruby-on-rails - 错误 422 无法处理的实体 - Rails API VueJS 来自
- python - 将 pandas DataFrame 中每一行的最后一个非零值转换为 0
- unity3d - 如何判断一个对象是预制资产还是该预制的实例?
- go - 奇怪的 404 服务器错误 (ListenAndServeTLS)
- go - 内存中的数据以最小化数据库读取?
- python - Python 阶乘程序 - 打印方程
- python - 程序忽略“else”语句
- reactjs - 将数据从孩子传递给父母
- firemonkey - 如何检测何时重新打开iOS(Firemonkey)上在后台休眠的应用程序?
- json - SQL JSON 乘以交叉应用