C++ 计算顶点法线会产生奇怪的结果
我知道这已经被问了好几次了,但我的问题不是怎么做。我知道这是如何工作的(或者至少我认为是这样的^^^),但我的实现似乎有问题,我无法支持它。 我有一个程序生成的地形网格,我试图通过平均该顶点连接的所有三角形的法线来计算每个顶点的法线。将法线xyz设置为rgb顶点颜色时,它似乎是随机的黑色(0,0,0)或蓝色(0,0,1)C++ 计算顶点法线会产生奇怪的结果,c++,vectormath,C++,Vectormath,我知道这已经被问了好几次了,但我的问题不是怎么做。我知道这是如何工作的(或者至少我认为是这样的^^^),但我的实现似乎有问题,我无法支持它。 我有一个程序生成的地形网格,我试图通过平均该顶点连接的所有三角形的法线来计算每个顶点的法线。将法线xyz设置为rgb顶点颜色时,它似乎是随机的黑色(0,0,0)或蓝色(0,0,1) void CalculateVertexNormal(int index){//网格顶点数组中顶点的索引 std::vector index;//顶点所属三角形的索引 向量法线
void CalculateVertexNormal(int index){//网格顶点数组中顶点的索引
std::vector index;//顶点所属三角形的索引
向量法线=向量(0.0f,0.0f,0.0f,0.0f);//所有面法线的总和
对于(inti=0;ip2
向量v2=顶点[vertex+2]。GetLocation()-顶点[vertex]。GetLocation();//p1->p3
法线+=v1.Cross(v2);//用两条边的叉积来接收面法线
}
顶点[index].SetNormals(normals.Normalize());//规范化面法线之和并设置为顶点
}
也许有人可以看看,告诉我我做错了什么。
多谢各位
编辑:
多亏了molbdnilo的评论,我终于明白了问题所在。对数组进行索引是个问题,我的两个循环也有点混乱,也许我应该休息一下;)
我最终想到了这个,简化为一个循环:
for(int i = 0; i < triangles.size(); i += 3){
if(triangles[i] == index || triangles[i + 1] == index || triangles[i + 2] == index){
Vector v1 = vertices[triangles[i + 1]].GetLocation() - vertices[index].GetLocation();
Vector v2 = vertices[triangles[i + 2]].GetLocation() - vertices[index].GetLocation();
faceNormals += v1.Cross(v2);
}
}
vertices[index].SetNormals(faceNormals.Normalize());
for(int i=0;i
第二个循环不应该说顶点[三角形[顶点+1]]]
等等吗?我想你想要的是三角形的法线。因为任何两个相邻三角形都不需要(也不需要)是平面的,所以所有相邻三角形的法线相加实际上是没有意义的。想象3个三角形组成一座山峰。每个三角形法线将指向不同的方向。在顶点求和这些法线意味着什么?@Matt不,我在找顶点法线。您可以使用周围的面法线来计算它。@molbdnilo谢谢!你的回答让我想到了解决方案:)
for(int i = 0; i < triangles.size(); i += 3){
if(triangles[i] == index || triangles[i + 1] == index || triangles[i + 2] == index){
Vector v1 = vertices[triangles[i + 1]].GetLocation() - vertices[index].GetLocation();
Vector v2 = vertices[triangles[i + 2]].GetLocation() - vertices[index].GetLocation();
faceNormals += v1.Cross(v2);
}
}
vertices[index].SetNormals(faceNormals.Normalize());