法线计算函数

原来总觉得这个公式是错的。渲染出来的图感觉是烂的,事实上的确是烂图,不过公式却是对的,只是还少了最后一步,我网上找了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;

//下图是直接使用法线值,渲染出的效果,很烂。
   OpenGL和D3D的灯光法线计算和渲染

 

统一规范化后,渲染出的效果基本可以接受了。
    OpenGL和D3D的灯光法线计算和渲染

以下是统一规范化的函数。通过感觉,随手写的,结果基本可以接受。应该有更好的算法。希望大能回复指正。

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;

应该有更好的算法。希望大能回复指正。

应该有更好的算法。希望大能回复指正。

相关文章:

  • 2021-09-18
  • 2021-07-03
  • 2021-11-11
猜你喜欢
  • 2021-05-26
  • 2021-06-20
  • 2021-10-24
  • 2021-11-28
  • 2022-01-05
  • 2021-09-22
  • 2021-07-20
相关资源
相似解决方案