最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# VTK 移動旋轉(zhuǎn)交互功能實現(xiàn)

 更新時間:2024年06月25日 09:45:01   作者:Mr.For  
對vtk場景中一個或多個選中物體進(jìn)行移動旋轉(zhuǎn),今天通過本文給大家分享C# VTK 移動旋轉(zhuǎn)交互功能實現(xiàn),感興趣的朋友跟隨小編一起看看吧

對vtk 場景中一個或多個選中物體進(jìn)行移動旋轉(zhuǎn)。

交互移動旋轉(zhuǎn)坐標(biāo)系

首先我們創(chuàng)建旋轉(zhuǎn)的交互坐標(biāo)系,三個移動Actor,三個旋轉(zhuǎn)Actor,還需要4個定位坐標(biāo)的小球Actor。

 public class CoordinateActor 中添加Actor
// 當(dāng)前選中的Actor
  public vtkActor selActor;
  // 定位中心小球
  public vtkActor cenActor;
  // 旋轉(zhuǎn)Actor
  public vtkActor rotX;
  public vtkActor rotY;
  public vtkActor rotZ;
  // 移動Actor
  public vtkActor moveX;
  public vtkActor moveY;
  public vtkActor moveZ;
  // 末端定位小球
  public vtkActor moveXEnd;
  public vtkActor moveYEnd;
  public vtkActor moveZEnd;

創(chuàng)建X軸移動Actor 

  public vtkActor LineActor(Point3d p1, Point3d p2, double[] color)
  {
      vtkLineSource lineSource = new vtkLineSource();
      lineSource.SetPoint1(p1.X, p1.Y, p1.Z);
      lineSource.SetPoint2(p2.X, p2.Y, p2.Z);
      lineSource.Update();
      vtkPolyDataMapper mapper = new vtkPolyDataMapper();
      mapper.SetInputData(lineSource.GetOutput());
      mapper.Update();
      vtkActor actor = new vtkActor();
      actor.SetMapper(mapper);
      actor.GetProperty().SetColor(color[0], color[1], color[2]);
      actor.GetProperty().SetLineWidth(10);
      return actor;
  }

這里的p1,p2 是根據(jù)模型的中心點和大小決定的。

假設(shè)創(chuàng)建了一個Box 長寬高 200, 模型中心在(0,0,0)。

以X移動Actor為例,這樣vtkLineSource p1 = (0,0,0)   p2(200,0,0) 。

同時創(chuàng)建 cenActor , moveXEnd 兩個定位小球。

現(xiàn)在我們已經(jīng)創(chuàng)建了一個X軸方向的移動交互Actor ------- moveX。

X軸移動交互

有了moveX 現(xiàn)在為其添加移動交互的事件,參與移動的鼠標(biāo)事件有四種。

MouseMove(LeftDown==false):

 當(dāng)鼠標(biāo)只是在場景中自由移動,未點擊時,移動到moveX時應(yīng)該觸發(fā)待選狀態(tài),既是改變moveX 顏色。在MouseMove中需要隨時判斷是否鼠標(biāo)選中Actor 且是 moveX。是就改變顏色,不是就還原顏色(需要設(shè)置為默認(rèn)顏色)。

MouseDown

改變 bool LeftDown = true 

MouseUp

改變 bool LeftDown = false

firstPos == null 

lastPos = null

MouseMove(LeftDown==true):

此時真正開始旋轉(zhuǎn)

1.計算移動距離方向

需要 兩個Point2d 記錄firstPos 和 lastPos 兩個鼠標(biāo)平面點,用于鼠標(biāo)的移動距離和方向。

Point2d moveNorm = lastPos - firstPos; 

還記得我們之前的定位小球嗎,將cenActor 和 moveXEnd  中心點 轉(zhuǎn)換為屏幕坐標(biāo)。

得到 center2d ,moveXEnd2d  

Point2d xLineNorm = moveXEnd2d - center2d

