草庐IT

*一年来再次重大更新:Cesium 1.83 来了

岭南灯火 2023-03-28 原文

概览

动态地形夸大过倾光线时阴影渐隐效果增加 KTX2 和 Basis Universal 纹理格式的支持、自定义高程提供器、3D-Tiles 扩展检查机制

提供 Windows *台外边线无效的提示文档

修复旧式 tileset 顶级瓦片无几何误差的错误、修复相机互操作问题、修复后处理异常和闪屏问题

更新部分文字性描述(文档类)

终结 IE11 的支持:1.83 是最后一个支持 IE11 的版本。

破坏式更新 ?

  • 不再支持 KTX1 和 Crunch 纹理;使用 ktx2ktx2 升级 ktx1 文件

功能新增 ?

  • 新增 动态地形夸大功能,见 Globe.terrainExaggerationGlobe.terrainExaggerationRelativeHeight

    此更新是自 2015 年以来的再次优化。前者是夸大的倍数,后者是向上向下夸大的基准高度。

    地形夸大的旧 API Globe.terrainExaggeration 将在 1.85 中移除。

    原理:存储每个顶点的 f32 类型的测地法线,并在着色器中将其添加到相对中心,它的效果即使不是 64 位仿真中也是不错的,官方测试中使用 32 位法线精度最多只有 10 厘米的误差值。

    float newHeight = (height - relativeHeight) * exaggeration + relativeHeight;
    positionRTC += geodeticSurfaceNormal * (newHeight - height);
    // ... 从 positionRTC 坐标转世界坐标
    

    当地形夸大数字不是 1.0 时(哪怕是 1.01)才存储大地表面法线。所以,这是一个消耗内存的行为。静态夸大(旧API)是类似于烘焙的效果直接写入几何中,所以内存是不变的。在 TerrainMesh 类中,大约会额外占用 30% 的内存(可参考 Chrome 开发者工具的 内存快照,查看具体类的内存占用)。

    参考 pr

  • 新增 ShadowMap 参数:options.fadingEnabled 来当光源接*地*线时,控制阴影是否具有淡出的效果。此选项默认开启。

  var shadowMap = viewer.shadowMap;
  shadowMap.maximumDistance = 100000.0; // 米为单位
  shadowMap.darkness = 0; // 月球上是黑色阴影
  // !!!
  // 新 API,这个属性默认是 true,此处显性设为 false
  shadowMap.fadingEnabled = false;
  • 新增对 KTX2 和 Basis Universal 纹理格式的支持;

    • 增加对 glTF 格式中 KHR_texture_basisu 扩展的支持
    • 添加了对 8 位、16 位浮点和 32 位浮点的 KTX2 镜面反射环境贴图的支持
    • Material 模块中添加了对 KTX2 图像的支持
    • 对枚举模块 PixelFormatWebGLConstants 添加了 EXT_texture_compression_bptcWEBGL_compressed_texture_etcWEBGL_compressed_texture_astc 扩展

    KHR_texture_basisu 纹理支持非 2次幂 尺寸的纹理贴图,但是官方仍然建议使用长宽尺寸一样的、且为 2次幂 的纹理贴图。见 pr 9513

  • 新增自定义高度图地形提供器,即新 API CustomHeightmapTerrainProvider,从一个回调函数里获取高程数据。从下列例子中可看出,只需指定能 返回高度类型数组 的回调函数、宽度、高度三个属性即可。

var width = 32;
var height = 32;
var viewer = new Cesium.Viewer("cesiumContainer", {
  terrainProvider: new Cesium.CustomHeightmapTerrainProvider({
    callback: function (x, y, level) {
      var buffer = new Float32Array(width * height);
      for (var yy = 0; yy < height; yy++) {
        for (var xx = 0; xx < width; xx++) {
          var v = (y + yy / (height - 1)) / Math.pow(2, level);
          var heightValue = 8000 * (Math.sin(4000 * v) * 0.5 + 0.5);
          var index = yy * width + xx;
          buffer[index] = heightValue;
        }
      }
      return buffer;
    },
    width: width,
    height: height,
  }),
});

