5
我正在用純Python構建一個簡單的Python光線追蹤器(僅僅是爲了它),但是我碰到了一個障礙。Python光線追蹤
我的場景的設置目前是這樣的:
- 攝像頭位於
0, -10, 0
沿Ÿ軸指向。 - 半徑球體
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)
它應該可以正常工作,但是當我渲染測試圖像時,我看不到任何看起來像球體輪廓的東西:
我期待這樣的事情:
有誰知道爲什麼我的代碼不能正常工作?我一直在調整和重寫這一部分的方式太長了......
哇,那很簡單。謝謝! (我的輸出圖像看起來很像我用GIMP製作的圖像)。 – Blender 2011-03-23 16:54:48
幸運猜測;-) – Alnitak 2011-03-23 17:42:39