glm :: vec3 precision C ++

时间:2014-10-31 20:37:25

标签: c++ opengl glm-math

我正在使用glm库在C ++中创建碰撞检测系统。

我有一个定义为std::vector<glm::vec3> vertices的顶点数组和一个计算maxX,y,z的函数,定义为

GLfloat AssetInstance::maxX()
{
    GLfloat max = vertices.at(0).x;

    for(glm::vec3 vertex : vertices)
        if(vertex.x > max) max = vertex.x;

    return max;
}

但如果我运行以下代码:

std::vector<glm::vec3> testVector;
testVector.push_back(glm::vec3(3.0500346, 1.0, 1.0));
testVector.push_back(glm::vec3(3.0500344, 2.0, 2.0));
testVector.push_back(glm::vec3(3.0500343, 3.0, 3.0));

std::cout << maxX(testVector) << std::endl;

输出为3.05003

我认为glm::vec3double而且double比那更精确? 有一个更好的方法吗?我的maxX没有返回足够精确的结果。

2 个答案:

答案 0 :(得分:3)

试试setprecision。默认情况下它是6,这就是你得到的。

#include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>
int main()
{
    std::cout << "default precision (6): " << 3.0500346 << '\n';
    std::cout << "std::precision(10):    " << std::setprecision(10) << 3.0500346 << '\n';

    return 0;
}

输出(Coliru link):

clang++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
default precision (6): 3.05003
std::precision(10):    3.0500346

另一方面,你正在返回一个GLFloat,它是一个浮点数,而不是一个double,所以无论glm使用什么,你都将它转换为浮点数。所以最终,调用maxX会给你浮点精度,而不是double。

P.S:看看文档看起来有一种dvec类型让我怀疑vec默认使用double。

答案 1 :(得分:1)

不是它们是准备插入VBO的单精度float,顺便说一下是GLFoat

即使不会打印所有数字,您仍然可以获得正确的索引。