Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
Топ:
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Выпускная квалификационная работа: Основная часть ВКР, как правило, состоит из двух-трех глав, каждая из которых, в свою очередь...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Интересное:
Наиболее распространенные виды рака: Раковая опухоль — это самостоятельное новообразование, которое может возникнуть и от повышенного давления...
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Дисциплины:
|
из
5.00
|
Заказать работу |
|
|
|
|
Слева изображен гиперболический параболоид. Его уравнение имеет вид:
x2-z2-y=0. Пересечение луча и гиперболоида можно изобразить так:

Коэффициенты a,b,c:
a= 
b = 
c= 
Дискриминант d =
и,если он не отрицателен, имеются корни:
; 
Для вычисления нормали к точке также используется градиент.
Модель освещения Фонга
Модель освещения Фонга расширяет стандартную модель диффузного освещения, добавляя в нее зеркальную компоненту.

Причем каждый из векторов является единичным.
Зеркальная компонента освещения зависит от расположения наблюдателя. В реальной жизни можно заметить, что когда в солнечный день мы смотрим на «зеркальные» объекты (металл, вода, стекло и т.д.) освещенность объекта зависит на нашей точки обзора. При определенных углах заметны яркие блики.
С точки зрения физики, происходит примерно следующее: луч света отражается от гладкой поверхности, если этот луч попадает на сетчатку глаза, то мы видим яркий блик.
Таким образом, можно ввести некоторые дополнительные обозначения:

Суммарная освещенность объекта будет определяться как сумма всех трех компонент освещенности.
Практическая часть
Эллиптический параболоид
Реализовать возможность построения с использованием трассировки лучей геометрический объект «Базовый геометрический параболоид»
#pragmaonce
#include"GeometryObjectWithInitialTransformImpl.h"
#include"Ray.h"
#include"Intersection.h"
/************************************************************************/
/* Геометрический объект "Элиптический параболоид" */
/* Ось цилиндра совпадает с осью z. Основание находится в плоскости z=0 */
/************************************************************************/
class CEllipticParaboloid:
public CGeometryObjectWithInitialTransformImpl
{
public:
CEllipticParaboloid(CVector3d const& pos, CMatrix4d const& transform);
/*пересечение луча с параболоидом*/
virtualbool Hit(CRay const& ray, CIntersection & intersection)const;
};
Вычисление нормали происходит следующим образом:
// Координатынормаликточке
CVector3d hitNormal1InObjectSpace = CVector3d(2*hitPoint1InObjectSpace.x, -1, 2*hitPoint1InObjectSpace.z);
if(Dot(hitNormal1InObjectSpace, ray.GetDirection()) > 0)
hitNormal1InObjectSpace = -hitNormal1InObjectSpace;
1. Вычисляется градиент
2. Если скалярное произведение направления луча и нормали к точке больше нуля, то поворачиваем нормаль в другую сторону.
Гиперболический параболоид
Реализовать возможность построения поверхности базового гиперболического параболоида, заданного на диапазоне координат x и y от -1 до +1. Точка пересечения луча с гиперболическим
параболоидом должна вычисляться аналитически.
#pragmaonce
#include"GeometryObjectWithInitialTransformImpl.h"
#include"Ray.h"
#include"Intersection.h"
/************************************************************************/
/* Геометрический объект "Гиперболический параболоид" */
/* Ось цилиндра совпадает с осью z. Основание находится в плоскости z=0 */
/************************************************************************/
class CHyperbolicParaboloid:
public CGeometryObjectWithInitialTransformImpl
{
public:
CHyperbolicParaboloid(CVector3d const& pos, CMatrix4d const& transform);
virtualbool Hit(CRay const& ray, CIntersection & intersection)const;
};
Вычисление нормали:
После вычисления корней уравнения, сортируем их в порядке возрастания
//сортировка
t1<t0?std::swap(t0,t1):false;
А дальше аналогично элиптическому параболоиду, только изменяем формулу градиента
// Координатынормаликточке
CVector3dhitNormal1InObjectSpace = CVector3d(2*hitPoint1InObjectSpace.x, -1, -2*hitPoint1InObjectSpace.z);
if(Dot(hitNormal1InObjectSpace, ray.GetDirection()) > 0)
hitNormal1InObjectSpace = -hitNormal1InObjectSpace;
Тени и составляющие света
1. Расчет фоновой и зеркальной (с использованием модели освещения Фонга) составляющих отраженного света.
Необходимо реализовать возможность учета фоновой (ambient) и зеркальной (specular) составляющих отраженного света при расчете цвета поверхности
Для выполнения этой задачи в классы CSimpleMaterial и LightSourceImpl были добавленны следующие свойства:
CVector4d m_diffuseIntensity;
CVector4d m_specularIntensity;
CVector4d m_ambientIntensity;
А так же методы, позволяющие изменять и получать значения этих свойств.
В класс SimpleDiffuseShaderбыли добавлены формулы для вычисления составляющих света, взятые из прошлых лабораторных работ:
CVector3d reflectedLight = lightDirection - 2 * Dot(n, lightDirection) * n;
CVector3d eye = -shadeContext.GetRayDirection();
double specularFactor = max(Dot(-reflectedLight, eye), 0.0);
double materialShiness = m_material.GetShiness();
double specularIntensity = pow(specularFactor, materialShiness / 100) * 0.001;
CVector4d specularColor = light.GetDiffuseIntensity() * m_material.GetDiffuseColor() * specularIntensity;
specularColor.w = 1.0;
CVector4d ambientColor = light.GetAmbientIntensity() * m_material.GetAmbientColor() * lightIntensity;
CVector4d diffuseColor = nDotL * light.GetDiffuseIntensity() * m_material.GetDiffuseColor()* lightIntensity;
2. Визуализация теней.
Необходимо реализовать визуализацию трехмерной сцены с учетом теней, отбрасываемых
объектами сцены. Для этого при расчете освещения точки поверхности проверить отсутствие
препятствий на пути света от источника к данной точке.
При выполнении этой задачи был изменен класс SimpleDiffuseShader.
Наличие тени определялось условием, если объект находится за объектом, то для него вычислялась только фоновая составляющая света.
CIntersection bestIntersection;
CSceneObject const * pSceneObject = NULL;
if(scene.GetFirstHit(CRay(point, lightDirection), bestIntersection, &pSceneObject)
&& bestIntersection.GetHit(0).GetHitTime() <= 1)//проверяем, чтобы находилось за объектом
{
shadedColor += (ambientColor);
}
else
shadedColor += (diffuseColor + specularColor + ambientColor);
И класс CheckerShader. В него было внесено подобное изменение, только вместо вычисления фоновой составляющей, объекту придавался черный цвет
if(scene.GetFirstHit(CRay(point, lightDirection), bestIntersection, &pSceneObject)&& bestIntersection.GetHit(0).GetHitTime() <= 1)//проверяем, чтобынаходилосьзаобъектом
return CVector4d(0, 0, 0, 1);
|
|
|
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...
Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
© cyberpediasu.com 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!