cesium-2-entity(包含gltf創建)和primitive

来源:https://www.cnblogs.com/CoderWangEx/archive/2023/04/27/17359352.html
-Advertisement-
Play Games

1、四層結構 viewer --> datasources(DataSourceCollection類型) --> datasource --> entities(EntityCollection類型) --> entity 需要學習的方向是:只需要註意每個層與層之間的關係和entity實例如何創建 ...


1、四層結構


viewer --> datasources(DataSourceCollection類型) --> datasource --> entities(EntityCollection類型) --> entity


需要學習的方向是:只需要註意每個層與層之間的關係和entity實例如何創建即可

2、DataSourceCollection

增:
add(dataSource) → Promise.<DataSource>
刪:(destroy一般為boolean,指是否需要直接銷毀該datasource)
remove(dataSource, destroy) → boolean
removeAll(destroy)
查:
indexOf(dataSource) → number
getByName(name) → Array.<DataSource>
get(index) → DataSource
contains(dataSource) → boolean
改:
該類型數據一般是指向型,直接調出屬性直接修改即可
改變層級關係(特殊):
lower(dataSource)
lowerToBottom(dataSource)
raise(dataSource)
raiseToTop(dataSource)

3、datasource

這是一個抽象類,有各種實現方式
image
一般只會用到他的三個屬性:entities、name和show

4、entities(EntityCollection類型)

增:
add(entity) → Entity
getOrCreateEntity(id) → Entity
刪:
removeAll()
removeById(id) → boolean
remove(entity) → boolean
查:
contains(entity) → boolean
getById(id) → Entity|undefined
改:

重要屬性:

id : string
owner : DataSource|CompositeEntityCollection
show : boolean
values : Array.<Entity>  // 全部的entity

5、創建新的entity

一些實例:
https://www.jianshu.com/p/4250e822c9c8

6、代碼

需要註意的是這裡的add()方法得到的是<promise.類型>,後面需要使用.then(成功函數,失敗函數)來得到類型
add(dataSource) → Promise.<DataSource>
這種類怎麼創建和怎麼用見:
https://blog.csdn.net/ABCFF12333/article/details/118188018

  // 註意add()方法得到的是<promise.類型>,後面需要使用.then(成功函數,失敗函數)來得到類型
  // 註意這是非同步方法
  viewer.dataSources.add(new Cesium.CustomDataSource("pointDataSource1")).then(function(value){
    var pointDataSource = value;
    pointDataSource.show = true;
    var point1 = pointDataSource.entities.add({
      id: "point1",
      name: "point1",
      position: Cesium.Cartesian3.fromDegrees(109, 34, 0),
      point: {
        pixelsize: 10,
        color: Cesium.Color.YELLOW,
        outlineWidth: 2,
        outlineColor: Cesium.Color.RED
      }
    });
    var point2 = pointDataSource.entities.add({
      id: "point2",
      name: "point2",
      position: Cesium.Cartesian3.fromDegrees(110, 35, 0),
      point: {
        pixelsize: 10,
        color: Cesium.Color.YELLOW,
        outlineWidth: 2,
        outlineColor: Cesium.Color.RED
      }
    })
  },function(error){})

  viewer.dataSources.add(new Cesium.CustomDataSource("polygonDatasource")).then(function(value){
    var polygonDatasource = value;
    polygonDatasource.show = true;
    polygonDatasource.entities.add({
      id: "polygon1",
      name: "polygon1",
      polygon: {
        hierarchy: Cesium.Cartesian3.fromDegreesArray([
          109.080842, 45.002073,
          105.91517, 45.002073,
          104.058488, 44.996596,
          104.053011, 43.002989,
          104.053011, 41.003906,
          105.728954, 40.998429,
          107.919731, 41.003906,
          109.04798, 40.998429,
          111.047063, 40.998429,
          111.047063, 42.000709,
          111.047063, 44.476286,
          111.05254, 45.002073,
          109.080842, 45.002073
        ]),
        height: 10,  // 必須要有高度,否則沒有邊框
        material: Cesium.Color.GREEN,
        outline: true,
        outlineColor: Cesium.Color.RED,
        outlineWidth: 2,
        fill: true
      }
    })
  },function(error){})
})

7、載入gltf

先瞭解一下heading、pitch、roll
image
因為原始數據的x、y、z軸可能與這個不同,所以當修改了pitch沒有發生俯仰而是看起來是roll發生了變化,就需要去查看原始數據的基準

