C++ LookAt的GLM-SIMD实现
我在使用glm数学库和simd时遇到问题。 我在计算注视矩阵时遇到了一个问题 遵循我的观察功能:C++ LookAt的GLM-SIMD实现,c++,opengl,sse,simd,glm-math,C++,Opengl,Sse,Simd,Glm Math,我在使用glm数学库和simd时遇到问题。 我在计算注视矩阵时遇到了一个问题 遵循我的观察功能: FORCE_INLINE_ALWAYSINLINE const glm::detail::fmat4x4SIMD LookAt( const glm::detail::fvec4SIMD &eyePos, const glm::detail::fvec4SIMD &lookAtPos, const glm::detail::fvec4SIMD &upVec ) { g
FORCE_INLINE_ALWAYSINLINE const glm::detail::fmat4x4SIMD LookAt( const glm::detail::fvec4SIMD &eyePos, const glm::detail::fvec4SIMD &lookAtPos, const glm::detail::fvec4SIMD &upVec )
{
glm::detail::fvec4SIMD v3X, v3Y, v3Z;
v3Y = glm::normalize(upVec);
v3Z = glm::normalize(eyePos - lookAtPos);
v3X = glm::normalize(glm::cross(v3Y, v3Z));
v3Y = glm::cross(v3Z, v3X);
glm::detail::fmat4x4SIMD m4EyeFrame = glm::detail::fmat4x4SIMD(v3X, v3Y, v3Z, eyePos);
return m4EyeFrame;
}
不幸的是,它工作不好,例如:
如果eyePos相机位置在0,0,-10,lookAtPos目标位置在0,0,0,并且对象在该位置,则视图工作正常。但如果我在X轴或Y轴上移动eyePos,模型看起来会像拉伸一样变形或消失,好像它已经离开了平截头体,但实际上它仍然在平截头体内部。
注:fvec4SIMD的每四个元素设置为1.0f 我也读过这篇文章: 但由于行到列的转换,我无法在fmat4x4SIMD中使用,也许我需要洗牌所有元素以从行到列转换,但我不知道如何快速完成。这只是我的印象,但问题可能出在别处
有什么建议吗?注意:fvec4SIMD的每四个元素设置为1.0f,不应该是upVec,而是应该是0.0fHi ratchet,我尝试了你的建议,但它不起作用,但你让我认为将右向量和前向向量的“w”值也设置为0,我用来乘以相机矩阵位置。。。而且很有效!!!谢谢我有一个建议,您可能不喜欢:您不需要lookAt的SIMD实现,因为它不会成为性能瓶颈,除非您正在做一些非常奇怪的事情。这闻起来像是过早的优化,除非你是为了教育而这样做的。