法线计算函数
原来总觉得这个公式是错的。渲染出来的图感觉是烂的,事实上的确是烂图,不过公式却是对的,只是还少了最后一步,我网上找了3个多月,没人给出答案,现在我找到点碎玉,抛出了希望引得一些砖头。。
function g3NormalV(p1, p2, p3:Tg3DVector3d):Tg3DVector3d;
begin
Result.x := (p2.y-p1.y)*(p3.z-p1.z) - (p2.z-p1.z)*(p3.y-p1.y);
Result.y := (p2.z-p1.z)*(p3.x-p1.x) - (p2.x-p1.x)*(p3.z-p1.z);
Result.z := (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);
end;
//下图是直接使用法线值,渲染出的效果,很烂。
统一规范化后,渲染出的效果基本可以接受了。
以下是统一规范化的函数。通过感觉,随手写的,结果基本可以接受。应该有更好的算法。希望大能回复指正。
function g3NormalStandard(p1:Tg3DVector3d):Tg3DVector3d;
var zx,zy,b:Double;
begin
Result := p1;
// zx := Max(abs(p1.z), abs(p1.x));
// zy := Max(abs(p1.z), abs(p1.y));
zx := abs(p1.z) + abs(p1.x);
zy := abs(p1.z) + abs(p1.y);
b := Max(zx,zy);
if b = 0 then Exit;
b := 1/b;
Result.x := p1.x * b;
Result.y := p1.y * b;
Result.z := p1.z * b;
end;
应该有更好的算法。希望大能回复指正。
应该有更好的算法。希望大能回复指正。