Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ LookAt的GLM-SIMD实现_C++_Opengl_Sse_Simd_Glm Math - Fatal编程技术网

C++ LookAt的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

我在使用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 )
{
    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实现,因为它不会成为性能瓶颈,除非您正在做一些非常奇怪的事情。这闻起来像是过早的优化,除非你是为了教育而这样做的。