【发布时间】:2020-06-21 07:55:10
【问题描述】:
我有一个 boost 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 值作为 float* 传递回 C++,但没有成功。
我也试过调用value_ptr(mat4),它返回一个c_void_p,但编译器抱怨说c_void_p和void*不是同一种类型(也尝试过使用ctypes库进行转换的各种尝试)。
this question 和 this question 基本上是同一个问题,但是我在实现中迷路了。
在 PyGLM 文档中,开发人员说该库是用 C++ 编写的。所以,
将glm.mat4 值传递给C++ 以被解释为glm::mat4 值的可能方法是什么?
我想传递一个 glm.mat4,例如视图矩阵,在 Python 代码更新函数中被更新回 C++ 以供进一步使用,并希望 pyGLM 库/GLM 库之间有一个相当简单的接口通过 boost::python。提前致谢。
【问题讨论】: