2011-04-07 32 views
0

我在OpenGL中使用几何,我现在正在使用光照。我注意到,如果我翻译我的几何图形,法线不会跟随,因此是无用的。带有OpenGL法线的矩阵转换

你如何将几何矩阵应用到几何体并保持法线?

目前我使用下面的代码:

 GL.PushMatrix(); 

     if (Offset != null) 
     { 
      GL.Translate(Offset.X, Offset.Y, Offset.Z); 
     } 
     GL.Begin(BeginMode.Triangles); 
     foreach (var face in Faces) 
     { 
      foreach (var i in face) 
      { 
       var point = Points[i - 1]; 
       GL.Normal3(point); 
       GL.Vertex3(point); 
      } 
     } 
     GL.End(); 
     GL.PopMatrix(); 

当我给几何偏移量,它不能正常显示(如法线不正确映射

任何帮助将优秀

ps的,我使用的是OpenTK包装,但正规的OpenGL直接穿过转换

编辑:。

好吧,如果我上面的代码更改为以下:

 GL.PushMatrix(); 

     //if (Offset != null) 
     //{ 
     // GL.Translate(Offset.X, Offset.Y, Offset.Z); 
     //} 
     GL.Begin(BeginMode.Triangles); 
     foreach (var face in Faces) 
     { 
      foreach (var i in face) 
      { 
       var point = Points[i - 1]; 
       if (Offset == null) 
       { 
        GL.Normal3(point); 
        GL.Vertex3(point); 
       } 
       else 
       { 
        var pt = new Vector3d(Offset.X + point.X, Offset.Y + point.Y, Offset.Z + point.Z); 
        GL.Normal3(pt); 
        GL.Vertex3(pt); 
       } 
      } 
     } 
     GL.End(); 
     GL.PopMatrix(); 

一切呈现罚款。

这里有一些截图(各自对自己的代码)

Shading not working Shading working

+2

我不确定你想要做什么......法官们不打算翻译。法线是方向,他们没有立场的概念。这就是为什么他们的_w_组件是零。 – Damon 2011-04-07 20:16:52

+0

如果我将偏移量设置为{0,0,0},则对象呈现正常,但如果我完全改变偏移量,则会将法线拧紧。难道我做错了什么? – 2011-04-07 20:19:01

+1

不是。在新的“工作”代码中,进入法线的值不是正确的法线,因为您使用点代替点。它们不是长度为1(你使用的是GL_NORMALIZE?),并且在z方向有严重的偏差。 – 2011-04-08 18:16:50

回答

0

我怀疑你的法线都很好,但你不能够正确地更新光源的位置和/或方向。查看OpenGL FAQ Chapter 18,特别是18.050。

+1

好吧,我添加了一个更新。让我知道这是否能揭示这件事(笑) – 2011-04-07 20:48:46