【问题标题】:glm::vec3 and epsilon comparisonglm::vec3 和 epsilon 比较
【发布时间】:2015-12-05 09:42:31
【问题描述】:

我想检查 glm::vec3 是否等于零向量 glm::vec3(0,0,0)

直到现在我还在写

if(v == glm::vec3(0,0,0))
    ...

但后来我了解了 epsilon,所以我的问题是,是否有比像这样显式比较更快(更易读)的方法来执行此检查:

if(abs(v.x) < EPSILON && abs(v.y) < EPSILON && abs(v.z) < EPSILON)
    ...

【问题讨论】:

  • 如果你想使用 epsilon 比较 取决于你是否真的想测试向量是否为 0 或者你想检查一个向量接近 0。进行正确的 epsilon 比较 并非易事,而且在不知道确切用例的情况下无法告诉您。
  • 我想检查向量的所有元素是否都等于0。
  • 如果您想检查它们是否完全正确 0,那么您不需要进行 epsilon 测试。
  • 但是如果 v.x 设置为 0,那么它实际上可能在内存中接近于 0,然后 ==0 测试可能会失败。没有?
  • 如果您使用v.x = 0.0f;,那么v.x 正好为零,因为零可以表示为精确值。

标签: opengl glm-math


【解决方案1】:

你也可以使用 glm 的epsilon comparison functions: epsilonEqual。它们在 glm/gtc/epsilon.hpp 中声明

【讨论】:

    【解决方案2】:

    一种更易读(也许更快)的方法可能是使用 glms 向量比较方法:

    if (glm::all(glm::lessThan(glm::abs(v), glm::vec3(EPSILON)))) ...
    

    或者可以比较向量的长度(或平方长度,因为这不需要平方根计算)而不是元素:

    if (glm::length2(v) < EPSILON * EPSILON) ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2018-03-21
      相关资源
      最近更新 更多