gltfDatasource.entities.add({
    id: "model",
    position: position1,
    orientation: Cesium.Transforms.headingPitchRollQuaternion(position1, ori),
    model: {
      uri: "../SampleData/models/CesiumMan/Cesium_Man.glb",
      minimumPixelSize: 32, // 放到最小時的像素大小
      distanceDisplayCondition: new Cesium.DistanceDisplayCondition(10, 10000), // 只有相機與這個模型在這個距離區間才能顯示
      shadows: Cesium.ShadowMode.CAST_ONLY, // 陰影方式
      silhouetteColor: Cesium.Color.RED, // 模型邊框的顏色
      silhouetteSize: 5, //模型邊框的寬度
      colorBlendMode: Cesium.ColorBlendMode.MIX, // 修改模型顏色的方式,3種
      color: Cesium.Color.YELLOW, // 修改模型顏色
    },
    description: "飛機模型",
  });

混合顏色的模式:
image
陰影模式:
image

8、primitive層級

GeometryInstance、Primitive和PolylineGeometry是Cesium中用於創建三維圖元和進行渲染的三個重要概念,它們三者之間具有如下關係:

GeometryInstance是包含渲染所需的Geometry和Material信息的對象,描述了三維圖元的幾何形狀、外觀等屬性。

PolylineGeometry是一種Cesium.Geometry類型,用於描述一個由相鄰的線段組成的折線段。PolylineGeometry本身並不能被直接添加到場景中進行顯示,需要通過GeometryInstance包裝後再添加到Primitive中。

Primitive是用於渲染GeometryInstance的對象,它描述了渲染狀態、材質屬性、圖元通道、光源等信息,以決定如何將GeometryInstance渲染出可視化的結果。Primitive中的geometryInstances屬性通常是一個GeometryInstance數組對象,用於包含多個三維圖元的GeometryInstance信息。

因此,可以簡單地理解為GeometryInstance和PolylineGeometry是兩個不同的概念,其中PolylineGeometry是一種特定的Geometry類型,而GeometryInstance則是將Geometry、Material和其他屬性打包在一起,用於渲染顯示的對象;Primitive是用於渲染的對象,與GeometryInstance和其包含的Geometry和Material有一定關聯,它涵蓋了GeometryInstance的其他狀態信息,可以包含多個GeometryInstance進行批量渲染。這三者之間可以通過GeometryInstance包裝Geometry實現關聯,但是並不是嚴格的層級關係。

載入PointPrimitive

  // 創建點的primitive
  var pointPrimitivateCollection1 = viewer.scene.primitives.add(
    new Cesium.PointPrimitiveCollection({
      modelMatrix: Cesium.Matrix4.IDENTITY,
      debugShowBoundingVolume: false,
      blendOption: Cesium.BlendOption.OPAQUE_AND_TRANSLUCENT,
    })
  );
  for (var x = 0; x < 20; x++) {
    for (var y = 0; y < 20; y++) {
      pointPrimitivateCollection1.add({
        position: Cesium.Cartesian3.fromDegrees(x + 20, y + 20),
        color: Cesium.Color.YELLOW,
      });
    }
  }

