当前位置: 首页 > news >正文

网站开发流程知乎移动互联网的概念

网站开发流程知乎,移动互联网的概念,免费咨询师心理医生,百度指数大数据分享平台一、VTK的框选支持类vtkInteractorStyleRubberBandPick FastCAE的鼠标事件交互类是PropPickerInteractionStyle#xff0c;它扩展自vtkInteractorStyleRubberBandPick。vtkInteractorStyleRubberBandPick类可以实现鼠标框选物体#xff0c;默认情况下按下键盘r键开启框选模式…一、VTK的框选支持类vtkInteractorStyleRubberBandPick FastCAE的鼠标事件交互类是PropPickerInteractionStyle它扩展自vtkInteractorStyleRubberBandPick。vtkInteractorStyleRubberBandPick类可以实现鼠标框选物体默认情况下按下键盘r键开启框选模式这时拖动鼠标可拾取物体。VTK官网有其例子HighlightSelection。 二、FastCAE框选产品设计 我们看FastCAE的鼠标拾取产品设计。其只支持框选网格点与网格单元几何点、线、面都不支持。框选网格单元效果如下 在VTK的给的案例中按r键是为了打开vtkInteractorStyleRubberBandPick类的框选开关设置vtkInteractorStyleRubberBandPick字段CurrentMode1(VTKISRBP_SELECT)表示开启框选模式。VTK中vtkInteractorStyleRubberBandPick.cxx源码如下 void vtkInteractorStyleRubberBandPick::OnChar() {switch (this-Interactor-GetKeyCode()){case r:case R:// r toggles the rubber band selection mode for mouse button 1if (this-CurrentMode VTKISRBP_ORIENT){this-CurrentMode VTKISRBP_SELECT;}else{this-CurrentMode VTKISRBP_ORIENT;}break;case p:case P:{vtkRenderWindowInteractor* rwi this-Interactor;int* eventPos rwi-GetEventPosition();this-FindPokedRenderer(eventPos[0], eventPos[1]);this-StartPosition[0] eventPos[0];this-StartPosition[1] eventPos[1];this-EndPosition[0] eventPos[0];this-EndPosition[1] eventPos[1];this-Pick();break;}default:this-Superclass::OnChar();} }而在FastCAE框选时不需要按下r键其原因在用切换拾取模式时直接改掉了CurrentMode的值源码如下(注意看这个函数最后一行) void PropPickerInteractionStyle::setSelectModel(int m) {_selectModel (SelectModel)m;this-CurrentMode 0;if (_actor ! nullptr)_actor-GetProperty()-DeepCopy(_property);_actor nullptr;_preGeoSeltctActor nullptr;_selectItems.clear();emit grabKeyBoard(false);switch (_selectModel){case ModuleBase::MeshNode:case ModuleBase::MeshCell:case ModuleBase::GeometryWinPoint:case ModuleBase::GeometryWinCurve:case ModuleBase::GeometryWinSurface:case ModuleBase::GeometryWinBody:emit grabKeyBoard(true);break;case ModuleBase::GeometryPoint:case ModuleBase::GeometryCurve:case ModuleBase::GeometrySurface:case ModuleBase::GeometryBody:break;case ModuleBase::BoxMeshNode: // 当选择方式是框选时直接设置开始框选case ModuleBase::BoxMeshCell:case ModuleBase::DrawSketch:this-CurrentMode 1;break;} }这种设计的好处是不用按键盘进行交互但造成激活框选按钮之后视图的角度无法更改。本来按住左键拖拽可以旋转视图的打开框选之后就失效了。 其框选还有一个比较严重的问题框选会同时拾取物体的表面与背面单元效果如下 这种效果惊不惊喜意不意外很多场景下这种拾取是不满足要求的。进一步分析其框选逻辑就很好理解这种现象了。 三、框选计算逻辑 PropPickerInteractionStyle::OnLeftButtonUp()处理鼠标抬起事件框选计算哪些物体要被选中的逻辑也在这里被触发。 void PropPickerInteractionStyle::OnLeftButtonUp() {vtkInteractorStyleRubberBandPick::OnLeftButtonUp();if (_selectModel None !_mouseMoved)emit this-clearAllHighLight();if ((_selectModel ! BoxMeshCell) (_selectModel ! BoxMeshNode) (_selectModel ! DrawSketch))return;if (this-CurrentMode 0)return;// _selectItemIDs-SetNumberOfValues(0);_selectItems.clear();int *endPos this-GetInteractor()-GetEventPosition();_endPos[0] endPos[0];_endPos[1] endPos[1];// qDebug() end _endPos[0] _endPos[1];if (_selectModel ! DrawSketch){vtkActor *ac nullptr;vtkAreaPicker *areaPicker dynamic_castvtkAreaPicker *(this-GetInteractor()-GetPicker());ac areaPicker-GetActor();if (ac nullptr)return;}switch (_selectModel){case ModuleBase::BoxMeshNode: // 计算哪些节点被选中boxSelectMeshNode();break;case ModuleBase::BoxMeshCell: // 计算哪些单元要被选中boxSelectMeshCell();break;case ModuleBase::DrawSketch:_coordinate-SetCoordinateSystemToDisplay();_coordinate-SetValue(endPos[0], endPos[1], 0);double *d _coordinate-GetComputedWorldValue(_renderer);emit mouseReleasePoint(d);break;}_mouseMoved false;_leftButtonDown false; }boxSelectMeshNode()、boxSelectMeshCell()函数分别哪些节点、单元要被拾取。 void PropPickerInteractionStyle::boxSelectMeshNode() {emit clearAllHighLight(); // 清除掉当前高亮_selectItems.clear(); // 清理当前选择项// Forward eventsint range[4];this-getBoxRange(range); // 获取框选矩形的坐标vtkActorCollection *actors _renderer-GetActors(); // 获取当前的场景中所有actoractors-InitTraversal();const int nac actors-GetNumberOfItems();for (int i 0; i nac; i) // 对Actor进行遍历{vtkActor *actor actors-GetNextActor();if (actor nullptr)if (!actor-GetVisibility())continue;if (!actor-GetPickable())continue;vtkMapper *mapper actor-GetMapper();if (mapper nullptr)continue;vtkDataSet *dataset mapper-GetInputAsDataSet();if (dataset nullptr)continue;vtkDataArray *IDS dataset-GetPointData()-GetArray(IDS); // 提取Actor的点数据if (IDS nullptr)continue;this-selectMesh(dataset, range);}emit highLight(_selectItems); }void PropPickerInteractionStyle::selectMesh(vtkDataSet *dataSet, int *range) {vtkRenderer *render this-GetInteractor()-GetRenderWindow()-GetRenderers()-GetFirstRenderer();vtkSmartPointervtkCoordinate coordinate vtkSmartPointervtkCoordinate::New();coordinate-SetCoordinateSystemToWorld();coordinate-GetComputedDisplayValue(render);if (_selectModel BoxMeshNode){vtkDataArray *ids dataSet-GetPointData()-GetArray(IDS); // 获取点集const int npoint dataSet-GetNumberOfPoints();for (int i 0; i npoint; i){double coor[3];dataSet-GetPoint(i, coor); // 获取点的坐标coordinate-SetValue(coor); // 将点的坐标设置给coordinateint *va coordinate-GetComputedDisplayValue(render); // 计算屏幕坐标if (isPointInRange(va, range)) // 是否在鼠标框内部{double *k_id ids-GetTuple2(i); // 看不懂_selectItems.insert(k_id[0], k_id[1]);}}}else if (_selectModel BoxMeshCell){vtkDataArray *ids dataSet-GetCellData()-GetArray(IDS); // 获取cell数据const int ncell dataSet-GetNumberOfCells();for (int i 0; i ncell; i) // 遍历cell{vtkCell *cell dataSet-GetCell(i); // 当前的celldouble pcenter[3] {0};cell-GetParametricCenter(pcenter); // 获取当前cell的中心点参数坐标int subid;double coor[3];double w[100];cell-EvaluateLocation(subid, pcenter, coor, w); // 根据参数坐标获取中心点世界空间坐标coordinate-SetValue(coor);int *va coordinate-GetComputedDisplayValue(render); // 计算屏幕坐标if (isPointInRange(va, range)) // 屏幕坐标是否在选择框内{double *k_id ids-GetTuple2(i);_selectItems.insert(k_id[0], k_id[1]);}}} }根据以上代码框选点时直接根据点坐标计算其投影到屏幕上的坐标判断是否在选择框内。单元是判断中心点是否在选择框内部。因为投影之后丢弃了深度方向的信息没有考虑物体的遮挡信息所以框选时表面、背面均可选择。而且其计算框选时遍历所有网格没有借助一些加速结构如BVH树等造成框选效率较低当网格数量较多时这种方式很慢。 总结 FastCAE的框选逻辑过于简单只是demo阶段实际的CAE软件的拾取逻辑要远比这复杂。
http://www.sadfv.cn/news/278506/

