模型交互

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

请参考示例观察选中的信息变化情况。

注意:

  • 该函数只需设置一次,第二次设置会将之前的设置覆盖。

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

注意:

  • 该函数只需设置一次,第二次设置会将之前的设置覆盖。
  • 停用动画,直接设置为null

3 交互设置

3.1 设置鼠标按键

可以设置鼠标的行为,比如要修改为左键和中键旋转,右键移动,可以如下设置:

            var ctx = mRenderView.GetContext();
            ctx.SetOrbitButton(EnumMouseButton.LeftMiddle);
            ctx.SetPanButton(EnumMouseButton.Right);
1
2
3

3.2 设置旋转中心

AnyCAD三维控件默认以鼠标当前选择的点为视图的旋转中心,用户也可以设置固定的旋转中心:

 // 设置旋转中心为(0,0,0)
 renderView.GetContext().SetUserOrbitPivot(Vector3.Zero);
1
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

设置剖切平面:


        {
            renderView.ExecuteCommand("ClipPlane");
        }

1
2
3
4
5

4.2 模型修改

  • 移动 在视图中选中模型后,执行如下命令进入移动操作。按ESC退出。
    mRenderView.ExecuteCommand("Move");
1

  • 旋转 在视图中选中模型后,执行如下命令进入旋转操作。按ESC退出。
    mRenderView.ExecuteCommand("Rotate");
1

4.3 框选放大

mRenderView.ExecuteCommand("RectZoom");
1

5 总结

更多设置请参考示例Demo。