zoukankan      html  css  js  c++  java
  • maptalks 开发GIS地图(39)maptalks.three.32- custom-mergedmixin

    1. 这个不觉明历。在我看来,这和 boxs 那个例子差不多。

    2. 只不过扩展类 TestBoxs 继承了 maptalks.MergedMixin ,这个估计要看源码才能明白是啥了。

      1  class TestBoxs extends maptalks.MergedMixin(maptalks.BaseObject) {
      2             constructor(points, options, material, layer) {
      3                 if (!Array.isArray(points)) {
      4                     points = [points];
      5                 }
      6                 const len = points.length;
      7                 const center = getCenterOfPoints(points);
      8                 const centerPt = layer.coordinateToVector3(center);
      9                 const geometries = [], bars = [], geometriesAttributes = [], faceMap = [];
     10                 let faceIndex = 0, psIndex = 0, normalIndex = 0, uvIndex = 0;
     11                 for (let i = 0; i < len; i++) {
     12                     const opts = maptalks.Util.extend({ index: i }, OPTIONS1, points[i]);
     13                     const { radius, altitude, topColor, bottomColor, height, coordinate } = opts;
     14                     const r = layer.distanceToVector3(radius, radius).x;
     15                     const h = layer.distanceToVector3(height, height).x;
     16                     const alt = layer.distanceToVector3(altitude, altitude).x;
     17                     const buffGeom = defaultGeometry.clone();
     18                     buffGeom.scale(r * 2, r * 2, h);
     19                     const v = layer.coordinateToVector3(coordinate).sub(centerPt);
     20                     const parray = buffGeom.attributes.position.array;
     21                     for (let j = 0, len1 = parray.length; j < len1; j += 3) {
     22                         parray[j + 2] += alt;
     23                         parray[j] += v.x;
     24                         parray[j + 1] += v.y;
     25                         parray[j + 2] += v.z;
     26                     }
     27                     const position = buffGeom.attributes.position;
     28                     const normal = buffGeom.attributes.normal;
     29                     const uv = buffGeom.attributes.uv;
     30                     const index = buffGeom.index;
     31                     geometries.push({
     32                         position: position.array,
     33                         normal: normal.array,
     34                         uv: uv.array,
     35                         indices: index.array
     36                     });
     37                     const bar = new TestBox(coordinate, opts, material, layer);
     38                     bars.push(bar);
     39 
     40                     const faceLen = buffGeom.index.count / 3;
     41                     faceMap[i] = [faceIndex + 1, faceIndex + faceLen];
     42                     faceIndex += faceLen;
     43 
     44                     const psCount = buffGeom.attributes.position.count,
     45                         //  colorCount = buffGeom.attributes.color.count,
     46                         normalCount = buffGeom.attributes.normal.count, uvCount = buffGeom.attributes.uv.count;
     47                     geometriesAttributes[i] = {
     48                         position: {
     49                             count: psCount,
     50                             start: psIndex,
     51                             end: psIndex + psCount * 3,
     52                         },
     53                         normal: {
     54                             count: normalCount,
     55                             start: normalIndex,
     56                             end: normalIndex + normalCount * 3,
     57                         },
     58                         // color: {
     59                         //     count: colorCount,
     60                         //     start: colorIndex,
     61                         //     end: colorIndex + colorCount * 3,
     62                         // },
     63                         uv: {
     64                             count: uvCount,
     65                             start: uvIndex,
     66                             end: uvIndex + uvCount * 2,
     67                         },
     68                         hide: false
     69                     };
     70                     psIndex += psCount * 3;
     71                     normalIndex += normalCount * 3;
     72                     // colorIndex += colorCount * 3;
     73                     uvIndex += uvCount * 2;
     74                 }
     75                 super();
     76                 options = maptalks.Util.extend({}, { altitude: 0, layer, points }, options);
     77                 this._initOptions(options);
     78                 const geometry = maptalks.MergeGeometryUtil.mergeBufferGeometries(geometries);
     79                 this._createMesh(geometry, material);
     80                 const altitude = options.altitude;
     81                 const z = layer.distanceToVector3(altitude, altitude).x;
     82                 const v = centerPt.clone();
     83                 v.z = z;
     84                 this.getObject3d().position.copy(v);
     85 
     86                 this._faceMap = faceMap;
     87                 this._baseObjects = bars;
     88                 this._datas = points;
     89                 this._geometriesAttributes = geometriesAttributes;
     90                 this.faceIndex = null;
     91                 this._geometryCache = geometry.clone();
     92                 this.isHide = false;
     93                 this._colorMap = {};
     94                 this._initBaseObjectsEvent(bars);
     95                 this._setPickObject3d();
     96                 this._init();
     97             }
     98 
     99             // eslint-disable-next-line no-unused-vars
    100             identify(coordinate) {
    101                 return this.picked;
    102             }
    103         }

    3. 页面显示

    4. 源码地址

    https://github.com/WhatGIS/maptalkMap/tree/main/threelayer/demo

  • 相关阅读:
    前端Tips#3
    前端Tips#2
    图算法
    【Javascript】重新绑定默认事件
    【Yeoman】热部署web前端开发环境
    添加远程链接MySQL的权限
    background-clip 背景图片做适当的裁剪
    linux系统下将php和mysql命令加入到环境变量中的方法
    background-size 设置背景图片的大小
    multiple backgrounds 多重背景
  • 原文地址:https://www.cnblogs.com/googlegis/p/14737889.html
Copyright © 2011-2022 走看看