将 glm.mat4 从 Python 传回 C++ (glm::mat4)
Passing glm.mat4 from Python back to C++ (glm::mat4)
>我有一个提升的python应用程序,它将一个类导出到Python,执行计算并将输出返回给C++:
import engine # c++ library
import glm # pyglm
class Game(engine.Application):
def __init__(self):
engine.Application.__init__(self, title, fullscreen)
self.shader = engine.Shader();
self.shader.setup("shader.vs", "shader.fs")
self.shader.setMat4("model", glm.mat4(1.0)
def update(self):
...
在其他类中,着色器被包装并从C++导出,如下所示:
struct ShaderWrap : Shader, boost::python::wrapper<Shader>
{
int setup(const char* vertexPath, const char* fragmentPath)
{
return Shader::setup(vertexPath, fragmentPath);
}
int setMat4(std::string name, glm::mat4 mat)
{
return Shader::setMat4(name, mat);
}
};
...
BOOST_PYTHON_MODULE(engine)
{
namespace python = boost::python;
...
python::class_<ShaderWrap, boost::noncopyable>("Shader")
.def("setup", &Shader::setup)
.def("setMat4", &Shader::setMat4)
;
...
}
该应用程序工作正常,直到self.shader.setMat4
调用,我收到错误:
Boost.Python.ArgumentError: Python argument types in
StaticShader.setMat4(StaticShader, str, glm::detail::tmat4x4)
did not match C++ signature:
setMat4(StaticShader {lvalue}, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, glm::mat<4, 4, float, (glm::qualifier)0>)
我试图将 mat4 值作为浮点数*传递回C++但没有成功。 我也尝试调用返回c_void_p
的value_ptr(mat4)
,但编译器抱怨说c_void_p
和void*
不是同一类型(也尝试了各种尝试用ctypes
库强制转换它(。 这个问题和这个问题基本上是同一个问题,但我在实现中迷失了方向。
在 PyGLM 文档中,开发人员说该库是用C++编写的。所以
传递glm.mat4
值以C++解释为glm::mat4
值的可能方法是什么?
我想传递一个glm.mat4,例如视图矩阵,在Python代码更新函数中更新回C++以供进一步使用,并希望pyGLM库/GLM库之间有一个相当简单的接口通过boost::p ython。提前谢谢。
最终就此问题联系了开发人员,这是有回应的:
这是矩阵对象在C++代码中的样子:
template<int C, int R, typename T>
struct mat {
PyObject ob_base;
uint8_t info;
glm::mat<C, R, T> super_type;
};
这很可能是它与 glm 矩阵不太兼容的原因。
如果您使用的是最新版本的 PyGLM,value_ptr(mat4)
应该返回一个LP_c_float
对象,即float*
。 我确信有一种方法可以将这样的指针转移到 boost::p ython,尽管正如我所说,我不知道如何。
从技术上讲,您可以将指针转换为整数,将其传输并将其转换回float*
。 可以使用以下命令获取指针的地址:
int.from_bytes(ptr, "little")
或者,您可以简单地发送字节对象。
as_bytes = bytes(mat4)
或者作为元组:
as_tuple = mat4.to_tuple()
或者作为一个numpy数组(它似乎有自己的boost::p ython::numpy模块(:
np_arr = numpy.array(mat4)
我能够通过将内存地址作为int*
传递回C++来获得正确的输出,然后进行一些切片以将其重新放入glm::mat4
中,但我发现这个解决方案太复杂了,最终手动包装了glm::mat4
类(有关如何实现此目的的基本示例,请参阅 https://stackoverflow.com/a/62672081/9238288(。
- 了解 GLM- openGL 中的相机转换
- OpenGl glm rotate
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在 glRotatef 中使用 glm::mat4
- OpenGL 转换无法使用 GLM 矩阵
- 将 glm.mat4 从 Python 传回 C++ (glm::mat4)
- OpenGL GLM 矩阵/向量未正确初始化
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 在OpenGL(GLM/C++)中使用四元数旋转时出现问题
- 将2个欧拉角与GLM相结合的问题
- GLM中的Java Matrix4.transform等价物
- CV :: MAT如何从/转换为GLM :: MAT4
- XYZ两个GLM :: MAT4矩阵的距离点对点
- glm::vec3 和 glm::mat4 是如何初始化的?
- 使用glm将vec3与mat4相乘
- 无法将 glm::mat4 元素push_back到头文件中声明的向量中
- 如何从 glm::mat4 读取值
- 将glm::mat4转换为XMFLOAT4X4
- 如何用数组初始化一个glm::mat4