模型交互
1 图元选择
当鼠标选中图元的时候,使用RenderControl可以接收选中消息。RenderControl::SetSelectCallback用于注册用户接收选择消息的回调函数,参数PickedResult包含了被选择的图元信息:
mRenderControl.SetSelectCallback((PickedResult result) =>
{
var item = result.GetItem();
this.listBox1.Items.Clear();
// SceneNode的类型
this.listBox1.Items.Add(item.GetNode().GetType().Name);
// SceneNode的Uuid, 参考下面 2 图元数据关联。
this.listBox1.Items.Add(String.Format("NodeId: {0}", item.GetNodeId()));
// 鼠标点击的位置
this.listBox1.Items.Add(item.GetPoint().GetPosition().ToString());
// 选中的子图元类型
this.listBox1.Items.Add(item.GetShapeType().ToString());
// 选中子图元的在整体图元的索引
this.listBox1.Items.Add(String.Format("SubIndex: {0}", item.GetShapeIndex()));
// 点、线段、三角形面片的索引
this.listBox1.Items.Add(String.Format("PrimitiveIndex: {0}", item.GetPoint().GetPrimitiveIndex()));
// 子TopoShape的ID,可以从主TopoShape.FindChild获取子TopoShape对象
this.listBox1.Items.Add(String.Format("TopoShapeId: {0}", item.GetTopoShapeId()));
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
请参考示例观察选中的信息变化情况。
注意:
- 该函数只需设置一次,第二次设置会将之前的设置覆盖。
1.1 图元数据关联
每个SceneNode都具有全局唯一的ID。当程序重新打开的时候,SceneNode的ID会重新分配。 创建SceneNode后,可以通过ID来跟应用的业务数据关联;当选中图元后,可以根据ID获取业务信息。
注意:
- SceneNode.GetUuid可以得到SceneNode的全局唯一ID。
- 使用SceneNode.SetUserId可以关联用户自定义的ID,默认是0。
2 动画设置
通过组合使用平移、旋转和缩等矩阵变换放来模拟物体的运动。通过RenderControl::SetAnimationCallback可以得到每一帧绘制的消息,在Callback中可以对SceneNode进行矩阵变换。
mRenderControl.SetAnimationCallback((float timer)=>{
// 更新构件
var matrixR = Matrix4.makeRotationAxis(new Vector3(0, 0, 1), time);
var matrixT = Matrix4.makeTranslation(-50, 0, 0);
ConeNode1.SetTransform(matrixR * matrixT);
ConeNode1.RequstUpdate();
// 更新场景
mRenderControl.RequestDraw();
});
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
注意:
- 该函数只需设置一次,第二次设置会将之前的设置覆盖。
- 停用动画,直接设置为null
3 交互设置
3.1 设置鼠标按键
可以设置鼠标的行为,比如要修改为左键和中键旋转,右键移动,可以如下设置:
var ctx = mRenderView.GetContext();
ctx.SetOrbitButton(EnumMouseButton.LeftMiddle);
ctx.SetPanButton(EnumMouseButton.Right);
1
2
3
2
3
3.2 设置旋转中心
AnyCAD三维控件默认以鼠标当前选择的点为视图的旋转中心,用户也可以设置固定的旋转中心:
// 设置旋转中心为(0,0,0)
renderView.GetContext().SetUserOrbitPivot(Vector3.Zero);
1
2
2
3.3 选择模式
- 框选
mRenderView.GetContext().SetRectPick(true);
1 - 单选
mRenderView.GetContext().SetRectPick(false);
1
4 高级交互
4.1 模型剖切
AnyCAD内置了模型剖切命令:
- 剖切盒ClipBox
- 剖切平面ClipPlane。
设置剖切盒:
{
renderView.ExecuteCommand("ClipBox");
}
1
2
3
4
5
2
3
4
5
设置剖切平面:
{
renderView.ExecuteCommand("ClipPlane");
}
1
2
3
4
5
2
3
4
5
4.2 模型修改
- 移动 在视图中选中模型后,执行如下命令进入移动操作。按ESC退出。
mRenderView.ExecuteCommand("Move");
1
- 旋转 在视图中选中模型后,执行如下命令进入旋转操作。按ESC退出。
mRenderView.ExecuteCommand("Rotate");
1
4.3 框选放大
mRenderView.ExecuteCommand("RectZoom");
1
5 总结
更多设置请参考示例Demo。