Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Топ:
Техника безопасности при работе на пароконвектомате: К обслуживанию пароконвектомата допускаются лица, прошедшие технический минимум по эксплуатации оборудования...
Выпускная квалификационная работа: Основная часть ВКР, как правило, состоит из двух-трех глав, каждая из которых, в свою очередь...
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Интересное:
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Дисциплины:
2017-11-27 | 276 |
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 м...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!