我目前正在OpenGL计划中编写转换实现。我正处于需要旋转编码的位置。这是个问题:
我有四元数,但是顶点着色器不是(例如,没有四元数"乘法"在GLSL语言中,据我所知)。虽然我可以理解四元数的有用性,但似乎无论如何我最终都必须使用矩阵。我该怎么办?我是否使用四元数并将它们转换为变换矩阵,或者是否有其他我缺失并应该做的事情(可能在顶点着色器中对四元数乘法进行硬编码)?
答案 0 :(得分:2)
了解现代OpenGL轮换的一个很好的资源是从opengl-tutorial.org阅读Tutorial 17: rotations。我不会一字一句地复制页面,但简而言之,
你不在GLSL中使用四元数。将四元数转换为旋转矩阵,并在模型矩阵中使用它。您的顶点将像往常一样使用模型 - 视图 - 投影矩阵旋转。
答案 1 :(得分:1)
通常,您可以将所有转换组合成单个模型 - 视图 - 投影矩阵并将其传递给着色器。
但是如果您需要在glsl中执行四元数旋转(例如,您可以使用quats来节省内存),那么您可以使用此代码通过规范化的四元数来旋转矢量:
vec3 quat_transform( vec4 q, vec3 v )
{
return v + 2.*cross( q.xyz, cross( q.xyz, v ) + q.w*v );
}