6 Stimmen

Python Raytracing

Ich baue eine einfache Python raytracer mit reinen Python (nur für die Heck von ihm), aber ich habe eine Straßensperre getroffen.

Der Aufbau meiner Szene sieht derzeit folgendermaßen aus:

  1. Die Kamera befindet sich in 0, -10, 0 die entlang der y -Achse.
  2. Kugel mit Radius 1 gelegen bei 0, 0, 0 .
  3. Bildgebendes Flugzeug-Ding ist eine Entfernung von 1 von der Kamera entfernt und hat eine Breite und Höhe von 0.5 .

Ich schieße Photonen in einer gleichmäßig zufälligen Verteilung durch die Bildebene, und wenn ein Photon zufällig ein Objekt schneidet, zeichne ich einen roten Punkt auf die Bildleinwand, der dem Punkt auf der Bildebene entspricht, durch den der Strahl ging.

Mein Kreuzungscode (ich habe nur Kugeln):

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

Und mein Rendering-Code (er rendert eine bestimmte Anzahl von Photonen, nicht Pixel für Pixel):

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)

Es sollte eigentlich funktionieren, aber wenn ich ein Testbild rendere, erhalte ich nichts, was wie der Umriss einer Kugel aussieht:

enter image description here

Ich hatte etwas in dieser Art erwartet:

enter image description here

Weiß jemand, warum mein Code nicht richtig funktioniert? Ich habe diesen einen Teil schon viel zu lange überarbeitet und neu geschrieben...

8voto

Alnitak Punkte 324207

Normalisieren Sie den Richtungsvektor des Strahls?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X