如何用js代码获取坐标
2026-04-10 17:27
为什么被折叠? 0 个回复被折叠

回答(1)

青罗 前台管理员
4 天前

参考以下代码:

// 二次开发API参考 https://www.shanhaibi.com/docs/v1/tx9rigt2ff6e0m1h/


export class SampleExtension {
  /*
   * 定义属性
   * 如果只想在类内部使用属性变量,不需要将属性变量展示在自定义设置项中,
   * 可以把它设置成 Private 属性,JavaScript 用"#"代表 Private 属性
   * 定义的属性可以使用中文名称
   */
  场景 = Element.empty();
  #isLinstenEvent = false;
  #clickObservable = null;
  #scene = null;
  #enableClick = false;
  #stopListenEvent = false;
  #currentPosition = "";
  #updateLineAxisFn = null;

  initEventListen() {
    if (this.#isLinstenEvent) return;
    if (!this.场景?.name) return;

    const { getScene, worldToScreen } = this.场景.getMountedInstance() || {};
    const { pickPositionOnSurface, updateLineAxis } = this.场景._getExtension("pick");
    this.#updateLineAxisFn = updateLineAxis;

    if (!getScene) return;
    this.#isLinstenEvent = true;
    this.#scene = getScene();
    this.#clickObservable = this.#scene.onPointerObservable.add(async (pointerInfo) => {
      if(!this.#enableClick || this.#stopListenEvent) return;
      const { type, event } = pointerInfo;
      const positionStr = await pickPositionOnSurface(pointerInfo.event.offsetX, pointerInfo.event.offsetY);
      if(!positionStr) return;
      const position = JSON.parse(positionStr);

      this.#updateLineAxisFn && this.#updateLineAxisFn(true, position);
      if(type !== 32 || event.button !== 0) return;
      if(event.buttons > 0) return;

      this.#currentPosition = `${position.x},${position.y},${position.z}`;

      this.element.emit("点位点击", {
        position: this.#currentPosition,
      });
      this.#stopListenEvent = true;
    })
  }

  removeEventListen() {
    if (!this.#scene) return;
    if (this.#clickObservable) {
      this.#scene.onPointerObservable.remove(this.#clickObservable);
      this.#clickObservable = null;
    }
    this.#isLinstenEvent = false;
  }

  async init() {
    this.element.addEventListener("开启点击交互", (ev)=>{
      this.#enableClick = true;
      this.#stopListenEvent = false;
    });

    this.element.addEventListener("关闭点击交互", (ev)=>{
      this.#enableClick = false;
      this.#updateLineAxisFn && this.#updateLineAxisFn(false);
    });

    this.initEventListen();
  }
  /**
   * 生命周期函数 组件销毁时调用,一般在此处清空监听事件
   *
   */
  destroy() {
    if (this.#isLinstenEvent) {
      this.removeEventListen();
    }
  }
}
咨询热线0571-88650917
地址 公司 邮箱

杭州市文一西路海创科技中心 311121

杭州多算科技有限公司

support@shanhaibi.com

关注山海鯨官方qq群,了解更多内容

QQ群号:788095444

Copyright © 2020-2026 多算科技, All Rights Reserved. 浙ICP备20006837号-5