java - 平均法线结果为零长度 vector

标签 java opengl lwjgl

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

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

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();
    }

最佳答案

这没有意义

    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 特有的。这是数学。我无法为您提供比获取一些有关该主题的优秀教科书并学习它更好的建议。

关于java - 平均法线结果为零长度 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15854462/

相关文章:

java - 处理复制/粘贴或键入时 Eclipse 太滞后

c++ - 如何缩放到 SDL 中的分辨率?

c++ - 这个顶点着色器在做什么?

java - 如何用LWJGL将图像保存到内存中?

java - 如何显示数组元素?

Java随机: Seeding Problem

c++ - OpenGL 着色器存储缓冲区/memoryBarrierBuffer

java - 缩放至 LWJGL 中的鼠标位置

java - 尝试用鼠标移动四边形/正方形 - LWJGL

java - 将 log4j2 与 slf4j 一起使用 : java. lang.StackOverflowError