計算 moveNorm 投影到 xLineNorm  的 長度,既是移動的長度和方向(我們只在X 的正負(fù)方向移動)。

 // 計算點積
 public static double DotProduct2D(Point2d vectorA, Point2d vectorB)
 {
     return vectorA.X * vectorB.X + vectorA.Y * vectorB.Y;
 }
 // 計算向量的模(長度)
 public static double Magnitude2D(Point2d vector)
 {
     return Math.Sqrt(vector.X * vector.X + vector.Y * vector.Y);
 }
 // 計算向量 A 投影到向量 B 上的長度
 public static double ProjectionLength(Point2d vectorA, Point2d vectorB)
 {
     double dotProduct = DotProduct2D(vectorA, vectorB);
     double magnitudeB = Magnitude2D(vectorB);
     if (magnitudeB == 0)
         return 0;
     return dotProduct / magnitudeB;
 }

2.實現(xiàn)移動

vtk 通過vtkTransform實現(xiàn)移動旋轉(zhuǎn)

   public void MoveAllAcotr(double moveValue, Orien orien)
   {
       vtkTransform transform = new vtkTransform();
       if(orien == Orien.X)
       {
           transform.Translate(moveValue,0,0);
       }
       else if (orien == Orien.Y)
       {
           transform.Translate(0, moveValue, 0);
       }
       else if (orien == Orien.Z)
       {
           transform.Translate(0, 0, moveValue);
       }
       transform.Update();
       // 移動 模型
       TransformActor(model, transform);
       TransformActor(cenActor, transform);
       TransformActor(moveXEnd, transform);
       TransformActor(moveYEnd, transform);
       TransformActor(moveZEnd, transform);
       TransformActor(moveX, transform);
       TransformActor(moveY, transform);
       TransformActor(moveZ, transform);
       TransformActor(rotX, transform);
       TransformActor(rotY, transform);
       TransformActor(rotZ, transform);
   }
        public void TransformActor(vtkActor actor,  vtkTransform transform)
        {
            vtkTransformFilter filter = new vtkTransformFilter();
            filter.SetTransform(transform);
            filter.SetInputData(actor.GetMapper().GetInput());
            filter.Update();
            actor.GetMapper().GetInput().DeepCopy(filter.GetOutput());
        }

(記得每一個交互的Actor 都要進(jìn)行這個操作一起移動,包括定位小球)

X 軸旋轉(zhuǎn)交互

使用 vtkRegularPolygonSource 創(chuàng)建空間圓 rotX, norm 為 (1,0,0)

 public vtkActor CircleActor(Point3d center, Point3d norm, double radius, double[] color)
 {
     vtkRegularPolygonSource polygonSource = new vtkRegularPolygonSource();
     polygonSource.SetCenter(center.X, center.Y, center.Z);
     polygonSource.SetNormal(norm.X, norm.Y, norm.Z);
     polygonSource.SetRadius(radius);
     polygonSource.SetNumberOfSides(30);
     polygonSource.SetGeneratePolyline(1);
     polygonSource.SetGeneratePolygon(0);
     polygonSource.Update();
     vtkPolyDataMapper mapper = new vtkPolyDataMapper();
     mapper.SetInputData(polygonSource.GetOutput());
     mapper.Update();
     vtkActor actor = new vtkActor();
     actor.SetMapper(mapper);
     actor.GetProperty().SetColor(color[0], color[1], color[2]);
     actor.GetProperty().SetLineWidth(10);
     return actor;
 }

其他操作與移動相同。

不同的是旋轉(zhuǎn)時和移動相關(guān)Actor不旋轉(zhuǎn)的,為了保持永遠(yuǎn)在X 方向上移動。

(如果想在任意方向上移動可以計算移動時的方向向量,此時全部Actor旋轉(zhuǎn))

旋轉(zhuǎn)代碼

 public void RotateAllAcotr(double rotAngel, Point3d norm, Orien orien)
 {
     Point3d center = new Point3d(cenActor.GetCenter());
     vtkTransform transform = new vtkTransform();
     transform.Translate(-center.X, -center.Y, -center.Z);
     if (orien == Orien.X)
     {
         transform.RotateWXYZ(rotAngel, norm.X, norm.Y, norm.Z);
     }
     else if (orien == Orien.Y)
     {
         transform.RotateWXYZ(rotAngel, norm.X, norm.Y, norm.Z);
     }
     else if (orien == Orien.Z)
     {
         transform.RotateWXYZ(rotAngel, norm.X, norm.Y, norm.Z);
     }
     transform.Translate(center.X, center.Y, center.Z);
     transform.Update();
     TransformActor(model, transform);
     TransformActor(cenActor, transform);
     TransformActor(rotX, transform);
     TransformActor(rotY, transform);
     TransformActor(rotZ, transform);
 }
        public void TransformActor(vtkActor actor,  vtkTransform transform)
        {
            vtkTransformFilter filter = new vtkTransformFilter();
            filter.SetTransform(transform);
            filter.SetInputData(actor.GetMapper().GetInput());
            filter.Update();
            actor.GetMapper().GetInput().DeepCopy(filter.GetOutput());
        }

