我得到了表面法线和光线位置的点积。奇怪的是点积大于1.那个问题的编号为1。
第二个问题是我想将强度从0-> 1映射到浮点RGB从0-> 1 这是我的代码
if (the_object->polys[curr_poly].shading == 1)
{
// compute the dot product between the light source vector
// and normal vector to surface
dp = Dot_Product_3D((vector_3d_ptr)&normal,
(vector_3d_ptr)&light_source);
// test if light ray is reflecting off surface
if (dp > 0)
{
// now cos 0 = (u.v)/|u||v| or
intensity = ambient_light + ( dp / (the_object->polys[curr_poly].normal_length));
float r = the_object->polys[curr_poly].color.R*intensity;
float g = the_object->polys[curr_poly].color.G*intensity;
float b = the_object->polys[curr_poly].color.B*intensity;
Color color = Color(r, g, b, 1);
}
答案 0 :(得分:0)
我假设您了解标量产品是什么,无论如何它们都是|a|*|b|*cos Θ
。它们当然可以大于或小于1,因为cosθ最多为1,乘以向量,除非它们是单位向量肯定会导致各种数字。
另外,要在强度与RGB之间进行映射,(如果RGB在标准0-255范围内),乘以它对你没有多大帮助,你需要在范围之间将其标准化,如下所示:
(color / 255) * intensity
您还可以在值之间夹住颜色,这样就不会出现过度曝光等情况。
如果这没有帮助,请进一步澄清问题。 (我无法评论,所以我尽可能多地回答。)