Glm四元数球面插值

6

我正在尝试在glm中使用四元数进行球面线性插值(SLERP)。 我正在使用

glm::quat interpolatedquat = quaternion::mix(quat1,quat2,0.5f)

这些是我添加的库

#include <glm/gtc/quaternion.hpp>
#include <glm/gtx/quaternion.hpp>
#include <glm/gtx/euler_angles.hpp>
#include <glm/gtx/norm.hpp>
#include <glm\glm.hpp>
#include <glm\glm\glm.hpp>
using namespace glm;

但是我无法让它工作。我添加了所有的glm四元数.hpp文件。
错误提示为“四元数”必须是一个类名或命名空间。

无法让它正常工作...是段错误吗?删除你的主目录? - genpfault
@genpfault 嘿,抱歉啊,我加上了我遇到的错误。 - james456
@genpfault 我尝试了glm::,但似乎没有解决它。 - james456
很好,你使用了 float 作为最后一个参数,否则会出现错误。 - mouse
1个回答

13
在GLM 0.9.4.6中,搜索所有文件找到namespace quaternion或者quaternion::只会得到一个被注释掉的gtc/quaternion.hpp的单行结果。所有公共的GLM功能都是直接实现在glm命名空间中的。实现细节存在于glm::detail和偶尔的glm::_detail中,但您不应该直接使用这些命名空间中的任何内容,因为它们可能在未来的版本中发生更改。

每个模块/扩展的子命名空间都没有被使用。因此,您只需要:

glm::quat interpolatedquat = glm::mix(quat1,quat2,0.5f)

你可能想在那里加上一个分号。

编辑:你可能还想使用glm::slerp而不是glm::mix,因为它有一个额外的检查来确保采取最短的路径:

// If cosTheta < 0, the interpolation will take the long way around the sphere. 
// To fix this, one quat must be negated.
if (cosTheta < T(0))
{
    z        = -y;
    cosTheta = -cosTheta;
}

在其他方面完全相同的情况下,mix版本中没有这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接