我正在用純python構建乙個簡單的python光線追蹤器(僅僅是為了它),但我遇到了障礙。
我的場景的設定目前是這樣的:
相機位於沿y軸指向的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)它應該正常工作,但是當我渲染測試影象時,我沒有看到任何看起來像球體輪廓的東西:
我期待著這樣的事情:
有人知道我的**為什麼不能正常工作嗎?我一直在調整和重寫這一部分的時間太長了......
Unity之基於光線投射演算法的體渲染技術(二)
接上文 第二種光線投射演算法的實現,基於光線起點 相機位置 將相機位置由世界座標通過模型檢視投影矩陣反變換到長方體的區域性座標空間。每個fragment的座標作為光線的入射點,由變換後的相機位置與光線入射點確定光線的方向,在沿著光線方向從入射點前進時,每到達乙個新的點,判斷其是否在長方體內,如果在,...
基於層次包圍盒的光線追蹤渲染加速演算法
光線追蹤的效率問題一直以來都是關注的焦點,因為很多時候都會有非常多的求交運算要執行。目前幾乎所有的加速演算法都是儘量減少求交運算量,比如octree kd tree 包圍盒 及層次包圍盒 等。基於空間分割的演算法最重要的就是如何有效地分隔空間,讓場景細節和主體脫離 劃分在不同的層次中 層次包圍盒對空...
python渲染 Python三維軟體渲染
我決定嘗試在python中使用pygame進行乙個實驗,這樣我就可以通過pixelarray繪製到螢幕上。我決定按照this article來鑽研3d的數學 總之,我已經實現了每乙個功能。我建立了矩陣和向量的數 算,並有一些問題,但經過廣泛 廣泛的 測試,這些運算現在完全可以工作了 點 十字 法線 ...