详细解读AnyCAD应用——修改指定点,线,面的坐标实现物体移动

简介: 详细解读AnyCAD应用——修改指定点,线,面的坐标实现物体移动

课题需求: 三维模型位置随实物位置改变而动态改变的功能,通过顶点位置坐标的改变,修改模型在显示中的位置。

功能验证:目前,可通过选中顶点手动输入坐标的方式,模拟验证此功能。

首先,点击“文件”工具栏,选择导入实体,导入一个step文件,这是一种常用的三维实体模型格式。

void OnOpenModel()

{

var dlg = new Microsoft.Win32.OpenFileDialog

{

DefaultExt = ".stp",

Filter = "Models (.igs;.iges;.stp;.step;.brep;.stl)|.igs;.iges;.stp;.step;.brep;.stl"

};

if (dlg.ShowDialog() != true)

return;

SceneNode? node = null;

ProgressView pv = new ProgressView(() =>

{

var shape = ShapeIO.Open(dlg.FileName);

if (shape == null)

return;

node = BrepSceneNode.Create(shape, null, null, 0, false);

});

pv.ShowDialog();

if (node == null)

return;

mRenderView.ShowSceneNode(node);

mRenderView.ZoomAll();

}

然后,在导入的三维模型中选中某一点,即可在“操作对象”属性栏中看到该点在世界坐标系中的实际位置。

var item = itr.Current();

msg += $"\nNodeId: {item.GetNodeId()}";

msg += $"\nUserId: {item.GetUserId()}";

msg += $"\nShapeId: {item.GetShapeIndex()}";

msg += $"\nPrimitiveId: {item.GetPrimitiveIndex()}";

msg += $"\nType: {item.GetShapeType().ToString()}";

msg += $"\nTopoShapeId: {item.GetTopoShapeId().ToString()}";

var pt = item.GetPosition();

msg += $"\nPosition: {pt.x} {pt.y}//代码效果参考:http://www.ezhiqi.com/zx/art_6884.html {pt.z}";

如果需要修改该点的位置,可以点击“自定义位置调整”工具栏,在“目标位置”属性栏中输入目标坐标,或者使用鼠标拖动该点,即可将目标顶点移动到所需位置。并且,您可通过点击软件右上角位置方块,观察三维模型各个位置的动态变化。

选择顶点

ViewStateGuard.SetPickFilter(EnumShapeFilter.VertexEdgeFace);

对应的XAML代码

对应的坐标变量

GPnt _SourcePoint = new GPnt();

【ExpandXYZ】

public GPnt SourcePoint

{

get => _SourcePoint;

set

{

_SourcePoint.SetXYZ(value.XYZ());

OnPropertyChanged(nameof(SourcePoint));

OnPropertyChanged(nameof(SourcePointX));

OnPropertyChanged(nameof(SourcePointY));

OnPropertyChanged(nameof(SourcePointZ));

}

}

GPnt _TargetPoint = new GPnt();

【ExpandXYZ】

public GPnt TargetPoint

{

get => _TargetPoint;

set

{

_TargetPoint.SetXYZ(value.XYZ());

OnPropertyChanged(nameof(TargetPoint));

OnPropertyChanged(nameof(TargetPointX));

OnPropertyChanged(nameof(TargetPointY));

OnPropertyChanged(nameof(TargetPointZ));

UpdateObject();

}

}

应用变换

void UpdateObject()

{

if (_SourceObject == null)

{

return;

}

var vec = new GVec(_SourcePoint, _TargetPoint);

var trf = Matrix4.makeTranslation(Vector3.From(vec));

_SourceObject.SetTransform(trf);

_SourceObject.RequestUpdate();

ViewContext.RequestUpdate(EnumUpdateFlags.Scene);

}

此功能仅改变三维模型的三维坐标,不改变模型本身的形状。

相关文章
|
8月前
|
定位技术
百度地图缩放级别与比例尺的关系
百度地图缩放级别与比例尺的关系
573 0
5、标尺-参考线-网格
这篇文章介绍了Photoshop中标尺、参考线和网格的使用技巧,包括如何打开标尺、生成和删除参考线、隐藏和锁定参考线、修改参考线颜色,以及如何设置网格和调整网格样式。
5、标尺-参考线-网格
|
8月前
|
定位技术
ArcGIS面要素最小外接矩形、外接圆的绘制方法
ArcGIS面要素最小外接矩形、外接圆的绘制方法
129 1
cesium中绘制立方体、设置材质、操作相机及获取鼠标经纬度和高度的方法
cesium中绘制立方体、设置材质、操作相机及获取鼠标经纬度和高度的方法
293 0
【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )(一)
【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )(一)
288 0
【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )(一)
|
数据可视化
ggforce|绘制区域轮廓-区域放大-寻找你的“onepiece”
ggforce|绘制区域轮廓-区域放大-寻找你的“onepiece”
|
前端开发 JavaScript
【Three.js入门】渲染第一个场景及物体(轨道控制器、坐标轴辅助器、移动缩放旋转)
【Three.js入门】渲染第一个场景及物体(轨道控制器、坐标轴辅助器、移动缩放旋转)
310 0
效果处理(内阴影、外阴影、外发光、内发光、投影)
效果处理(内阴影、外阴影、外发光、内发光、投影)
效果处理(内阴影、外阴影、外发光、内发光、投影)
|
定位技术
在地图上基于OpenLayers实现点/线/面静态的绘制显示
在地图上基于OpenLayers实现点/线/面静态的绘制显示
1196 0
在地图上基于OpenLayers实现点/线/面静态的绘制显示
|
前端开发 算法 API
用canvas 实现矩形的移动(点、线、面)
前言 在canvas中实现图片移动、实现矩形移动,大家可能看的很多了。但是我为什么还要去写这样的一篇文章呢,因为笔者曾经做到3维图形下的移动。包括移动一个立方体上的一条边线、一个面、移动多边形的一个点。最近一直在写canvas的相关的文章,想着复习下,读完本篇文章你可以学到,通过移动矩形的一个点, 一个条边线,以及整个面的移动。本篇文章从浅到深,希望你耐心读下去。
用canvas 实现矩形的移动(点、线、面)