我有四个法线,我试图通过添加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();
}
答案 0 :(得分: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特定。这是数学。我不能给你更好的建议,而不是抓住一些关于这个主题的好教科书,好吧,学习它。