编程语言
首页 > 编程语言> > Python光线跟踪

Python光线跟踪

作者:互联网

我正在使用纯Python构建一个简单的Python光线跟踪器(仅仅是为了它),但我遇到了障碍.

我的场景设置目前是这样的:

>相机位于0,-10,0处沿y轴指向.
>半径为1的球体位于0,0,0.
>成像平面距离相机1距离,宽度和高度为0.5.

我通过成像平面以均匀的随机分布拍摄光子,如果光子恰好与物体相交,我在图像画布上绘制一个红点,对应于光线通过的图像平面上的点.

我的交叉口代码(我只有球体):

def intersection(self, ray):
  cp = self.pos - ray.origin
  v = cp.dot(ray.direction)
  discriminant = self.radius**2  - cp.dot(cp) + v * v

  if discriminant < 0:
    return False
  else:
    return ray.position(v - sqrt(discriminant)) # Position of ray at time t

我的渲染代码(渲染一定数量的光子,而不是逐像素):

def bake(self, rays):
  self.image = Image.new('RGB', [int(self.camera.focalplane.width * 800), int(self.camera.focalplane.height * 800)])
  canvas = ImageDraw.Draw(self.image)

  for i in xrange(rays):
    x = random.uniform(-camera.focalplane.width / 2.0, camera.focalplane.width / 2.0)
    z = random.uniform(-camera.focalplane.height / 2.0, camera.focalplane.height / 2.0)

    ray = Ray(camera.pos, Vector(x, 1, z))

    for name in scene.objects.keys():
      result = scene.objects[name].intersection(ray)

      if result:
        n = Vector(0, 1, 0)
        d = ((ray.origin - Point(self.camera.pos.x, self.camera.pos.y + self.camera.focalplane.offset, self.camera.pos.z)).dot(n)) / (ray.direction.dot(n))
        pos = ray.position(d)

        x = pos.x
        y = pos.y

        canvas.point([int(self.camera.focalplane.width * 800) * (self.camera.focalplane.width / 2 + x) / self.camera.focalplane.width,
                      int(self.camera.focalplane.height * 800) * (self.camera.focalplane.height / 2 + z) / self.camera.focalplane.height],
                      fill = 128)

它应该可以正常工作,但是当我渲染测试图像时,我看不到任何看起来像球体轮廓的东西:

我期待这样的事情:

有人知道为什么我的代码运行不正常吗?我一直在调整并重写这一部分太长时间了……

最佳答案:

你正在规范射线的方向向量吗?

标签:python,raytracing,vector
来源: https://codeday.me/bug/20190515/1109380.html