Курсовая работа на тему: «Отрисовка сцены «Отражающиеся дорожки» алгоритмом обратной трассировки лучей»
Екатеринбург 2011 г.
Алгоритм работы программы
1) Заранее в программе заданы объекты и источники света, тип поверхности объектов, размеры окна для отображения изображения, цвет фона, а также координаты точки обзора;
2) Затем для каждого пикселя изображения рассчитываем цвет, для этого направляем лучи;
3) Если заданный луч не пересекает ни одного объекта сцены, то закрашиваем данный пиксель в цвет фона.
4) Если же заданный луч пересекает какой-либо объект сцены, то обращаемся к методу класса Ray рассчитывающему цвет в точке пересечения. Он в свою очередь обращается к аналогичному методу класса Sphere, который находит координаты точки пересечения луча с объектом, увеличивает длину луча (вектора) до точки пересечения с объектом, находит вектор нормали к поверхности в точке пересечения.
5) Программа передает все найденные выше параметры в метод класса Surface, который рассчитывает цвет в данной точке. В зависимости от свойств материала пересеченного объекта данный метод находит затененность, отражение, преломление в данной точке. При наличии двух последних генерируется новый луч, который трассируется (т.е. проходит заново пункты 3–5 данного алгоритма (рекурсия)). При трассировке этого луча мы получаем цвет в данной точке, который модифицируется при помощи коэффициентов и возвращается в главную функцию для последующей отрисовки.
Блок-схема программы
программа трассировка тень освещение
Заключение
В результате работы над программой были выполнены поставленные требования: реализована трассировка лучей с просчетом теней, освещения, отражения, преломления лучей, что является несомненным достоинством программы. Также задан объект – сфера. Недостатком программы считаю то, что не рассмотрены такие источники света, как свет окружающей среды и направленный свет.
Приложение 1
Полученное изображение
Приложение 2
Листинг Light.java
package objects;
/**
*
* @author Алексей
*/
// Источник света
public class Light {
public WorkVector lightvec; // позиция истоника света
public float lightred, lightgreen, lightblue; // цвет источника света
public Light (WorkVector v, float r, float g, float b) {
lightvec = v;
lightred = r;
lightgreen = g;
lightblue = b;
}
}
Приложение 3
Листинг Ray.java
package objects;
import java.awt. 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 < objects.size(); i++) {
Sphere object = (Sphere) objects.elementAt(i);
object.intersection(this); // проверка пересечения с объектом
}
return (object!= null); // возвращение true если было пересечение
}
public final Color Shade (Vector lights, Vector objects, Color bgnd) {
return object. Shade (this, lights, objects, bgnd);
}
}
Приложение 4
Листинг Sphere.java
package objects;
import java.awt. ............