与专业3D建模软件相比,geant4的3D绘制低效且不直观。如果你既想要3D的灵活设计,又想Geant4把它用起来,做到从图1到图2的效果:

图1. 一个通用编码成像模型

图2. 将3D模型导入Geant4
目录
1. Blender绘制3D模型并导出为*.obj格式文件
2. Geant4导入*.obj文件并抽取3D模体
3. 总结与展望
1. Blender绘制3D模型并导出为*.obj格式文件
a. Blender简单介绍
官网www.blender.org,开源3D设计软件,功能强大,入门学习资料见
https://docs.blender.org/manual/en/latest/。
b. 建模操作入门
Blender默认长度单位为m,可在“Properties”栏目->Scene->Units->Length中,更改长度显示单位。

图3. 更改Blender显示长度单位
c. 巧用阵列修改器,构建自己想要的规律排布阵列
我们来看如何创建一个10*10的长条阵列,单元尺寸2*2*15mm3,单元间隔2.5mm:
1. 创建一个单元尺寸长条:
快捷键N/n调出场景属性栏,Item->Dimensions中设置长条几何,然后View->ClipStart设置的小一点如0.01mm,表示场景视野的可显示最小尺度(再小就不予显示)。

图4 长条几何与显示设置
2. 添加阵列修改器,并添加材质属性:
选中长条以后,在“Properties”栏目->Add Modifier->Array中,总共添加X/Y方向两个Array偏移,形成阵列。

图5-1 给长条添加X和Y方向的阵列偏移
将阵列Item->Location调整到中心位置处,并在属性栏中材质选项添加材质显示效果。此外快捷键shift+A添加一个或多个光源Light,来优化视觉效果,菜单栏->Render可以渲染当前场景。

图5-2 添加材质
3. 给目标模体命名:
在”Scene Collection”->Collection图层中,对模体重命名,包括实体和顶点编辑组。

图6 模体名字修改
4. 导出*.obj文件:
一同默认导出的还有*.mtl材质文件,G4中用不到。菜单栏中File->Export->Wavefront(.obj)导出*.obj文件。

图7 *.obj文件导出
2. Geant4导入*.obj文件并抽取3D模体
a. CADMesh基本操作
https://github.com/christopherpoole/CADMesh,
1) 将CADMesh.hh拷贝到/B1/include/下
2) 将*.obj模型文件存入/B1/下
3) 在/B1/B1DetectorConstruction.cc中#include ”CADMesh.hh”
4) 导入模型
b. Geant4导入操作
1. 参见Blender中对不同模体的命名:

图8 不同模体的命名
2. 导出文件名为20200708-mura19camera.obj,存入/B1/,vi *.obj打开看一看:

图9 vi打开*.obj
可以在vi命令模式下搜索:/mask19、:/baso4,确保三个模体命名没问题。
3. Geant4中/B1/B1DetectorConstruction.cc的具体代码实现:
auto mesh =CADMesh::TessellatedMesh::FromOBJ("20200708-mura19camera.obj");
mesh->SetScale(1000.0);
//to change the Blender default basic unit(m) to mm
G4VSolid*solid[3];
G4Stringmeshname[3]={"mask19","baso4","scintillator"};
G4LogicalVolume*logic[3];
for (inti=0;i<3;i++)
{
solid[i] =mesh->GetSolid(meshname[i]);
logic[i]=newG4LogicalVolume(solid[i],env_mat,meshname[i]);
new G4PVPlacement(0,G4ThreeVector(),logic[i],meshname[i],logicWorld,false,0,checkOverlaps);
//此段代码仅作演示,实际上solid[2]需要放置到solid[1]当中。
}
注意:当采用默认G4ThreeVector()时,三者的相对及绝对位置与Blender一致,事实上很多情况下反而会带来麻烦,我们本希望每个抽取的solid的中心默认位置为(0,0,0)。
4. 总结与展望
从Blender建模到导入Geant4可以概括为以下几点:
- 在Blender中建立模型,注意模体命名包括实体及顶点编辑组;
- 在Geant4中按名字导入solid,注意单位换算,solid初始默认位置与Blender一致。
展望:
通过官网学习资料,对于Blender达到基本的几何建模要求少则几天,且配合其动画演示可以丰富自己设计的展示。*.obj格式将3D几何存储为纯文本ASCII文件,可以打开查看,每个模体名字后跟随其相关的顶点和面坐标。待熟练整个流程后,便是简单的Blender建模加Geant4使用。
