【问题标题】:Averaging normals results in zero-length vector平均法线导致零长度向量
【发布时间】:2013-04-06 18:24:17
【问题描述】:

我有四个法线,我试图通过添加 x、y 和 z 值来平均它们,然后对结果进行归一化。但是,当我添加不同的轴值时,结果向量的长度为零。我觉得这个问题很容易解决,但我对 OpenGL 比较陌生,还不知道向量的进出。

分别获取面法线和顶点法线的代码。

public Vector3f getNormal(Vector3f p1, Vector3f p2, Vector3f p3){
        Vector3f v = new Vector3f();

        Vector3f calU = new Vector3f(p2.x - p1.x, p2.y - p1.y, p2.z - p1.z);
        Vector3f calV = new Vector3f(p3.x - p1.x, p3.y - p1.y, p3.z - p1.z);

        v.setX(calU.getY() * calV.getZ() - calU.getZ() * calV.getY());
        v.setY(calU.getZ() * calV.getX() - calU.getX() * calV.getZ());
        v.setZ(calU.getX() * calV.getY() - calU.getY() * calV.getX());

        return (Vector3f)v.normalise();
    }

    public Vector3f getVectorNormal(Vector3f p){
        Vector3f t1 = getNormal(p, new Vector3f(p.getX() - 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() - 1));
        Vector3f t2 = getNormal(p, new Vector3f(p.getX() + 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() - 1));
        Vector3f t3 = getNormal(p, new Vector3f(p.getX() + 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() + 1));
        Vector3f t4 = getNormal(p, new Vector3f(p.getX() - 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() + 1));

        float x = t1.getX() + t2.getX() + t3.getX() + t4.getX();
        float y = t1.getY() + t2.getY() + t3.getY() + t4.getY();
        float z = t1.getZ() + t2.getZ() + t3.getZ() + t4.getZ();

        Vector3f v = new Vector3f(x, y, z);

        return (Vector3f)v.normalise();
    }

【问题讨论】:

  • Telthien 所说的。还有那些法线来自什么样的几何形状?
  • @datenwolf 他们来自三角形。
  • @Telthien 添加到原帖中。
  • @datenwolf 我...我不知道那是什么意思。就像我说的,我对 OpenGL 很陌生。您所说的“缠绕方向”是什么意思?
  • @mproncace:没关系,我刚刚注意到,你做了一些完全疯狂的事情。看我的回答。

标签: java opengl lwjgl


【解决方案1】:

这没有意义

    Vector3f t1 = getNormal(p, new Vector3f(p.getX() - 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() - 1));
    Vector3f t2 = getNormal(p, new Vector3f(p.getX() + 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() - 1));
    Vector3f t3 = getNormal(p, new Vector3f(p.getX() + 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() + 1));
    Vector3f t4 = getNormal(p, new Vector3f(p.getX() - 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() + 1));

您无法从单个点提取法线。无论你在那里加减什么,这都不是你应该做的。

更新

我认为您在这里主要是在努力学习线性代数基础知识。这并不是真正的 OpenGL 特定的。这是数学。我不能给你更好的建议,而不是拿一些关于这个主题的好教科书,然后学习它。

【讨论】:

  • @mproncace:给我一点时间,我已经在几个月前的 StackOverflow 答案中写下了这个,我现在正在寻找它。
  • @mproncace:我希望你觉得这个有用:stackoverflow.com/a/6661242/524368
  • @mproncace:根据定义,单个向量没有法线。法线是垂直于平面的单个矢量。但是对于一个向量,垂直于它的向量是无限的。
  • @mproncace:如果你想使用 OpenGL,你必须学习它所基于的数学:线性代数。您必须精通“向量空间”、“线性变换”、“向量”、“矩阵”以及在它们上定义的数学运算等术语。在不知道这些东西的情况下尝试使用 OpenGL 会非常非常困难。
  • 哎呀,意思是说“顶点”而不是“向量”。我阅读了您链接到的帖子,但我仍然不明白我在代码中做错了什么。我的代码需要一个顶点并用它来寻找周围的环境——哦……我想我现在看到了问题的一部分。我的代码试图通过操纵它们相交的 x 和 z 来找到共享一个顶点的四个全等三角形的法线的平均值。问题是,它们不是共面的。但是,我仍然不完全了解这是如何导致生成零长度向量的。我如何平均法线?我无法理解这方面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多