You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遵循Omar Aflak Python光线追踪教程运行代码未生成图像如何解决

光线追踪代码无输出图像问题排查方案

常见产生原因

  • 基础依赖/变量/辅助函数缺失:代码中用到的numpy、matplotlib未导入,width/height/max_depth核心变量未赋值,normalize/nearest_intersected_object/reflected三个自定义辅助函数未实现。
  • 保存路径不明确:plt.imsave默认存储到Jupyter Notebook的当前工作目录,和你预期的代码文件目录可能不一致,导致找不到生成的图片。
  • 逻辑计算错误:辅助函数实现错误、阴影判断逻辑异常、光线方向计算错误等导致所有像素颜色值均为0,生成全黑图片。
  • 转义字符未修正:你粘贴的代码中<是HTML转义的小于号,直接复制运行会触发语法错误(如果已经正常打印进度可忽略该条)。

排查修复步骤

步骤1:补全基础导入与依赖

首先确认已经导入所有依赖库,且核心变量已正确赋值:

import numpy as np
import matplotlib.pyplot as plt
# 核心参数赋值,可根据需要调整分辨率
width = 200
height = 200
max_depth = 3

补全三个缺失的核心辅助函数:

# 向量归一化函数
def normalize(vector):
    return vector / np.linalg.norm(vector)

# 求最近的相交球体
def nearest_intersected_object(objects, origin, direction):
    distances = []
    for obj in objects:
        oc = origin - obj['center']
        a = np.dot(direction, direction)
        b = 2 * np.dot(oc, direction)
        c = np.dot(oc, oc) - obj['radius'] ** 2
        discriminant = b ** 2 - 4 * a * c
        if discriminant < 0:
            distances.append(np.inf)
            continue
        t1 = (-b - np.sqrt(discriminant)) / (2 * a)
        t2 = (-b + np.sqrt(discriminant)) / (2 * a)
        # 仅保留光线前进方向的正交点
        valid_t = [t for t in (t1, t2) if t > 1e-5]
        distances.append(min(valid_t) if valid_t else np.inf)
    min_distance = min(distances)
    if min_distance == np.inf:
        return None, None
    return objects[distances.index(min_distance)], min_distance

# 反射向量计算
def reflected(direction, normal):
    return direction - 2 * np.dot(direction, normal) * normal

步骤2:确认图片输出路径

先直接在Jupyter中渲染图片验证是否生成有效内容:

plt.imshow(image)
plt.show()

如果可以正常显示图片,说明保存逻辑正常,可通过打印当前工作目录确认图片存储位置:

import os
print("图片存储目录为:", os.getcwd())

也可以直接指定绝对路径保存,避免找不到文件:

# 示例为Windows桌面路径,可自行替换为目标路径
plt.imsave(r'C:\Users\你的用户名\Desktop\image.png', image)

步骤3:排查逻辑错误

如果渲染出的图片为全黑,可按以下顺序排查:

  • 先注释掉阴影判断代码if is_shadowed: break,重新运行看是否有输出,若有输出则说明阴影判断逻辑异常,可检查nearest_intersected_object的返回值是否正确。
  • 打印任意像素的颜色值验证计算结果:print(image[100, 100]),如果值全为0,可检查光线方向、交点计算逻辑是否正确。
  • 确认max_depth参数值大于等于2,否则反射逻辑不会生效,画面会缺失大量细节。

内容的提问来源于stack exchange,提问作者Maria Victoria Helena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:54:03