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:
- Die Kamera befindet sich in
0, -10, 0
die entlang der y -Achse. - Kugel mit Radius
1
gelegen bei0, 0, 0
. - Bildgebendes Flugzeug-Ding ist eine Entfernung von
1
von der Kamera entfernt und hat eine Breite und Höhe von0.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:
Ich hatte etwas in dieser Art erwartet:
Weiß jemand, warum mein Code nicht richtig funktioniert? Ich habe diesen einen Teil schon viel zu lange überarbeitet und neu geschrieben...