WPF3D關於HelixToolkit-3D呈現的交互處理

来源:https://www.cnblogs.com/wjygxjz/archive/2023/10/16/17766612.html
-Advertisement-
Play Games

關於HelixToolkit-這個3D呈現的交互處理推薦使用,因為功能比較強大 一個開源3D庫,根據MIT許可證獲得許可。MIT許可證非常寬鬆,允許在專有軟體中使用。該庫基於 .NET,目前專註於 WPF 平臺。 HelixToolkit是.NET Framework的一個開源3D圖形庫,它主要用於 ...


關於HelixToolkit-這個3D呈現的交互處理推薦使用,因為功能比較強大 一個開源3D庫,根據MIT許可證獲得許可。MIT許可證非常寬鬆,允許在專有軟體中使用。該庫基於 .NET,目前專註於 WPF 平臺。 HelixToolkit是.NET Framework的一個開源3D圖形庫,它主要用於創建和操作3D圖形1。 HelixToolkit包含許多實用的3D圖形工具,例如3D視圖、3D模型、3D場景、3D渲染、3D動畫等,它們可以幫助開發者快速創建出高質量的3D圖形應用程式1。 HelixToolkit的文檔和教程可以在官方網站上找到,開發者可以根據需要查看和使用 地址:https://github.com/helix-toolkit   Nuget安裝
<Grid>
    <!--ShowViewCube="True" 屬性用於關閉旋轉控制3D互動的圖標-->
    <!--ViewCubeWidth="200" 設置旋轉圖標的寬度-->
    <!--ViewCubeHeight="200" 設置旋轉圖標的高度-->
    <!--ViewCubeHorizontalPosition="Left" 設置旋轉圖標的水平位置-->
    <!--ViewCubeVerticalPosition="Top" 設置垂直圖標的位置-->
    <!--ViewCubeFrontText="前" 設置旋轉圖標前文本-->
    <!--ViewCubeTopText="上" 設置旋轉圖標上文本-->

    <!--ShowCoordinateSystem="True" 設置顯示坐標軸-->
    <!--CoordinateSystemLabelForeground="#5000" 設置坐標系統的字體顏色-->
    <!--CoordinateSystemHorizontalPosition="Center" 設置坐標系的水平位置-->
    <!--CoordinateSystemVerticalPosition="Center" 設置坐標系的垂直位置-->
    <h:HelixViewport3D ShowViewCube="True"
               ViewCubeWidth="100"
               ViewCubeHeight="100"
               ViewCubeHorizontalPosition="Right"
               ViewCubeVerticalPosition="Bottom"
               ViewCubeFrontText="前"
               ViewCubeTopText="上"
               ViewCubeBackText="後"
               ViewCubeLeftText="左"
               ViewCubeRightText="右"
               ViewCubeBottomText="下"
               
               ShowCoordinateSystem="True"
               CoordinateSystemLabelForeground="#5000"
               CoordinateSystemHorizontalPosition="Left"
               CoordinateSystemVerticalPosition="Bottom" Margin="-10,0,10,0"
               >
        <!--相機-->
        <h:HelixViewport3D.Camera>
            <!-- PerspectiveCamera標簽-透視相機(近比例長遠比例小,符合我們正常觀察事物的視覺-常用)-->
            <!--Position="100,100,100" 設置視角x,y,z-->
            <!--LookDirection="-2,-2,-2" 設置相機的觀看視角-相機觀察的方向-->
            <!--FieldOfView="90" 調整相機焦距 設置相機與觀看物體的距離,離得遠觀看物體區域範圍大,離得近觀看物體區域範圍小 -->
            <!--UpDirection="0,1,0" (x, y,z)設置相機視口的旋轉角度,斜著拍還是正著拍 -->
            <!--FarPlaneDistance="1000" 設置相機遠處景色的渲染範圍,如果值設置的比較小,遠處景色是模糊的-->
            <!--NearPlaneDistance="1" 設置相機近處的晶圓渲染範圍,如果值越大,近處景色是模糊的-->
            <PerspectiveCamera Position="10,10,10"
    LookDirection="-2,-2,-2"
    FieldOfView="50"
    UpDirection="0,1,0"
    FarPlaneDistance="1000"
    NearPlaneDistance="1">
                <!--設置相機旋轉標簽-->
                <PerspectiveCamera.Transform>
                    <!--分組標簽,在分組標簽內可以有多個變形標簽-->
                    <Transform3DGroup>
                        <!--CenterX="0" CenterY="0" CenterZ="0" 設置相機旋轉中心點-->
                        <RotateTransform3D CenterX="3" CenterY="0" CenterZ="0">
                            <!--設置相機旋轉方式標簽-->
                            <RotateTransform3D.Rotation>
                                <!--AxisAngleRotation3D 設置相機按照軸的方式旋轉標簽-->
                                <!--Angle="45" 設置相機按照45度角旋轉-->
                                <!--Axis="0 1 0" 設置以那個軸進行旋轉 (x y z)-->
                                <AxisAngleRotation3D Angle="0" Axis="0 1 0" x:Name="aar"/>
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                        <!--平移標簽-->
                        <!--OffsetX="1" OffsetY="1" OffsetZ="1" 設置 x y z 三個方向的移動距離-->
                        <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0" x:Name="tt"/>
                        <!--縮放標簽-->
                        <!--ScaleX="1" ScaleY="1" ScaleZ="1" 設置圖像縮放大小 1是原始大小 小於1是相機尺寸變小,圖像變大 大於1是相機尺寸變大,圖像變小 -->
                        <!--一般很少使用相機平移調整圖像放大縮小,可以使用相機視野調整圖像放大與縮小-->
                        <ScaleTransform3D ScaleX="1" ScaleY="1" ScaleZ="1"/>
                    </Transform3DGroup>
                </PerspectiveCamera.Transform>
            </PerspectiveCamera>
            <!--正交相機(遠近比例都一樣-很少用)-->
            <!--Width="50" 相當與透視相機的視野範圍屬性-->
            <!--<OrthographicCamera Position="100,100,100"
     LookDirection="-2,-2,-2"
     Width="50"
     UpDirection="0,1,0"
     FarPlaneDistance="1000"
      NearPlaneDistance="1"/>-->
        </h:HelixViewport3D.Camera>

        
        <!--設置旋轉動作靠什麼來操作-->
        <h:HelixViewport3D.RotateGesture>
            <!--設置滑鼠操作旋轉動作-->
            <!--MouseAction="LeftClick" 設置滑鼠左鍵旋轉-->
            <MouseGesture MouseAction="LeftClick"/>
        </h:HelixViewport3D.RotateGesture>
        <!--設置3D圖像移動操作-->
        <h:HelixViewport3D.PanGesture>
            <!--設置滑鼠右鍵移動3D圖像-->
            <MouseGesture MouseAction="RightClick"/>
        </h:HelixViewport3D.PanGesture>

        
        <!--第二步在3D世界設置光源進來,沒有光源全是黑的呀-->
        <!--光源標簽-設置光源的相關屬性-->
        <ModelVisual3D>
            <!--光源內容標簽-->
            <ModelVisual3D.Content>
                <!--多個光源可以組合使用-會出現不同的效果-->
                <Model3DGroup>
                    <!--環境游標簽    -->
                    <!--Color="White"-設置環境光顏色 -->
                    <AmbientLight Color="White"/>

                    <!--平行光-設置某一個方向上照射的光-平行光不發散 -->
                    <!--Direction="-1,-1,-1" (x,y,z)三個方向照射的光 設置平行光的照射方向-->
                    <!--<DirectionalLight Color="White" Direction="-1,-1,-1"/>-->

                    <!--點光源-點光源是向四面八方發散的光源 -->
                    <!--Position="100,100,100" (x,y,z) 設置光源點-->
                    <!--Range="200" 設置光源的照射範圍-->
                    <!--<PointLight Color="White" Position="100,100,100" Range="200"/>-->

                    <!--射燈光源(聚光燈,手電筒筒)-某一個方向去發射光源-相當於手電筒筒有一個中心的光柱(比較亮的)以及兩遍發散的光源(相對較暗) -->
                    <!--InnerConeAngle="100" 設置中心範圍光柱的角度-->
                    <!--OuterConeAngle="40" 設置兩遍光源的範圍角度-->
                    <!--Position="50,50,50" 設置光源的中心位置-->
                    <!--Direction="-1,-1,-1" (x,y,z)三個方向照射的光 設置光源的照射方向-->
                    <!--<SpotLight Color="Orange" InnerConeAngle="100"
   OuterConeAngle="40"
   Position="50,50,50"
   Direction="-1,-1,-1"/>-->
                </Model3DGroup>
            </ModelVisual3D.Content>
        </ModelVisual3D>

        <!--動態庫提供的光源-比較全-建議使用這個-當然自己寫也可以 -->
        <!--<h:DefaultLights/>-->


        <!--3D圖形的第一個面 可以把所有的面放在一起寫-->
        <!--3DUIElement標簽-固定寫法-->
        <!--MouseLeftButtonDown 滑鼠左鍵點擊事件-->
        <ModelUIElement3D  MouseLeftButtonDown="ModelUIElement3D_MouseLeftButtonDown">
            <ModelUIElement3D.Model>
                <!--GeometryModel3D網格標簽-->
                <GeometryModel3D>
                    <!--第三步物體需要呈現出來需要材質-->
                    <!--3D的材質 標簽-->
                    <GeometryModel3D.Material>
                        <MaterialGroup>
                            <!--漫反射的一種材質 材質是與網格屬性標簽組合在一起使用的-->
                            <!--DiffuseMaterial 慢反射材質標簽-->
                            <!--Brush 設置材質顏色或圖片-->
                            <!--<DiffuseMaterial Brush="Orange"/>-->
                            <!--3D面設置背景圖-需要在網格標簽中設置TextureCoordinates="0,1 0,0 1,0 1,1"屬性,背景圖顯示方向,才能顯示出背景圖 -->
                            <DiffuseMaterial>
                                <DiffuseMaterial.Brush>
                                    <ImageBrush ImageSource="Arrow.png"/>
                                </DiffuseMaterial.Brush>
                            </DiffuseMaterial>
                            <!--自發光-->
                            <!--<EmissiveMaterial Brush="Red"/>-->
                            <!--<SpecularMaterial Brush="Blue"/>-->
                        </MaterialGroup>
                    </GeometryModel3D.Material>
                    <!--BackMaterial 異面材質標簽-->
                    <GeometryModel3D.BackMaterial>
                        <DiffuseMaterial Brush="Green"/>
                    </GeometryModel3D.BackMaterial>
                    <!--網格標簽-->
                    <GeometryModel3D.Geometry>
                        <!-- MeshGeometry3D呈現3D圖形的標簽  Positions="0,0,0(x,y,z)     3,0,0      3,2,0      0,2,0" 一個面的4個點-->
                        <!--TriangleIndices ="0,2,3(第一組-這裡的坐標點需要逆時針順序) 0,1,2(第二組)" 設置Positions的3個點組成一個三角行 -->
                        <!--這裡如果呈現的是三角行而不是四邊行的畫,是因為TriangleIndices="0,2,3 0,1,2"的畫點順序需要逆時針順序-->
                        <!--TextureCoordinates 設置平面對象與3D對象的映射關係-用來解決平面設置背景圖顯示問題-如果不設置這個屬性平面設置的背景圖不顯示-->
                        <MeshGeometry3D Positions="0,0,0     3,0,0      3,2,0      0,2,0"
                      TriangleIndices="0,2,3 0,1,2"
                             TextureCoordinates="1,1 1,0 0,0 0,1"/>
                        <!--箭頭向下-->
                        <!--TextureCoordinates="1,1 0,1 0,0 1,0"/> 箭頭向左-->
                        <!--TextureCoordinates="0,1 1,1 1,0 0,0"/> 箭頭向右-->
                        <!--TextureCoordinates="0,1 0,0 1,0 1,1"/>-->
                        <!--  箭頭向上-->
                    </GeometryModel3D.Geometry>
                </GeometryModel3D>
            </ModelUIElement3D.Model>
        </ModelUIElement3D>

        <!--Viewport2DVisual3D 平面對象載入標簽用於在3D對象中呈現2D控制項-->
        <Viewport2DVisual3D>
            <!--網格標簽-->
            <Viewport2DVisual3D.Geometry>
                <!-- MeshGeometry3D呈現3D圖形的標簽  Positions="0,0,0(x,y,z)     3,0,0      3,2,0      0,2,0" 一個面的4個點-->
                <!--TriangleIndices ="0,2,3(第一組-這裡的坐標點需要逆時針順序) 0,1,2(第二組)" 設置Positions的3個點組成一個三角行 -->
                <!--這裡如果呈現的是三角行而不是四邊行的畫,是因為TriangleIndices="0,2,3 0,1,2"的畫點順序需要逆時針順序-->
                <!--TextureCoordinates 設置平面對象與3D對象的映射關係-用來解決平面設置背景圖顯示問題-如果不設置這個屬性平面設置的背景圖不顯示-->
                <MeshGeometry3D Positions="0,0,1     3,0,1      3,2,1      0,2,1"
                     TriangleIndices="0,2,3 0,1,2"
                     TextureCoordinates="0,1 1,1 1,0 0,0"/>
            </Viewport2DVisual3D.Geometry>
            <!--Material設置3D的材質 標簽-->
            <Viewport2DVisual3D.Material>
                <!--IsVisualHostMaterial 屬性是將DiffuseMaterial材質設置成2D平面的盒子 - 用於解決將Button按鈕顯示出來 -->
                <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/>
            </Viewport2DVisual3D.Material>

            <Border>
                <Button Content="Hello" Click="Button_Click"/>
            </Border>
        </Viewport2DVisual3D>

        <!--3D圖形的第二個面 可以把所有的面放在一起寫 這裡沒有放在一起寫是因為可以給每個面設置不同的顏色-->
        <!--3DUIElement標簽-固定寫法-->
        <ModelUIElement3D>
            <ModelUIElement3D.Model>
                <!--GeometryModel3D網格標簽-->
                <GeometryModel3D>
                    <!--第三步物體需要呈現出來需要材質-->
                    <!--3D的材質 標簽-->
                    <GeometryModel3D.Material>
                        <MaterialGroup>
                            <!--漫反射的一種材質 材質是與網格屬性標簽組合在一起使用的-->
                            <!--DiffuseMaterial 慢反射材質標簽-->
                            <!--Brush 設置材質顏色或圖片-->
                            <DiffuseMaterial Brush="Red"/>
                            <!--<DiffuseMaterial>
          <DiffuseMaterial.Brush>
              <ImageBrush ImageSource="Arrow.png"/>
          </DiffuseMaterial.Brush>
      </DiffuseMaterial>-->
                            <!--自發光 標簽-用於設置在沒有光源的情況下可以看見自發光顏色-在有光源的情況下自發光顏色會影響到材質顏色的顯示 -->
                            <!--<EmissiveMaterial Brush="Green"/>-->
                            <!--全反射標簽 目前只是瞭解一下-->
                            <!--<SpecularMaterial Brush="Blue"/>-->
                        </MaterialGroup>
                    </GeometryModel3D.Material>
                    <!--BackMaterial 異面材質標簽-->
                    <GeometryModel3D.BackMaterial>
                        <DiffuseMaterial Brush="Blue"/>
                    </GeometryModel3D.BackMaterial>
                    <!--網格標簽-->
                    <GeometryModel3D.Geometry>
                        <!-- 呈現3D圖形的標簽  Positions="0,0,0(x,y,z)     3,0,0      3,2,0      0,2,0" 一個面的4個點-->
                        <!--TriangleIndices ="0,2,3(第一組-這裡的坐標點需要逆時針順序) 0,1,2(第二組)" 設置Positions的3個點組成一個三角行 -->
                        <!--這裡如果呈現的是三角行而不是四邊行的畫,是因為TriangleIndices="0,2,3 0,1,2"的畫點順序需要逆時針順序-->
                        <MeshGeometry3D Positions="3,2,1     3,2,0      3,0,0      3,0,1"
           TriangleIndices="0,3,1    1,3,2"/>
                    </GeometryModel3D.Geometry>
                </GeometryModel3D>
            </ModelUIElement3D.Model>
        </ModelUIElement3D>

    </h:HelixViewport3D>
