partio是迪士尼2010年推出的仿真粒子格式转换器。
可以用来统一houdini、renderMan、Maya等不同软件中的粒子数据格式(GEO, BGEO, PTC, PDB, PDA)。
它可以作为C++的一个库使用,也同时具有python的API。但是python API较慢,建议C++。
首先了解下数据格式。
partio只是个数据转换器,它在磁盘上是没有自己的格式的。但是你可以想象它在内存中具有一定的数据格式。基本格式就是粒子编号+粒子属性。
如下所示
Number of particles: 9998
Type Count Name
---- ----- ----
VECTOR 3 position
VECTOR 3 v
INT 1 id
INT 1 parent
FLOAT 3 Cd
particle 0 position 0.536567 1.17344 0.523275
particle 1 position 0.495414 0.913424 0.434151
粒子具有id,然后具有4个属性。
首先请注意:该库依赖于zlib。因此请先自行安装zlib。windows下建议用vcpkg安装。
我们下载好源代码,把里面的lib文件夹下面的源码拷贝到自己的项目中。
比如我们新建一个空白的文件夹my_partio
目录结构为
目录结构为
.
├── CMakeLists.txt
├── DataDir.h
├── Filesystem.h
├── Partio.h
├── PartioAttribute.h
├── PartioIO.h
├── PartioIterator.h
├── PartioVec3.h
├── core
├── io
├── test.bgeo
└── test_mypartio.cpp
其中test.bgeo是从下载的源码的data文件夹下拷贝过来的,用于测试。
我们写一个最简单的测试程序
test_mypartio.cpp
#include "Partio.h"
using namespace Partio;
int main()
{
// 读取文件
Partio::ParticlesDataMutable* data=Partio::read("E:/codes/try/partio/my_partio/test.bgeo");
// 计算粒子数目
std::cout<<"Number of particles "<<data->numParticles()<<std::endl;
}
更改CMakeLists.txt文件
cmake_minimum_required(VERSION 3.21)
project(test_mypartio)
file(GLOB io_cpp "io/*.cpp")
file(GLOB core_cpp "core/*.cpp")
add_library(mypartio ${io_cpp} ${core_cpp})
set_target_properties(mypartio PROPERTIES
OUTPUT_NAME mypartio
POSITION_INDEPENDENT_CODE ON
)
IF(MSVC)
target_compile_definitions(mypartio
PRIVATE
PARTIO_WIN32=1
_USE_MATH_DEFINES=1
)
target_compile_options(mypartio
PRIVATE
/W0)
# ADD_DEFINITIONS (-DPARTIO_WIN32 -D_USE_MATH_DEFINES)
# set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W0")
ELSE(MSVC)
target_compile_options(mypartio
PRIVATE
-Wextra
-Wno-unused-parameter
-fPIC
-w)
# ADD_DEFINITIONS (-Wextra -Wno-unused-parameter)
# SET( CMAKE_CXX_FLAGS "-fPIC -w")
ENDIF(MSVC)
target_compile_definitions(mypartio
PRIVATE
PARTIO_USE_ZLIB=1)
# ADD_DEFINITIONS (-DPARTIO_USE_ZLIB)
target_include_directories(mypartio
PUBLIC
${CMAKE_CURRENT_LIST_DIR}
)
find_package(ZLIB REQUIRED)
if (ZLIB_FOUND)
target_link_libraries(mypartio PUBLIC ZLIB::ZLIB)
endif()
# target_include_directories(mypartio PRIVATE ../zlib/src)
option(TEST_MYPARTIO "test my partio" ON)
if(TEST_MYPARTIO)
add_executable(test_mypartio test_mypartio.cpp)
target_compile_definitions(test_mypartio PRIVATE PARTIO_USE_ZLIB)
target_link_libraries(test_mypartio mypartio )
endif()
打印结果:
Number of particles 5
下期:
继续探索partio