光线追踪场景图元相交代码改写后异常问题咨询
光线追踪相交计算代码重构后的问题分析与修复
两段代码的核心差异有两处,直接导致重构后的代码失效:
问题1:未处理图元类型不匹配的兜底情况
原列表推导式最后有else (None, None)的兜底逻辑,用来处理s是列表但既不是'sphere'也不是'plane'的情况。但重构后的for循环里缺少这个分支,当遇到这类非法图元时,变量a会未定义,执行append操作时直接抛出NameError。
问题2:列表引用错误
distances = hit_orientation = []这种写法会让两个变量指向同一个列表对象,后续对任意一个列表执行append操作,另一个会同步变化,完全不符合分别存储距离和朝向的需求。
修复后的代码
distances = [] hit_orientation = [] for s in Sc['scene_primitives']: if isinstance(s, list): if s[0] == 'sphere': a = sphere_intersect(s, ray['origin'], ray['dir']) elif s[0] == 'plane': a = plane_intersect(s, ray['origin'], ray['dir']) else: # 补上原代码的兜底逻辑 a = (None, None) else: a = s.intersect(ray['origin'], ray['dir']) distances.append(a[0]) hit_orientation.append(a[1])
修复说明
- 分开初始化
distances和hit_orientation,确保两个列表相互独立; - 在
s为列表的分支中添加else块,补上原代码的兜底逻辑,避免a未定义的错误。
内容的提问来源于stack exchange,提问作者FrostDream
相关产品推荐
相关产品推荐

