You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unreal Engine 4.27中如何将2D视口点转换为3D世界空间坐标

UE4.27 鼠标3D世界坐标转换问题(横版卷轴游戏迁移)

我是Unreal Engine 4.27新手,正在把用jMonkey开发的横版卷轴3D游戏(类似《小小大星球》《古惑狼》的横版关卡)迁移到UE中。现在需要实现在鼠标光标位置放置/销毁方块,但一直没法正确获取鼠标对应的3D世界空间坐标。

坐标系与相机参数说明

  • 3D世界空间:X轴为水平轴,Z轴为垂直轴,Y轴为深度轴
  • 相机采用90度视场角(FOV)的透视相机

之前的尝试与问题

  1. 最初方案:把视口以屏幕中心为(0,0)划分为四个象限(比如1021x685的视口,右上角是(510.5,342.5),左下角是(-510.5,-342.5)),然后将鼠标坐标直接和相机3D坐标相加,转换公式为:(CameraX + MouseX, PlayerY, CameraZ + MouseY)。

    • 问题:离相机中心越远,方块越拥挤,而且根本到不了屏幕边缘。
  2. 硬编码乘数尝试:发现1021x685窗口需要把鼠标坐标乘以1.33再和相机坐标相加才能勉强准确,换成547x647窗口则要乘以2.5,但完全不知道这个乘数的来源,换窗口尺寸就没法确定对应数值。网上类似解决方案要么无效,要么不解释变量来源,现在卡壳了。

已知参数

  • 2D视口中的鼠标X、Y坐标
  • 相机在2D视口中的位置为(0, 0)
  • 相机3D世界空间坐标:(110, 960, 265.275)
  • 相机视场角:90度
  • 玩家3D世界空间位置
  • 当前视口尺寸:1021x685
  • 1021x685视口对应的缩放比例:0.633625

(注:原蓝图逻辑已转译:通过节点获取鼠标在视口的位置,将其转换为以屏幕中心为原点的坐标)


解决方法

不用手动硬算坐标,UE自带的工具和公式可以精准解决:

方法1:用蓝图节点直接获取(推荐)

  1. 生成鼠标射线:用Get Mouse Position on Viewport拿到鼠标视口坐标,接着用Deproject Screen to World节点,输入相机引用和鼠标坐标,输出射线起点(相机位置)和射线方向向量。
  2. 固定深度求交点:因为横版游戏Y轴是深度轴,直接固定Y值为玩家的Y坐标。用以下节点计算交点:
    • 用Make Plane节点,输入平面位置(0, PlayerY, 0)和法向量(0,1,0)(对应Y轴深度平面)
    • 用Intersect Line and Plane节点,输入射线起点、射线方向、创建好的平面,得到的交点就是要放置方块的3D世界坐标。

方法2:手动公式计算

透视相机的坐标转换核心是结合FOV和视口宽高比,90度FOV可简化计算(tan(45°)=1):

  1. 鼠标坐标归一化:
    NormX = (MouseX / ViewportWidth) * 2 - 1
    NormY = (MouseY / ViewportHeight) * 2 - 1
    
    (转换后坐标范围为[-1,1],屏幕中心为(0,0))
  2. 计算深度距离:Depth = PlayerY - CameraY(根据坐标系方向调整正负)
  3. 计算最终3D坐标:
    WorldX = CameraX + NormX * Depth * (ViewportWidth / ViewportHeight)
    WorldZ = CameraZ + NormY * Depth
    
    (你之前硬编码的乘数就是Depth * 宽高比的比值,换窗口尺寸时自动计算即可)

注意事项

  • 确保相机朝向固定(横版游戏一般正对Y轴方向)
  • 用平面相交比射线碰撞更稳定,避免误判场景物体

内容的提问来源于stack exchange,提问作者MKthot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 13:02:30