Bridge3D坐标转换工具类 处理2D逻辑坐标与3D世界坐标之间的转换

LayaAir的坐标系统:

  • Stage逻辑坐标:stage.width × stage.height(用户设置的逻辑尺寸)
  • Canvas渲染坐标:RenderState2D.width × RenderState2D.height(实际渲染尺寸,可能经过缩放)
  • 3D世界坐标:与Canvas渲染坐标对齐

当stage被缩放时(如适配不同屏幕),逻辑坐标与渲染坐标会不一致,需要转换。

构造函数

方法

  • 获取当前的渲染尺寸信息

    返回 {
        logicHeight: number;
        logicWidth: number;
        renderHeight: number;
        renderWidth: number;
        scaleX: number;
        scaleY: number;
    }

    包含逻辑尺寸、渲染尺寸和缩放比例的对象

    • logicHeight: number
    • logicWidth: number
    • renderHeight: number
    • renderWidth: number
    • scaleX: number
    • scaleY: number
  • 获取当前的坐标缩放比例

    返回 {
        scaleX: number;
        scaleY: number;
    }

    X和Y方向的缩放比例

    • scaleX: number
    • scaleY: number
    • scaleX = RenderState2D.width / stage.width
    • scaleY = RenderState2D.height / stage.height
    • 当stage适配屏幕时,这些值可能不为1
  • 将2D逻辑坐标转换为3D世界坐标

    参数

    • x: number

      2D逻辑X坐标(相对于stage)

    • y: number

      2D逻辑Y坐标(相对于stage)

    • z: number = 0

      3D世界Z坐标(默认0)

    • 可选out: Vector3

      输出向量(可选,不提供则创建新向量)

    返回 Vector3

    3D世界坐标

    // Bridge3D在2D逻辑坐标(400, 300)
    const worldPos = Bridge3DCoordinate.logicTo3D(400, 300, 0);
    // worldPos现在是3D世界坐标,考虑了stage缩放
  • 将2D屏幕坐标转换为3D世界坐标(考虑相机投影)

    参数

    • screenX: number

      屏幕X坐标(像素)

    • screenY: number

      屏幕Y坐标(像素)

    • camera: Camera

      Bridge3D相机

    • depth: number = 0

      深度值(默认0,表示Z=0平面)

    • 可选out: Vector3

      输出向量(可选)

    返回 Vector3

    3D世界坐标

    此方法用于将鼠标点击等屏幕坐标转换为3D世界坐标

  • 将3D世界坐标转换为2D逻辑坐标

    参数

    返回 {
        x: number;
        y: number;
    }

    2D逻辑坐标

    • x: number
    • y: number
    const worldPos = new Vector3(800, 600, 0);
    const logicPos = Bridge3DCoordinate.worldTo2D(worldPos);
    // logicPos.x, logicPos.y 是2D逻辑坐标