试图将CGAL 作为 Blender 插件:C++, pybind11, CMake, CLion, Eigen, NumPy

本文记录了将C++的CGAL代码转换为Blender插件的过程,主要涉及pybind11在Python和C++之间进行数据交换、配置Blender的Python开发环境以及编译动态库。作者探讨了如何在C++中使用Eigen与NumPy数组交互,以及如何在Blender的Python环境中安装和测试模块。
摘要由CSDN通过智能技术生成

1 起因

在一个参与的课题中,一直都是用C++基于CGAL编写一些处理网格(mesh)的代码。最近需要实现一个可视化,或者更进一步实现用户的简单交互。由于要同时兼顾对网格的编辑能力,我们一开始决定尝试将我们的代码变成一个Blender的插件(addon或plugin),这样既可以获得可视化的能力,又能利用Blender对网格进行其他编辑。我对Blender仅是听说过但没有真正使用过,经过两三天的尝试与折腾,目前感觉这个做成插件的想法是可行的。这里记录一下如何将基于CGAL的C++代码转换为Blender的插件的过程,主要关注网格数据如何从Blender传送到C++代码编写的部分。

对于Blender的各方面,尤其是使用上尚不是很熟悉,本文仅作为一个记录和参考,未来可能会更新更加合理或正确的方案。

2 基本结构

Blender是一款free的三维建模软件,用于设计三维图形,三维效果和动画效果,广泛应用在影视和游戏制作中。Blender自身设计了插件系统,用户可以通过Python脚本实现与Blender的自动化交互,基本的文档和教程可以参考其官方网站。

课题的主要处理对象是三角面网格,目前的代码是基于CGAL利用C++开发的。所以我们的初步想法是通过为我们的代码设计一组简单的Python wrapper,形成一个Python module,然后安装在Blender的Python环境下,使Blender的Python interpreter可以找到并import我们的module。

在简单Google之后,我决定使用pybind11作为设计Python wrapper的工具。没有别的原因仅是第一眼望见喜欢而已。

平时写C++用的IDE是CLion,本文会提及一些CLion的配置,其实可以忽略。

我们的目标平台是Linux,所以这里不涉及Windows和Mac,或者其他的平台。测试使用的系统如下

  • Ubuntu 20.04, GCC 9.3.0, CMake 3.16.3, Python 3.8.5
  • Eigen 3.3.90 (从GitHub下载并安装在本地的)
  • CGAL 5.1
  • pybind11 v2.6.2
  • Blender 2.91 with Python 3.7m

一个基本的组成图如下
基本组成部分
大体思路就是将C++代码编译成动态库,然后再通过pybind11的帮助编译成Python (extension) module的动态库,最后import到Blender的Python环境中。

3 概述

对于我而言,有两个关键的问题需要摸清楚

  • 如何方便的实现Python代码和C++代码之间的数据交换?
  • 如何使用Blender的Python环境而不是系统的?

这两个问题都会在下面的讨论中得到测试。为了完成上图中描述的系统,本文将通过如下几个章节总结摸索得到的经验。

  • pybind11环境配置和测试
  • 通过pybind11在Python(NumPy array)和C++(Eigen::Matrix)之间进行数据交换
  • 配置Blender的Python开发环境
  • 实现利用Blender的Python环境进行编译
  • 测试Blender插件

4 pybind11环境配置和测试

4.1 Python环境

需要进行有关Python (extension) module的开发,一般需要在系统上安装Python的开发环境

sudo apt-get install python3-dev

由于Ubuntu20.04默认的Python已经是Python3,所以上述命令明确要求安装Python3的相关文件。之后为了测试时不扰乱系统的Python环境,创建了一个Python virtualenv

virtualenv -p /usr/bin/python3 pybind11

pybind11是virtualenv的名称。之后activate这个新的virtualenv,更新pip安装numpy

pip install --upgrade pip
pip install numpy

4.2 测试pybind11

编译环境打算使用CMake。从pybind11的GitHub页面clone pybind11的CMake实例代码,并按照网页上的方式进行编译。注意,此时virtualenv是activate状态

git clone --recursive https://github.com/pybind/cmake_example.git
pip install ./cmake_example

上述实例代码将编译一个cmake_example module并安装在virtualenv的site_packages目录下,具体文件是

<virtualenv_path>/lib/python3.8/site-packages/cmake_example.cpython-38-x86_64-linux-gnu.so

5 测试使用pybind11为C++程序创建Python wrapper

5.1 pybind11

我这里把测试代码托管到我的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值