程序化建模

PeriDyno程序化建模概述

  • 本部分文档将着重介绍PeriDyno的程序化建模能力,包含基本几何体、车削模型、挤出模型、复制模型等。

一、基本几何体介绍

  • PeriDyno当前提供了立方体、球体、圆柱体、圆锥体四种基本几何体,均继承于ParametricModel类,且最终可以输出TriangleSet数据,以描述三角网格结构。四种基本几何体均具有位置(Location)、旋转(Rotation)、缩放(Scale)的共有属性,以便调整基本几何体变换。此外每个基本集合体又依据其特性有其独有的属性。

  • 立方体Cube:具有Length及Segments属性以定义其三个轴向的边长与分段数。

  • 球体Sphere:具有Radius及Theta属性以定义其半径与分段数。

  • 圆柱体Cylinder:具有Columns、Row、End Segment、Radius、Height属性以定义其垂直分段数、水平分段数、端面分段数、半径、高度。

  • 圆锥体Cone:具有Columns、Row、Radius、Height属性以定义其垂直分段数、水平分段数、半径、高度。

二、程序化模型的创建与编辑

  • 图形界面 中的创建与编辑:

首先确保Main函数中调用了Modeling::initStaticPlugin()以构建工具架。

Modeling::initStaticPlugin();

创建方法1:在图形界面上方切换到Modeling标签,点击下方基本几何体按钮以创建对应节点(如图中红色框所标识的部分)。

创建方法2:在节点工作区点击鼠标右键,搜索需要的几何体类名,点击以创建对应节点(如图中绿色框所标识的部分)。

编辑:点击所需要修改的节点使其高亮显示,修改属性编辑面板Property Editor参数以编辑基本几何体参数。

  • C++ 中的创建与编辑:

本示例从Qt_GUI_Empty空场景示例为起点构建。

1、引用所需要使用的类如立方体#include “CubeModel.h”

2、构建场景图 std::shared_ptr < SceneGraph > scn = std::make_shared< SceneGraph >();

3、为scn场景图添加CubeModel节点 auto Cube = scn->addNode(std::make_shared< CubeModel< DataType3f > >());

4、设置场景图window.setSceneGraph(scn);

		#include <QtApp.h>
		#include "initializeModeling.h"
		#include "initializeInteraction.h"

		#include "CubeModel.h"

		using namespace dyno;

		int main()
		{
			
			std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();
			auto Cube = scn->addNode(std::make_shared<CubeModel<DataType3f>>());

			Modeling::initStaticPlugin();
			Interaction::initStaticPlugin();
			QtApp window;
			window.setSceneGraph(scn);
			window.createWindow(1366, 768);
			window.mainLoop();

			return 0;
		}

构建完成后运行效果如下:

创建基本几何体后可以通过->获取变量,并使用SetValue()设置参数。

		Cube->varLength()->setValue(Vec3f(0.5,0.2,0.5));
		Cube->varRotation()->setValue(Vec3f(0,45,0));
		Cube->varLocation()->setValue(Vec3f(0,-0.1,0));

修改完成后运行效果如下:

三、其他程序化建模功能

1、TurningMode能够根据输入的PointSet创建车削模型。

  • TurningModel在图形界面中的使用:

首先点击ObjPointLoader按钮,创建ObjPoint节点,选择Obj点集文件路径,以作为TurningModel的输入。

点击TurningModel按钮,创建TurningModel节点。将ObjPoint的PointSet输出连接到TurningModel的PointSet输入端。

选择ObjPoint节点,点击节点右上角按钮隐藏显示。

  • TurningModel在C++中的使用:

1、引用ObjPoint、TurningModel的头文件

		#include "Plugin/ObjIO/ObjPointLoader.h"
		#include "Turning.h"

2、创建曲线

		//创建曲线
		auto Curve = scn->addNode(std::make_shared<ObjPoint<DataType3f>>());
		Curve->varFileName()->setValue(getAssetPath() + "curve/curve06_subdivide.obj");

3、创建Turning模型,在场景图scn上添加TurningModel节点

		//创建Turning模型
		auto Turn = scn->addNode(std::make_shared<TurningModel<DataType3f>>());

4、将Curve的OutPointSet连接到TurningModel的inPointSet

		Curve->outPointSet()->connect(Turn->inPointSet());

5、修改Turning参数,将垂直分段数提高到50以使模型更加精细。

		Turn->varColumns()->setValue(50);

构建完成后运行效果如下:

2、合并Merge能够对输入的多个TriangleSet合并为一个TriangleSet。

  • Merge在图形界面中的使用:

本部分以上文构建的Turning和Cube为起点,展示Merge使用方法。以下为Merge前的场景展示。

点击Merge创建Merge节点,将TurningModel的TriangleSet输出及Cube的QuadSet状态变量连接到Merge的输入。

  • Merge在C++中的使用:
		//创建Merge模型
		auto MergeModel = scn->addNode(std::make_shared<Merge<DataType3f>>());
		Cube->stateQuadSet()->promoteOuput()->connect(MergeModel->inTriangleSet01());
		Turn->stateTriangleSet()->promoteOuput()->connect(MergeModel->inTriangleSet02());

3、 复制模型CopyModel能够根据输入的TriangleSet进行复制与递归变换。

  • CopyModel在图形界面中的使用:

  • CopyModel在C++中的使用:
	//创建Copy模型
	auto Copy = scn->addNode(std::make_shared<CopyModel<DataType3f>>());
	MergeModel->stateTriangleSet()->promoteOuput()->connect(Copy->inTriangleSetIn());
	//修改Copy属性
	Copy->varTotalNumber()->setValue(4);
	Copy->varCopyTransform()->setValue(Vec3f(1,0,0));