相关文章:

  • 电视台网站开发软件培训学校
  • 米特号类似网站品牌建设实施方案
  • 祥云县网站个旧网络推广
  • 网页新建站点免费的会员卡管理软件
  • 网站地图添加网络综合设计实验报告
  • 网站目录怎么做301跳转用asp制作一个简单的网站
  • 做个视频网站建设网站的目的和功能定位
  • 汕头建设网站关于做ppt的网站有哪些
  • 两学一做知识问答网站用户图片上传wordpress
  • 兰州新区小程序建站长沙发布致全体
  • 怎样给公司做一个网站电脑网页制作模板
  • 做装修公司网站视频制作公司排行
  • 返利网站怎么做上海设计公司 快消品
  • 网站建设对标行业分析开山云匠网
  • 住房和城乡建设部办公厅网站做外贸必看的网站和论坛有哪些
  • 做网站怎么跑业务温州本地网站
  • 温州制作网站wordpress淘宝客pid
  • 事业单位网站开发工作规程昆明网站seo
  • 网页设计与网站开发教程全网营销平台
  • 西安优秀的定制网站建设公司哪家好外网设计灵感网站
  • 南阳网站建设seo广州骏域网站
  • 为什么做网站要用谷歌浏览器购物分享网站怎么做盈利
  • 杭州网站建设网络公司网站设计培训学校有哪家
  • 网站建设 就业方向步骤怎么读
  • 微信清粉网站开发wordpress不能上传主题
  • 广州市城乡和建设局网站首页网站建设及宣传管理规定
  • 网站软件有哪些深圳外贸网站制作公司
  • 做网站和做公众号北京云邦网站建设
  • 如何做网站地图做网站常用图标
  • 网页给别人做的 网站后续收费网站建设的ppt