Spotlight added

This commit is contained in:
m.gaedke 2022-11-22 15:17:41 +01:00
parent 0a905edf0c
commit 41ae90b1b5
5 changed files with 71 additions and 5 deletions

View file

@ -25,7 +25,7 @@ file(GLOB shader_src "shader/*.cpp")
# The tracey library
add_library(tracey STATIC ${common_src} ${camera_src} ${light_src}
${primitive_src} ${renderer_src} ${scene_src} ${shader_src} light/ambientlight.cpp light/ambientlight.h)
${primitive_src} ${renderer_src} ${scene_src} ${shader_src} light/ambientlight.cpp light/ambientlight.h light/spotlight.cpp light/spotlight.h)
if(NOT WIN32)
target_link_libraries(tracey ${CMAKE_THREAD_LIBS_INIT} ${X11_LIBRARIES})
endif()

View file

@ -52,13 +52,13 @@ int main() {
// compile in release mode)
#ifdef OBJMODEL_FOUND
auto teapot0 = std::make_shared<ObjModel>(orange);
teapot0->loadObj("data/teapot.obj", Vector3d(2.0f, 2.0f, 2.0f), Vector3d(2.5f, -1.0f, 1.0f));
teapot0->loadObj("../data/teapot.obj", Vector3d(2.0f, 2.0f, 2.0f), Vector3d(2.5f, -1.0f, 1.0f));
auto teapot1 = std::make_shared<ObjModel>(red);
teapot1->loadObj("data/teapot.obj", Vector3d(2.0f, 2.0f, 2.0f), Vector3d(-3.0f, 1.0f, 0.0f));
teapot1->loadObj("../data/teapot.obj", Vector3d(2.0f, 2.0f, 2.0f), Vector3d(-3.0f, 1.0f, 0.0f));
auto teapot2 = std::make_shared<ObjModel>(blue);
teapot2->loadObj("data/teapot.obj", Vector3d(2.0f, 2.0f, 2.0f), Vector3d(-0.5f, -3.0f, -2.0f));
teapot2->loadObj("../data/teapot.obj", Vector3d(2.0f, 2.0f, 2.0f), Vector3d(-0.5f, -3.0f, -2.0f));
scene.add(teapot0);
scene.add(teapot1);

View file

@ -10,7 +10,7 @@
class AmbientLight : public Light{
public:
AmbientLight(float intensity, Color const &color = Color(1, 1, 1));
explicit AmbientLight(float intensity, Color const &color = Color(1, 1, 1));
Illumination illuminate(Scene const &scene, Ray const &ray) const override;

45
light/spotlight.cpp Normal file
View file

@ -0,0 +1,45 @@
#include "light/spotlight.h"
#include "scene/scene.h"
SpotLight::SpotLight(Vector3d position, Vector3d direction, float innerAngle, float outerAngle, float intensity,
const Color &color) : Light(intensity, color), position(position), direction(direction),
innerAngle(innerAngle), outerAngle(outerAngle) {};
Light::Illumination SpotLight::illuminate(Scene const &scene, Ray const &ray) const {
// Calculate distance to surface
Vector3d const x = ray.origin + (ray.length - SPLT_EPS) * ray.direction;
// Illumination object
Illumination illum;
illum.direction = normalized(x - this->position);
// Precompute the distance from the light source
float const distance = length(x - this->position);
// Define a secondary ray from the surface point to the light source.
Ray lightRay;
lightRay.origin = x;
lightRay.direction = -illum.direction;
lightRay.length = distance - SPLT_EPS;
//calculate angle
float angle = acos(dotProduct(x - this->position, this->direction) / (length(x - this->position)
* length(this->direction)));
if (!scene.findOcclusion(lightRay)) { // If the target is not in shadow...
// ... compute the attenuation and light color
if (angle > outerAngle * (PI / 180)) {
illum.color = Color(0, 0, 0);
} else if (angle > innerAngle * (PI / 180)) {
float outerIllumRange = (outerAngle - innerAngle) * (PI / 180);
float leftOverAngle = angle - innerAngle * (PI / 180);
float percentageOfAngle = leftOverAngle / outerIllumRange;
float illumValue = 1 - percentageOfAngle;
illum.color = (1.0f / (distance * distance) * this->color * this->intensity) * illumValue;
} else {
illum.color = 1.0f / (distance * distance) * this->color * this->intensity;
}
}
return illum;
}

21
light/spotlight.h Normal file
View file

@ -0,0 +1,21 @@
#ifndef CG1_TRACER_SPOTLIGHT_H
#define CG1_TRACER_SPOTLIGHT_H
#include "light/light.h"
class SpotLight : public Light{
public:
SpotLight(Vector3d position, Vector3d direction, float innerAngle, float outerAngle,float intensity, Color const &color = Color(1, 1, 1));
Illumination illuminate(Scene const &scene, Ray const &ray) const override;
protected:
Vector3d direction;
Vector3d position;
float innerAngle;
float outerAngle;
};
#endif //CG1_TRACER_SPOTLIGHT_H