這只是個簡單的基本方法有不足的地方,其中有很過細(xì)節(jié)可以根據(jù)需要進(jìn)行修改。

到此這篇關(guān)于C# VTK 移動旋轉(zhuǎn)的文章就介紹到這了,更多相關(guān)C# 移動旋轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • WPF實現(xiàn)倒計時轉(zhuǎn)場動畫效果

    WPF實現(xiàn)倒計時轉(zhuǎn)場動畫效果

    這篇文章主要介紹了如何利用WPF實現(xiàn)倒計時轉(zhuǎn)場動畫效果,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2022-08-08
  • c#通過反射實現(xiàn)對象自動映射的實現(xiàn)

    c#通過反射實現(xiàn)對象自動映射的實現(xiàn)

    本文主要介紹了c#通過反射完成對象自動映射的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • C#接口interface用法實例

    C#接口interface用法實例

    這篇文章主要介紹了C#接口interface用法,實例分析了C#接口的基本使用方法,需要的朋友可以參考下
    2015-06-06
  • C#使用Jquery zTree實現(xiàn)樹狀結(jié)構(gòu)顯示 異步數(shù)據(jù)加載

    C#使用Jquery zTree實現(xiàn)樹狀結(jié)構(gòu)顯示 異步數(shù)據(jù)加載

    這篇文章主要為大家詳細(xì)介紹了C#使用Jquery zTree實現(xiàn)樹狀結(jié)構(gòu)顯示和異步數(shù)據(jù)加載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • c#常用表格控件dataGridView的分頁顯示

    c#常用表格控件dataGridView的分頁顯示

    最近項目需要自己寫了一個用來給DataGridView分頁用的控件,下面這篇文章主要給大家介紹了關(guān)于c#常用表格控件dataGridView的分頁顯示,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • C# 中SharpMap的簡單使用實例詳解

    C# 中SharpMap的簡單使用實例詳解

    SharpMap是一個基于.net 2.0使用C#開發(fā)的Map渲染類庫,可以渲染各類GIS數(shù)據(jù)(目前支持ESRI Shape和PostGIS格式),可應(yīng)用于桌面和Web程序,具體內(nèi)容詳情大家參考下本文吧
    2017-08-08
  • C#實現(xiàn)輕松從HTML中提取純文本

    C#實現(xiàn)輕松從HTML中提取純文本

    這篇文章主要為大家詳細(xì)介紹了C#如何實現(xiàn)輕松從HTML中提取純文本,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • C#利用ScriptControl動態(tài)執(zhí)行JS和VBS腳本

    C#利用ScriptControl動態(tài)執(zhí)行JS和VBS腳本

    C#中利用ScriptControl動態(tài)執(zhí)行JS和VBS腳本的實現(xiàn)方法,需要的朋友可以參考下
    2013-04-04
  • c#中虛函數(shù)的相關(guān)使用方法

    c#中虛函數(shù)的相關(guān)使用方法

    若一個實例方法聲明前帶有virtual關(guān)鍵字,那么這個方法就是虛方法。
    2013-02-02
  • C#?OpenCV實現(xiàn)形狀匹配的方法詳解

    C#?OpenCV實現(xiàn)形狀匹配的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#+OpenCV實現(xiàn)形狀匹配的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-09-09

最新評論

怀柔区| 新民市| 潍坊市| 永清县| 基隆市| 德庆县| 潢川县| 双江| 格尔木市| 宽甸| 荔波县| 台中县| 高安市| 内丘县| 内黄县| 沙湾县| 麦盖提县| 新乡市| 方正县| 林州市| 喀喇沁旗| 阳山县| 麻城市| 汝阳县| 临邑县| 古田县| 巢湖市| 栾城县| 桃园县| 肇源县| 怀仁县| 新和县| 遂平县| 新泰市| 景东| 东山县| 高碑店市| 毕节市| 舒兰市| 吴旗县| 扬中市|