我正在尝试渲染图像,并且我知道相机的坐标和观察对象。我想在相机后面创建一个区域光(平面),但与相机视图平行。
我想我应该使用相机的右和上向量。但我不知道该怎么做。让我向您展示一些代码示例:
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)
,我可以在渲染图像中看到区域光(矩形)。我不想看到这个形状。你知道我应该如何控制这个灯的大小或位置吗?谢谢!