2011-03-23 234 views
5

我正在用純Python構建一個簡單的Python光線追蹤器(僅僅是爲了它),但是我碰到了一個障礙。Python光線追蹤

我的場景的設置目前是這樣的:

  1. 攝像頭位於0, -10, 0沿Ÿ軸指向。
  2. 半徑球體1位於0, 0, 0
  3. 成像平面物距離攝像機的距離爲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) 

它應該可以正常工作,但是當我渲染測試圖像時,我看不到任何看起來像球體輪廓的東西:

enter image description here

我期待這樣的事情:

enter image description here

有誰知道爲什麼我的代碼不能正常工作?我一直在調整和重寫這一部分的方式太長了......

回答

7

你是否正常化了射線的方向矢量?

+0

哇,那很簡單。謝謝! (我的輸出圖像看起來很像我用GIMP製作的圖像)。 – Blender 2011-03-23 16:54:48

+0

幸運猜測;-) – Alnitak 2011-03-23 17:42:39