模型批量旋转
来源:互联网 发布:开淘宝店一个月能赚多少钱 编辑:程序博客网 时间:2024/05/29 13:15
今天介绍下超图三维模型批量旋转
先看一下绕某一点旋转180度的效果,右边旋转前,左边旋转后:
该demo主要涉及两个知识点
1. 临时数据源的创建
2. 批量旋转的实现
界面如下:
可以选场景中的模型图层(仅支持地理坐标系),可以自定义旋转衷心,也可以以数据集中心点为旋转中心。
可以另存,也可以保存至源数据。
临时数据源的创建
创建临时数据源
临时数据源主要保存一些中间数据,在关闭工作空间时不会保存临时数据源的数据。
主要代码:
private void CreateTempDatasource() { foreach (Datasource item in m_sceneControl.Scene.Workspace.Datasources) { //存在临时数据源时就不需要创建 if (item.ConnectionInfo.Server.Contains(m_datasrouceName)) { m_tempDatasource = item; break; } } if (m_tempDatasource == null) { DatasourceConnectionInfo info = new DatasourceConnectionInfo(); //string m_datasrouceName = "临时数据源" info.Alias = m_datasrouceName; // string m_server=":memory:" info.Server = m_server; m_tempDatasource = m_sceneControl.Scene.Workspace.Datasources.Create(info); } }
创建的临时数据源如下(tempData_为创建的临时数据集):
值得注意的是,当临时数据源过大时会在本地(指定路径,具体路径记不清楚了)创建一个文本型数据原,但是关闭工作空间会自动删除该文件。故在判断数据源是不是临时数据源不能只判断server。
创建临时数据集
//创建临时数据集 private DatasetVector CreateDatasetVector(Datasource desDatasource, string datasetName, bool isTemp) { DatasetVector dataset = null; if (isTemp) { desDatasource.Datasets.Delete(datasetName); } DatasetVectorInfo info = new DatasetVectorInfo(); info.Name = datasetName; info.Type = DatasetType.Model; dataset = m_tempDatasource.Datasets.Create(info); dataset.PrjCoordSys = new PrjCoordSys(PrjCoordSysType.EarthLongitudeLatitude); return dataset; }
new PrjCoordSys(PrjCoordSysType.EarthLongitudeLatitude)表示wgs84地理坐标系,单位为度。
批量旋转的实现
模型批量旋转的实现实际上分为三步:
- 1.记录模型初始位置并将模型移动到旋转中心
- 2.旋转模型(RotationZ)
- 3.旋转模型原始点(绕旋转中心)并将模型移动到旋转后的点
主要代码:
private void ModelRotate(DatasetVector selectedDataset, DatasetVector desDataset) { //旋转角度 double rorationAngle = (double)m_numericUpDownAngle.Value; //目标数据集 Recordset srcRecordset = selectedDataset.GetRecordset(false, CursorType.Static); //desDataset临时数据集 Recordset desRecordset = desDataset.GetRecordset(false, CursorType.Dynamic); desRecordset.Batch.Begin(); m_progressBar.Maximum = srcRecordset.RecordCount; m_progressBar.Value = 0; while (!srcRecordset.IsEOF) { GeoModel3D model3D = srcRecordset.GetGeometry() as GeoModel3D; if (model3D == null) { srcRecordset.MoveNext(); m_progressBar.Value++; continue; } // 1.记录模型初始位置并将模型移动到旋转中心 Point3D originalPos = model3D.Position; model3D.Position = new Point3D(m_rotateCenter.X, m_rotateCenter.Y, 0); // 2.旋转模型(RotationX) model3D.RotationZ += rorationAngle; // 3.旋转模型原始点(绕旋转中心)并将模型移动到旋转后的点 GeoPoint newPos = new GeoPoint(originalPos.X, originalPos.Y); newPos.Rotate(m_rotateCenter, rorationAngle); model3D.Position = new Point3D(newPos.X, newPos.Y, originalPos.Z); desRecordset.AddNew(model3D); m_progressBar.Value++; srcRecordset.MoveNext(); } desRecordset.Batch.Update(); desRecordset.Dispose(); desRecordset = null; srcRecordset.Dispose(); srcRecordset = null; }
由于三维没有绕某一点旋转,所以需要将点转成二维点(GeoPoint2D)再旋转。
好了,就介绍这么多了。
阅读全文
1 0
- 模型批量旋转
- 移动和旋转模型
- 经济批量模型图解
- unity3d模型旋转和模型导出obj
- Unity3d 拖动鼠标旋转模型
- js操作unity模型旋转
- 手动滑动屏幕,旋转模型
- 拖动模型任意方向旋转
- imagemagick 批量旋转图片 转为横版式
- 用matlab对图像进行批量旋转
- Matlab实现图片批量旋转保存
- arcgis批量移动三维模型
- python三维模型批量导入
- Unity3d物体模型(实现旋转缩放平移自动旋转)
- Unity3d物体模型(实现旋转缩放平移自动旋转)
- unity3d 拖动模型对象旋转效果
- [Unity3d]鼠标旋转缩放拖动模型
- 手指/鼠标 360度旋转模型脚本
- 谈谈对协程的理解
- Java单例模式
- Keil4 品字菜单使用
- JavaWeb学习笔记-Hibernate-02-开发流程
- 协程概念,原理(c++和node.js实现)
- 模型批量旋转
- 小程序编译.wxss报错
- PowerDesigner 16.5学习资料(更新中)
- [POJ3208]Apocalypse Someday-二分-数位DP
- 2017/12/19C语言笔记整理
- [SDS阅读理解/9]源码中的函数/6
- linux chmod命令
- C/C++ 笔试、面试题目大汇总
- ubuntu16.04安装cuda9——简明教程