Отрисовка сцены "Отражающиеся дорожки" алгоритмом обратной трассировки лучей - Курсовая работа

бесплатно 0
4.5 143
Разработка и практическая апробация программы для соответствия поставленным требованиям: реализация трассировки лучей с просчетом теней, освещения, отражения, преломления лучей, что является несомненным достоинством данной спроектированной программы.


Аннотация к работе
Курсовая работа на тему: «Отрисовка сцены «Отражающиеся дорожки» алгоритмом обратной трассировки лучей» Екатеринбург 2011 г. Алгоритм работы программы 1) Заранее в программе заданы объекты и источники света, тип поверхности объектов, размеры окна для отображения изображения, цвет фона, а также координаты точки обзора; 2) Затем для каждого пикселя изображения рассчитываем цвет, для этого направляем лучи; 3) Если заданный луч не пересекает ни одного объекта сцены, то закрашиваем данный пиксель в цвет фона. 5) Программа передает все найденные выше параметры в метод класса Surface, который рассчитывает цвет в данной точке. Color; import java.util. Vector; /** * * @author Алексей */ // Луч public class Ray { float max_distance = Float.MAX_VALUE; // максимальная значение для currentDistance луча WorkVector initRay; // начало луча WorkVector finalRay; // направление луча float currentDistance; // Текущее расстояние до обьекта Sphere object; // Обьект, с которым произошло столкновение луча public Ray (WorkVector eye, WorkVector dir) { initRay = new WorkVector(eye); finalRay = WorkVector.normalize(dir); } public boolean trace (Vector objects) { currentDistance = max_distance; object = null; for (int i = 0; i ray.currentDistance) return false; // нахождение суммы квадрата v и квадратов элементов вектора dv float t = radius*radius v*v - dv.x*dv.x - dv.y*dv.y - dv.z*dv.z; if (t ray.currentDistance) || (t 0) { if (kRasseivania > 0) { float diffuse = kRasseivania*lambert; r = diffuse*ir*light.lightred; g = diffuse*ig*light.lightgreen; b = diffuse*ib*light.lightblue; } if (kOtragenia > 0) { lambert *= 2; float spec = v.dot (lambert*n.x - luch.x, lambert*n.y - luch.y, lambert*n.z - luch.z); if (spec > 0) { spec = kOtragenia*((float) Math.pow((double) spec, (double) ns)); r = spec*light.lightred; g = spec*light.lightgreen; b = spec*light.lightblue; } } } } // ОТРАЖЕНИЕ if (kr > 0) { // если коэффициент отражения больше нуля, то обьект может отражать float t = v.dot(n); // получение результата скалярного произведения вектора направленного к началу источника луча и нормали поверхности в данной точке if (t > 0) { t *= 2; WorkVector reflect = new WorkVector (n.mul(t).sub(v)); WorkVector poffset = new WorkVector (p.add (reflect.mul(TINY))); Ray reflectedRay = new Ray (poffset, reflect); if (reflectedRay.trace(objects)) { Color rcolor = reflectedRay. Shade (lights, objects, bgnd); r = kr*rcolor.getRed(); g = kr*rcolor.getGreen(); b = kr*rcolor.getBlue(); } else { r = kr*bgnd.getRed(); g = kr*bgnd.getGreen(); b = kr*bgnd.getBlue(); } } } // ПРИЛОМЛЕНИЕ if (kt > 0) { WorkVector tr; WorkVector incident = v.add(p); float eta = (float) 0.7; float c1 = incident.mul(-1).dot(n); float c2; c2 = 1 - eta*eta*(1-c1*c1); if (c2 > 0.0) { c2 = (float) (Math.sqrt(c2)); float maae = (eta*c1 - c2); tr = incident.mul(eta).add (n.mul(maae)); tr.normalize(); WorkVector poffset = p.add (n.mul(-TINY)); Ray reflectedRay = new Ray (poffset, tr); if (reflectedRay.trace(objects)) { Color rcolor = reflectedRay. Shade (lights, objects, bgnd); r = kt*rcolor.getRed(); g = kt*rcolor.getGreen(); b = kt*rcolor.getBlue(); } else { r = kt*bgnd.getRed(); g = kt*bgnd.getGreen(); b = kt*bgnd.getBlue(); } } } // чтобы избежать выход за границы r = (r > 1f)?.
Заказать написание новой работы



Дисциплины научных работ



Хотите, перезвоним вам?