Площадь освещения параллельна виду камеры - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь визуализировать изображение и знаю координаты камеры и объекта lookat. Я хочу создать область освещения (плоскость) позади камеры, но параллельно виду камеры.

Думаю, мне следует использовать правый и верхний векторы камеры. Но я не знаю, как это сделать. Позвольте мне показать вам несколько примеров кода:

TooN::Vector<3> eye = TooN::makeVector(camera_pos[0],camera_pos[1],camera_pos[2]);
TooN::Vector<3> lookat = TooN::makeVector(lookat_pos[0],lookat_pos[1],lookat_pos[2]);
TooN::Vector<3> look_dir = eye - lookat;
TooN::normalize(look_dir);
TooN::Vector<3> up_vec = TooN::makeVector(0.0f,1.0f,0.0f);
TooN::Vector<3> right = up_vec ^ look_dir;
//TooN::normalize(right); // I am not sure if I should use normalize here.
TooN::Vector<3> newup = look_dir ^ right;
TooN::normalize(newup); // I am not sure if I should use normalize here.
// ^ denotes cross product

Затем я скопировал некоторый код из github для генерации подсветки области:

optix::float3 v1     = optix::make_float3( 0.0f, 0.0f, -0.5f);
optix::float3 v2     = optix::make_float3( 0.5f, 0.0f, 0.0f);
createParallelogram(light.position,light.v1,light.v2);

Используя вышеупомянутые v1 и v2, я могу создавать только подсветку области на потолке.

Вот функция createParallelogram:

optix::GeometryInstance AreaLight::createParallelogram(const optix::float3& anchor,
const optix::float3& offset1, const optix::float3& offset2) {

optix::float3 normal = optix::normalize( optix::cross( offset1, offset2 ) );
float d = optix::dot( normal, anchor );
optix::float4 plane = optix::make_float4( normal, d );

optix::float3 v1 = offset1 / optix::dot( offset1, offset1 );
optix::float3 v2 = offset2 / optix::dot( offset2, offset2 );

parallelogram["plane"]->setFloat( plane );
parallelogram["anchor"]->setFloat( anchor );
parallelogram["v1"]->setFloat( v1 );
parallelogram["v2"]->setFloat( v2 );

return;

Я хочу знать, как установить v1 и v2, чтобы план мог быть параллелен виду камеры, чтобы осветить объекты (смотрите направление). Заранее спасибо !!

Обновление 1:

В соответствии с тем, что сказал @ Blindman67, я попытался установить createParallelogram((eye - look_dir)* .1, right * 2.0, newup * 0.5), затем я обнаружил, что изображение очень темное, я изменил его на createParallelogram( -(eye - look_dir)* .1, right * 2.0, newup * 0.5), теперь я освещаю область объектом (рисунок 1), и он стал ярче. Однако, когда я установил createParallelogram((eye - look_dir)* .7, right * 2.0, newup * 0.5), я могу видеть область света (прямоугольник) на визуализированном изображении. Я не хочу видеть эту форму. Знаете ли вы, как я должен контролировать размер или положение этого источника света? Спасибо!

цифра 1

...