光线投射计算 space 的体积
Raycasting to calculate the volume of a space
我正在尝试使用光线投射来收集房间中的所有表面并确定它的体积。
我有一个光线将来自的质心位置,但我在如何获得所有 360 度光线(3D space)方面空白。
我在地板或天花板上没有得到任何点,就像它围绕 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)
这样看:vector
的 x 和 y 是从角度 x
(-> 平面中的一个圆)创建的,然后添加一个位于 -1 和之间的 z 分量1(哪个 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)
但请注意,使用球坐标时光线的角度分布并不均匀。在两极,它比赤道更密集。您可以减轻这种情况,例如根据 y
缩小 x
的密度。表面元素按比例缩小 cos(y)²
,所以我认为你必须按比例 cos(y)
。
我正在尝试使用光线投射来收集房间中的所有表面并确定它的体积。 我有一个光线将来自的质心位置,但我在如何获得所有 360 度光线(3D space)方面空白。
我在地板或天花板上没有得到任何点,就像它围绕 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)
这样看:vector
的 x 和 y 是从角度 x
(-> 平面中的一个圆)创建的,然后添加一个位于 -1 和之间的 z 分量1(哪个 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)
但请注意,使用球坐标时光线的角度分布并不均匀。在两极,它比赤道更密集。您可以减轻这种情况,例如根据 y
缩小 x
的密度。表面元素按比例缩小 cos(y)²
,所以我认为你必须按比例 cos(y)
。