Skip to content

分屏对比


ts
import { Viewer, MultiViewport, MultiViewportMode, BaseMapMode } from "joDVF";
import { Pane } from "tweakpane";
import { Matrix4, HeadingPitchRange } from "joCesium";

const { mapContainer, uiContainer } = createContainer();

const viewer = new Viewer(mapContainer);

let multiViewport = new MultiViewport(viewer, {
  mode: MultiViewportMode.Dual,
  subBasemap: {
    port1: BaseMapMode.ESRI
  }
});

let tileset = null;

addUI();
function addUI() {
  const pane = new Pane({
    container: uiContainer,
    title: "参数"
  });
  const modeList = pane.addBlade({
    view: "list",
    label: "分屏模式",
    options: [
      { text: "不使用分屏", value: 1 },
      { text: "双视口", value: 2 },
      { text: "三视口", value: 3 },
      { text: "四视口", value: 4 }
    ],
    value: 2
  });

  // 创建分屏
  const createBtn = pane.addButton({
    title: "create",
    label: "创建分屏",
    hidden: true
  });

  // 销毁分屏
  const destoryBtn = pane.addButton({
    title: "destory",
    label: "销毁分屏"
  });

  // 添加图层
  const addLayerBtn = pane.addButton({
    title: "addLayer",
    label: "添加图层" // optional
  });

  addLayerBtn.on("click", () => {
    if (tileset) return;
    tileset = multiViewport.add3DTiles(
      1,
      "./assets/3dtilesets/dayanta/tileset.json"
    );
    tileset.then((tileset) => {
      const modelMatrix = Matrix4.multiply(
        Matrix4.fromArray([
          0.8062928355854908, -0.603174364849412, 9.143814709566822e-7, 0,
          0.6031743648440513, 0.8062928355833111, 0.0000032891244039490175, 0,
          -0.0000027024209071525497, -0.0000020859899490521805,
          1.0069396462137954, 0, -348.5912848538027, 411.5427531453279,
          5.811543947085738, 1
        ]),
        Matrix4.inverse(tileset.root.transform, new Matrix4()),
        new Matrix4()
      );
      Matrix4.multiply(tileset.root.transform, modelMatrix, modelMatrix);
      tileset.modelMatrix = modelMatrix;
      const boundingSphere = tileset.boundingSphere;
      const radius = boundingSphere.radius;
      viewer.zoomTo(tileset, new HeadingPitchRange(-1.2, -0.6, radius * 2.0));
    });
  });

  // 删除图层
  const deleteLayerBtn = pane.addButton({
    title: "deleteLayer",
    label: "删除图层" // optional
  });

  deleteLayerBtn.on("click", () => {
    if (!tileset) return;
    multiViewport.remove3DTiles(1, tileset);
    tileset = null;
  });

  destoryBtn.on("click", () => {
    multiViewport = multiViewport.destroy();
    createBtn.hidden = false;
    destoryBtn.hidden = true;
    modeList.hidden = true;
    addLayerBtn.hidden = true;
    deleteLayerBtn.hidden = true;
  });

  createBtn.on("click", () => {
    createBtn.hidden = true;
    destoryBtn.hidden = false;
    modeList.hidden = false;
    addLayerBtn.hidden = false;
    deleteLayerBtn.hidden = false;
    multiViewport = new MultiViewport(viewer, modeList.value, []);
  });

  pane.on("change", (ev) => {
    console.log("changed: " + JSON.stringify(ev.value), ev);
    if (!multiViewport) return;
    multiViewport.changeMode(ev.value);
  });
}

function createContainer() {
  const container = document.createElement("div");
  container.style.width = "100%";
  container.style.height = "100%";

  const uiContainer = document.createElement("div");
  uiContainer.style.position = "fixed";
  uiContainer.style.top = "5px";
  uiContainer.style.left = "5px";
  document.body.appendChild(container);
  document.body.appendChild(uiContainer);

  return {
    mapContainer: container,
    uiContainer
  };
}