【发布时间】:2021-01-01 01:26:58
【问题描述】:
我正在尝试根据三角形的 3 个顶点计算 C++(和 OpenGL)中三角形的表面法线。对于未旋转的三角形,我得到了正确的结果,但是对于旋转的三角形,我得到了半正确的结果。不知道我做错了什么。预期的结果应该是为三角形 1(未旋转)返回一个向量 (1, 0, 0),为三角形 2(在 Y 轴上旋转 90 度)返回一个向量 (0, 0, -1),但是我得到 (1, 0 , 0) 对于三角形 1 和 (-4.15243e-08, 1.82413e-08, -1)
如您所见,第一个向量和第二个法线向量的 Z 分量是正确的,但是第二个向量的 X 和 Y 分量在很大程度上是不准确的,因为它们都应该为零
我的代码是一个使用 GLM 的非常简单的函数:
void CalcSurfaceNormal(glm::vec3 tri1, glm::vec3 tri2, glm::vec3 tri3)
{
//tri1 tri2 and tri3 are the triangles 3 vertices
//Simple algorithm followed from another stack overflow article
glm::vec3 u = tri2 - tri1;
glm::vec3 v = tri3 - tri1;
glm::vec3 nrmcross = glm::cross(u, v);
nrmcross = glm::normalize(nrmcross);
std::cout << "NormalCrs " << nrmcross.x << " " << nrmcross.y << " " << nrmcross.z << "\n";
}
附加信息: 三角形参数现在没有改变,所以我可以让它工作
第一个正确的调用传入了这些 vec3: (0.970976, -0.0246142, -0.0621899) (0.970976, 0.0553858, 0.0178101)' (0.970976, -0.0246142, 0.117237)
最后一个 z 组件正确的第二个调用传入了这些 vec3: (1.93781, 0.0246142, 0.0290235) (2.01781, 0.0553858, 0.0290235) (2.11724, -0.0246142, 0.0290235)
【问题讨论】:
-
-4.15243e-08和1.82413e-08几乎为零,称这很大程度上不准确可能有点错误。 -
-4.15243e-08。这是可以预期的浮点错误。参见,例如,Is floating point math broked -
参数向量的值是您之前计算得出的,还是您打印出来的,还是您手动输入的?您是否尝试打印出向量
u和v的值? -
它们是由早期计算产生的,但是我已经确保并跨过我的代码,并确保这些旋转的顶点是正确的。打印出损坏的 U 和 V 的值是“U COMP: 0.08 0.08 -1.86265e-09 V COMP: 0.179427 0 -7.45058e-09” 我认为这是 C++ 本身的浮点错误,而不是我的代码。有谁知道我该如何解决这个问题?我需要这个值非常准确,因为我需要一个分离轴来执行分离轴定理以进行碰撞检测
-
你是什么意思很大程度上不准确? -0.00000004 非常接近于 0。
标签: c++ algorithm math opengl collision-detection