載入polygon的primitive


  // 創建primitiveCollection1
  var primitiveCollection1 = viewer.scene.primitives.add(
    new Cesium.PrimitiveCollection()
  );

  // 創建geo
  var ge = new Cesium.PolygonGeometry({
    // PolygonHierarchy用於描述一個多邊形的層級結構,
    //它是一個包含一系列hierarchy屬性的對象,
    //每個hierarchy屬性都可以是一個PolygonHierarchy對象,
    //也可以是一個Cartesian3數組,用於描述多邊形中的子多邊形或洞穴。
    // PolygonHierarchy的實例通過遞歸嵌套包含多個PolygonHierarchy對象,
    // 形成了一個多層次的層級結構,每一層代表一個多邊形的封閉區域和其內部的所有子多邊形或洞穴。
    // Cesium在渲染顯示多邊形時會利用這些層級信息來正確計算多邊形的錶面法向量,
    // 進而展現出多邊形的正確的立體效果。
    polygonHierarchy: new Cesium.PolygonHierarchy(
      Cesium.Cartesian3.fromDegreesArray([
        -72.0, 40.0, -70.0, 35.0, -75.0, 30.0, -70.0, 30.0, -68.0, 40.0,
      ])
    ),
  });
  console.log("ge==>" + ge);
  // 創建實例
  var instance = new Cesium.GeometryInstance({
    geometry: ge,
    id: "polygon",
    //GeometryInstance中的attributes是一個鍵值對對象
    // 用來存儲用於渲染該GeometryInstance實例的各種屬性
    // 如顏色、透明度、法向量等信息。
    attributes: {
      color: Cesium.ColorGeometryInstanceAttribute.fromColor(
        Cesium.Color.YELLOW
      ),
    }, // 輸入樣式的鍵值對的字典
    show: true,
  });
  console.log("instance==>" + instance);

  //primitive的樣式欄位
  primitiveCollection1.add(
    new Cesium.Primitive({
      geometryInstances: instance,
      //Cesium中的PolylineColorAppearance是一種primitive的外觀(Appearance
      //用於渲染顏色漸變的線段,和PolylineMaterialAppearance一樣
      //用戶既可以對Cesium自帶的ColorMaterial進行使用
      //也可以自定義material達到自己的效果。
      appearance: new Cesium.MaterialAppearance({
        material: new Cesium.Material({
          // 這是在使用自製的材質
          //在Cesium中,當我們需要制定一個自定義的Material對象需要使用fabric庫來解析紋理圖像,
          // 因為fabric庫封裝的是瀏覽器支持的所有類型的點陣圖格式。
          fabric: {
            // 我們創建了一個材質對象,使用fabric庫來實現顏色紋理,fabric的type屬性指定為“Color”,uniforms表示添加屬性,
            // 使用顏色變數來設置屬性的值,以制定顏色紋理的樣式和屬性。
            type: "Image",
            uniforms: {
              image: "../img/3.jpg",
              repeat: new Cesium.Cartesian2(10, 10),
            },
          },
        }),
      }),
    })
  );

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 測試環境 Python 3.6.2 代碼實現 非多線程場景下使用 新建並保存EXCEL import win32com.client from win32api import RGB def save_something_to_excel(result_file_path): excel_app = ...
  • 以前寫的C++基本都是C with STL,大多是面向過程的演算法題,或者比較小的項目,然後經常報各種編譯錯誤(對編譯原理不熟),經常把人搞到崩潰,搞不懂構建、鏈接之類的東西。 現在開始記錄一下XMake的學習筆記,記錄一些學習過程中踩的坑,在這篇文章,你將學習到Windows下利用MSYS2進行Mi ...
  • 在.NET Core部署到linux(CentOS)最全解決方案,常規篇一文,我們詳細講解了傳統的.NET Core部署到Linux伺服器的方法,學到了Linux在虛擬機下的安裝、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的發佈與運行全過程。... ...
  • 最近遇到公司的一個項目,需要將多張圖片合併成一個播放的視頻,找了很多資料和嘗試了工具,遇到很多的坑,這裡記下來,希望大家也能順利解決遇到的問題。 合併視頻,主要可以借用OpenCV 和 ffmpeg,這裡是嘗試用ffmpeg.exe的工具去實現圖片文件合併成視頻。 輸入存儲視頻文件的路徑,通過Pro ...
  • 痞子衡嵌入式半月刊: 第 76 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • (Linux安裝軟體) 前言 這期呢主要說一說Linux中包軟體管理相關命令,這一期的命令雖然只有兩個。但 軟體包的安裝和卸載都是我們平常最常用的,需要熟練掌握。 rpm和yum 是CentOS 主要的包軟體管理。 兩個命令各有用處,①yum需要互聯網,yum會去網上的yum源獲取所需的軟體包 ② ...
  • 前言 本篇文章主要介紹的關於本人在使用MySql記錄筆記的一些使用方法和經驗,溫馨提示,本文有點長,約1.5w字,幾十張圖片,建議收藏查看。 一、MySql安裝 下載地址:https://dev.mysql.com/downloads/ 在安裝MySql之前,查看是否以及安裝過MySql,如果已經安 ...
  • CSS知識點總結 文章內容可能較多且雜亂,可以查看頁面右方的目錄,以及使用Ctrl+F搜索頁面內容進行內容定位。 常用屬性 推薦搭配文檔使用,可以複製屬性名,到文檔查看該屬性對應的可選值。 👉MDN Web Docs 盒模型 寬度:width 高度:height 邊框:border 圓角:bord ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...