首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >真实光可视化(数学相关)

真实光可视化(数学相关)
EN

Stack Overflow用户
提问于 2014-12-20 15:11:12
回答 2查看 147关注 0票数 3

我确实有一个问题,真实的灯光可视化(在应用中)。当前的可视化看起来如下:

它所做的是--如果光的亮度是低的--只有椭圆的中间部分是完全的亮度,这是在看到光色的同时更好地显示低光情况的方法,等等。

使用的公式:

代码语言:javascript
复制
current_ellipse_count = 15; // draw 15 ellipses from small to big one.
brightness = 100; // range is 0 to 255 ! lets say its 'white' light only, so r,g,b are equal.

while (current_ellipse_count > 0) {
    //DRAW small-to-big ELLIPSE AND FILL IT WITH ellipse_brightness. first drawn ellipse is small, and highest current_ellipse_count. so highest amplifying effect of brightness.
    ellipse_brightness = brightness*current_ellipse_count; // so the last ellipse will be real brightness(the biggest one) and the smallest one is always amplified by 15, bigger by 14, etc till the last one is amplified by 1. 
    if (ellipse_brightness > 255) ellipse_brightness = 255; // if it peaks its full brightness then.
    current_ellipse_count--;
}

这是我正在做的事情的简化方式。

这种方式成功地可视化了低亮度的情况,但在高亮度值下,假设200 (在0-255范围内)仅在椭圆的最后、最大、1像素的边框显示光不是完全明亮的。

我需要一个更好的公式,以正确地显示低亮度的情况和高亮度的情况应该降低。我认为我需要一个公式,降低给定的亮度值,以某种方式影响它从中途125 (从0-255范围)到255范围,或更好地更新整个亮度调整影响。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-20 17:11:19

我认为有几种方法可以很好地发挥作用:

代码语言:javascript
复制
1: ellipse_brightness = (int) (pow(brightness, 0.5) * current_ellipse_count * 2);

这应该会给你更好的可视化在高亮度水平。您可以调整功率(0.5)和因数(2),以适应您的需要。

代码语言:javascript
复制
2: ellipse_brightness = (int) (brightness * 200 / pow(16 - current_ellipse_count, 2));

这使用逆平方定律,它应该给你一个类似的影响,通过改变现有的线性下降。根据需要调整恒定因子(200)和功率(2)。

您可以将这两者结合起来,以获得可能更好的效果(通过试验和错误,我发现亮度看起来更好):

代码语言:javascript
复制
3: ellipse_brightness = (int) (pow(brightness, 2) * 0.75 / pow(16 - current_ellipse_count, 2));
   if (ellipse_brightness > brightness*4) ellipse_brightness = brightness*4;

最后,@Furkan的回答给了我一个使用cos()的想法

代码语言:javascript
复制
4: ellipse_brightness = (int) (brightness * cos((16 - current_ellipse_count)/15*3.1415926/2) * 2);

所有这些方法的输出都类似于以下图像(原始图像,#1-4从上到下,从左到右,亮度为0-255,步长为16):

您可以使用所有方法的参数来稍微调整一些东西,或者根据需要组合多个方法。

票数 0
EN

Stack Overflow用户

发布于 2014-12-20 16:52:56

您的寻找漫射和镜面阴影也作为1/(radius*radius)强度。我把它修改为1/(4 * pi * radius * radius)。只要图像看起来很好,你就可以在上面做实验。

你可以谷歌漫射和镜面阴影。有很多消息来源。

代码语言:javascript
复制
// Diffuse Shading (Lambertian)
            RGB diffuse;
            float cosineAlpha = objectNormal.dot(lightVector);
            cosineAlpha = abs(cosineAlpha);
            if(cosineAlpha > 0)
            {
                diffuse.r = intensity.r * cosineAlpha * objects[closestObjectId]->matProperty.diffuse.r;
                diffuse.g = intensity.g * cosineAlpha * objects[closestObjectId]->matProperty.diffuse.g;
                diffuse.b = intensity.b * cosineAlpha * objects[closestObjectId]->matProperty.diffuse.b;

                objectColor.r += diffuse.r;
                objectColor.g += diffuse.g;
                objectColor.b += diffuse.b;
            }

// Specular Shading (Blinn-Phong)
            RGB specular;
            Vector3 halfVector;
            halfVector.setX((lightVector + v).x() / ((lightVector + v).length()));
            halfVector.setY((lightVector + v).y() / ((lightVector + v).length()));
            halfVector.setZ((lightVector + v).z() / ((lightVector + v).length()));
            float cosineTeta = objectNormal.dot(halfVector);   
            cosineTeta = abs(cosineTeta); 
            if(cosineTeta > 0)
            {
                float coeff = pow(cosineTeta, objects[closestObjectId]->matProperty.specExp);
                specular.r = intensity.r * coeff * objects[closestObjectId]->matProperty.specular.r;
                specular.g = intensity.g * coeff * objects[closestObjectId]->matProperty.specular.g;
                specular.b = intensity.b * coeff * objects[closestObjectId]->matProperty.specular.b;

                objectColor.r += specular.r;
                objectColor.g += specular.g;
                objectColor.b += specular.b;                        
            }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27581511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档