Unreal Engine 4.27中如何将2D视口点转换为3D世界空间坐标
UE4.27 鼠标3D世界坐标转换问题(横版卷轴游戏迁移)
我是Unreal Engine 4.27新手,正在把用jMonkey开发的横版卷轴3D游戏(类似《小小大星球》《古惑狼》的横版关卡)迁移到UE中。现在需要实现在鼠标光标位置放置/销毁方块,但一直没法正确获取鼠标对应的3D世界空间坐标。
坐标系与相机参数说明
- 3D世界空间:X轴为水平轴,Z轴为垂直轴,Y轴为深度轴
- 相机采用90度视场角(FOV)的透视相机
之前的尝试与问题
最初方案:把视口以屏幕中心为(0,0)划分为四个象限(比如1021x685的视口,右上角是(510.5,342.5),左下角是(-510.5,-342.5)),然后将鼠标坐标直接和相机3D坐标相加,转换公式为:
(CameraX + MouseX, PlayerY, CameraZ + MouseY)。- 问题:离相机中心越远,方块越拥挤,而且根本到不了屏幕边缘。
硬编码乘数尝试:发现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:用蓝图节点直接获取(推荐)
- 生成鼠标射线:用
Get Mouse Position on Viewport拿到鼠标视口坐标,接着用Deproject Screen to World节点,输入相机引用和鼠标坐标,输出射线起点(相机位置)和射线方向向量。 - 固定深度求交点:因为横版游戏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,1],屏幕中心为(0,0))NormX = (MouseX / ViewportWidth) * 2 - 1 NormY = (MouseY / ViewportHeight) * 2 - 1 - 计算深度距离:
Depth = PlayerY - CameraY(根据坐标系方向调整正负) - 计算最终3D坐标:
(你之前硬编码的乘数就是WorldX = CameraX + NormX * Depth * (ViewportWidth / ViewportHeight) WorldZ = CameraZ + NormY * DepthDepth * 宽高比的比值,换窗口尺寸时自动计算即可)
注意事项
- 确保相机朝向固定(横版游戏一般正对Y轴方向)
- 用平面相交比射线碰撞更稳定,避免误判场景物体
内容的提问来源于stack exchange,提问作者MKthot
相关产品推荐
相关产品推荐