</Grid>

  代碼實例效果圖:

代碼實例:
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過本文可以收穫:google gtest急速入門、google gtest資源網站。 google gtest是什麼 google gtest是谷歌開源的c++單元測試框架,非常的好用。 起碼個人感覺和spring boot自帶的測試框架功能差不太多。 安裝 略過,請參考:GitHub - goo ...
  • 南丁格爾玫瑰圖是一種用極坐標下的柱狀圖或堆疊柱狀圖來展示數據的圖表。 雖然南丁格爾玫瑰圖外觀類似餅圖,但是表示數據的方式不同,它是以半徑來表示數值的,而餅圖是以扇形的弧度來表達數據的。 所以,南丁格爾玫瑰圖在視覺上會誇大數據的比例,因為半徑和麵積之間是平方關係。因此,當需要對比非常相近的數值時,適當 ...
  • SpringCloud工程可以使用Nacos作為註冊中心和配置中心,配置和使用非常簡單,本文將簡單介紹使用方式,並分析其實現方式。 SpringCloud工程集成Nacos SpringCloud工程使用Nacos非常簡單,只需要引入依賴、編寫配置參數、在啟動類上添加註解即可。 引入依賴 <depe ...
  • 在RocketMQ 5.0以前,有兩種集群部署模式,分別為主從模式(Master-Slave模式)和Dledger模式。 主從模式 主從模式中分為Master和Slave兩個角色,集群中可以有多個Master節點,一個Master節點可以有多個Slave節點。Master節點負責接收生產者發送的寫入 ...
  • 一:背景 1. 講故事 前幾天有位朋友微信上找到我,說他的程式會偶發性崩潰,一直找不到原因,讓我幫忙看一下怎麼回事,對於這種崩潰類的程式,最好的辦法就是丟dump過來看一下便知,話不多說,上windbg說話。 二:WinDbg 分析 1. 到底是哪裡的崩潰 對於一個崩潰類的dump,尋找崩潰點非常重 ...
  • 在 C# 中,null 是一個特殊存在,表示缺少值。Null 可以分配給引用類型和可為 null 的值類型,但不能分配給不可為空的值類型。在 C# 中處理 null 值是編寫可靠且可靠的代碼的一個重要方面。在本文中,我將討論一些在 C# 中處理 null 值的最常用技術。 1 、NULL合併操作符( ...
  • 記錄下在開發中經常用到的類型轉換 /// <summary> /// 轉換擴展類 /// </summary> public static partial class Extensions { #region 轉換為long /// <summary> /// 將object轉換為long,若轉換失 ...
  • 基礎說明 本文根據 RFC4226 和 RFC6238 文檔,詳細的介紹 HOTP 和 TOTP 演算法的原理和實現。 兩步驗證已經被廣泛應用於各種互聯網應用當中,用來提供安全性。對於如何使用兩步驗證,大家並不陌生,無非是開啟兩步驗證,然後出現一個二維碼,使用支持兩步驗證的移動應用比如 Google ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...