【问题标题】:Matrix Translations with OpenGL Normals使用 OpenGL 法线进行矩阵转换
【发布时间】:2011-04-07 20:13:26
【问题描述】:

我正在使用 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();

当我给几何体一个偏移量时,它不能正确渲染(例如,法线没有正确映射。

任何帮助都会非常好。

p.s.,我使用的是 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();

一切都很好。

这里是一些截图(根据他们的代码)

【问题讨论】:

  • 我不确定您要做什么...法线不是要翻译的。法线是方向,它们没有位置的概念。这就是他们的 w 分量为零的原因。
  • 如果我将偏移设置为 {0,0,0},则对象渲染良好,但如果我完全更改偏移,则会破坏法线。我做错了吗?
  • 并非如此。在您的新“工作”代码中,进入法线的值不是正确的法线,因为您使用的是 pt 而不是点。它们的长度不是 1(您使用的是 GL_NORMALIZE 吗?)并且在 z 方向上存在严重偏差。
  • @Paul,你说得对。我正在拉点值,而不是点的正常值。 Blah,它看起来很简单,但当你不思考时,你永远找不到它!

标签: c# opengl graphics opentk normals


【解决方案1】:

我怀疑你的法线没问题,但你没有正确更新你的灯光位置和/或方向。查看OpenGL FAQ Chapter 18,尤其是18.050。

【讨论】:

  • 好的,我添加了更新。让我知道这是否对此事有所启发(笑)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多