我正在使用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::vec3
是double
而且double
比那更精确?
有一个更好的方法吗?我的maxX没有返回足够精确的结果。
答案 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
。
即使不会打印所有数字,您仍然可以获得正确的索引。