有趣的是,这个虽然很灵活,但是官方仍然建议使用成熟的 TerrainProvider,因为这个没有水面特效。

  • 3dTiles 扩展检查器

    若一个 tileset 在 extensionsRequired 数组中指定了一个非官方记录的扩展,会直接弹出运行时错误:

    throw new RuntimeError("Unsupported 3D Tiles Extension: " + extension)
    

    参考 API Cesium3DTileset.checkSupportedExtensions(this._extensions),官方参考了 ModelUtility.js 模块中对 glTF 的扩展的扩展检查。

  • 终于!更新了文档:在 Windows *台上所有主流浏览器将忽略 outlineWidth 属性(在Windows 的 WebGL 本身不支持外边线线宽绘制)。涉及到的模块有:

    • BoxGraphics
    • CorridorGraphics
    • CylinderGraphics
    • EllipseGraphics
    • EllipsoidGraphics
    • PlaneGraphics
    • PolygonGraphics
    • RectangleGraphics
    • WallGraphics
    • PolylineVolumeGraphics

    届时可以查看最新的帮助文档。

  • KmlTour, KmlTourFlyTo, 和 KmlTourWait 模块增加了文档。为 KmlDataSource 模块的 kmlTours 读类型属性添加文档,并从 KmlTourSoundCues 类中移除文档引用。

  • 对 OSM Buildings 以及其他在 glTF 模型中用到了 CESIUM_primitive_outline 扩展的 tileset 提供隐藏边线的能力。

    主要是在 Model.jsBatched3DModel3DTileContent.jsCesium3DTileset.jsGltf3DTileContent.jsInstanced3DModel3DTileContent.jsModelInstanceCollection.jscreateOsmBuildings.jsModelSpec.js 作出了修改,部分模块加入 showOutline 属性。 (参考 pr

  • 对于 glTF 某些特定的纹理和 ImageBitmap 的色彩空间,提供了 ignore 选项。

修复?

  • 修复了一些旧式 tileset 中顶级瓦片因为没有几何误差而不加载的错误

    以往有一些 3dtiles 的根属性中没有 geometricError,会导致 preprocess3DTileContent.js 模块判断错误。在 1.83 中已修复为判断 root 属性。

  • 修复了 WebMapTileServiceImageryProvider 这个模块中若 URL 使用了子域(SubDomains)后,请求会因为查询参数而失败的情况(详细问题见:9598

  • 修复了 ScreenSpaceCameraController.tilt3DOnTerain API 中当摇晃相机视角时,会有偏移的小问题。精彩推理见:9562 似乎是国人

  • 当地球表面瓦片(GlobeSurfaceTile模块)请求错误时,修复在控制台中的报错

  • 修复了沙盒示例中 KML 示例的缩略图丢失

  • 修复了 GlobeFS 着色器中当自定义材质的 positionToEyeECtangentToEyeMatrix 属性未设置的错误

    // GlobeFS.glsl
    void main() {
      // 其他部分略
      materialInput.positionToEyeEC = -v_positionEC;
      materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, normalize(v_normalEC));  
    }
    
  • 修复了 Matrix4 模块中 inverseinverseTransformation 中使用 仿射变换 的误导性文档,已使用旋转和*移替代。

  • 当 glTF 模型引用了外部图像资源且没有被 preferImageBitmap 加载时,它会在主线程的解码过程中造成帧率暴跌的问题,已经修复;通常 glTF 的图像资源都是内嵌的,也就是 glb 的形式,这个问题被官方发现并修复。针对的模块:Scene/GltfImageLoader.jsScene/Model.js

  • 修复 Cesium3DTileStyle 中关于颜色、显隐的误导性 else 条件设置。逻辑上,如果没有给定,那就应该使用默认值 true。主要针对的模块:Scene/Cesium3DTileBatchTable.js

  • 修复后处理禁用后再启用时发生崩溃的问题,这个修复同时能防止在第一次启用后处理阶段功能时闪屏的问题。原因似乎是如果没有任何一个后处理阶段被标记为活动的话,缓存的纹理就不会创建 FBO,虽然这些后处理都启用了。针对模块:PostProcessStageCollection.js

功能废弃⏳

  • CesiumWidget, Viewer, 及 Scene 模块的 Scene.terrainExaggerationoptions.terrainExaggeration 将会在 1.85 版本中移除。 使用 Globe.terrainExaggeration API 来代替他们。
  • loadCRNloadKTX 函数被移除。
  • 对 IE11 的支持将在 1.84 正式停止

有关*一年来再次重大更新:Cesium 1.83 来了的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  4. ruby-on-rails - Rails Associations 的更新方法是什么? - 2

    这太简单了,太荒谬了,我在任何地方都找不到关于它的任何信息,包括API文档和Rails源代码:我有一个:belongs_to关联,我开始理解当您没有关联时您在Controller中调用的正常模型方法与您有关联时调用的方法略有不同。例如,我的关联在创建Controller操作时运行良好:@user=current_user@building=Building.new(params[:building])respond_todo|format|if@user.buildings.create(params[:building])#etcetera但我找不到关于更新如何工作的文档:@user

  5. ruby-on-rails - OSX Yosemite 更新破坏了 pow.cx - 2

    升级到OSXYosemite后,我现有的pow.cx安装不起作用。升级到最新的pow.cx无效。通过事件监视器重新启动它也没有成功。 最佳答案 卸载(!)并重新安装解决了这个问题。curlget.pow.cx/uninstall.sh|shcurlget.pow.cx|sh 关于ruby-on-rails-OSXYosemite更新破坏了pow.cx,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q

  6. ruby - 将 Gitlab 从 9.3.7 更新到 9.3.8 安装 re2 时出错 - 2

    我们在Ubuntu14.04和Gitlab9.3.7上运行,运行良好。我们正在尝试更新到Gitlabv9.3.8的最新安全补丁,但它给我们这个错误:Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension.currentdirectory:/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/re2-1.0.0/ext/re2/usr/local/bin/ruby-r./siteconf20170720-19622-15i0edf.rbextconf.rbcheckingformain(

  7. ruby-on-rails - Rails 更新属性 - 2

    我遇到了以下问题。我有一个名为user的模型,它有一个名为activated的列。我试图通过激活的方法更新该值?但它给我错误:验证失败:密码不能为空,密码太短(最少6个字符)这对我来说没有意义,因为我没有接触密码字段!我只想更新激活的列。我把我认为相关的代码放在这里,但如果你认为你需要更多,请问:)非常感谢您!型号:attr_accessor:passwordattr_accessible:name,:email,:password,:password_confirmation,:activatedhas_many:sucu_votesemail_regex=/\A[\w+\-.]+@

  8. ruby-on-rails - 如果存在则更新,否则什么也不做? - 2

    当且仅当模型存在时,我才尝试更新模型的值。如果没有,我什么都不做。搜索似乎只返回更新或创建问题/答案,但我不想创建。我知道我可以用一个简单的方法来做到这一点:found=Model.find_by_id(id)iffoundupdatestuffend但是,我觉得有一种方法可以在一次调用中完成此操作,而无需分配任何临时本地值或执行if。如果记录不存在,我该如何编写一个Rails调用来更新记录而不出现嘈杂错误?最新的Rails3.x 最佳答案 您可以使用try在对find_by_id或where的结果调用update_attribut

  9. ruby-on-rails - 如何在记录更新期间从验证中排除密码字段? ( rails 3.0.4, ruby 1.9.2) - 2

    我有一个允许更新用户记录的表单。它包含:password和:password_confirmation字段,但我不希望在数据库中已存储加密密码时对它们运行验证。View文件中的字段:'ConfirmPassword'%>在互联网上搜索时,我发现了这段代码,我认为它是针对以前版本的Ruby/Rails的。(我会把它放在我的用户模型中。)validates_presence_of:password,:on=>create由于我的用户模型中密码验证的语法不同(如下),我对我需要的语法感到困惑。validates:password,:presence=>true,:confirmation=>

  10. ruby - 如何更新到 Ruby 1.8.7 - 2

    我是Ruby新手,请多多包涵。我一直在尝试将我的Ruby更新到1.8.7,但在我的MacOSX(10.5.7)上遇到了很多问题。说真的,你如何更新到Ruby1.8.7?谢谢。 最佳答案 最简单的答案是“不要”。Ruby1.8.7是在1.8和1.9之间创建桥接版本的尝试,社区一致认为这没有必要,因此在1.9最终确定之前几乎没有人支持它。一般建议要么坚持使用1.8(该版本随OSX10.5一起提供),要么使用Ruby1.9。MacPorts有适用于Ruby1.8.7和Ruby1.9的软件包,因此这可能是获得更新版本的Ruby的最简单方法,

随机推荐