Babylon.js:如何与3D场景中的物体交互?

图片开发棋类游戏,需要实现鼠标控制棋子的功能,使得游戏能够将鼠标在屏幕上的位置准确地映射到棋盘上的对应落子点。 如果开发的是2D游戏的话,实现就比较简单,鼠标屏幕坐标和棋盘都是二维平面。 就像下图围棋所示,可以根据xy坐标表示鼠标的位置,同时围棋落子点的坐标也可以计算得出xy坐标,这样很轻松地就能实现鼠标位置和围棋落子点坐标的映射和距离比较。

图片图片

开发棋类游戏,需要实现鼠标控制棋子的功能,使得游戏能够将鼠标在屏幕上的位置准确地映射到棋盘上的对应落子点。

如果开发的是2D游戏的话,实现就比较简单,鼠标屏幕坐标和棋盘都是二维平面。就像下图围棋所示,可以根据xy坐标表示鼠标的位置,同时围棋落子点的坐标也可以计算得出xy坐标,这样很轻松地就能实现鼠标位置和围棋落子点坐标的映射和距离比较。

图片图片

如果开发的是3D游戏,这个问题就不那么好处理了,增加一个维度意味着复杂度的增加。玩家可以通过变换摄像机从不同角度观察场景中的物体,这样也会导致物体在观察空间下的坐标发生变化,那么在3D场景中怎么样才能从二维屏幕中的鼠标位置得出鼠标点中哪个物体以及点中物体的具体坐标呢?对于围棋游戏来说就是怎么判断鼠标点中位置最接近围棋盘中具体哪个落子位置呢?

先来梳理一下思路,围棋棋盘放置到3D空间中的位置是固定的,也就是说围棋棋盘每个交叉点的xyz坐标可以认为是已知的。那么如果能得到鼠标屏幕位置对应3D空间中棋盘的坐标,那么判定鼠标在棋盘落子点的哪个位置就自然不是问题了。

下图是计算机图形学中的视锥体模型,描述的是观察者(摄像机)在视角下可见的空间范围,前后两个平面分别是近平面和远平面,这里可以近似认为近平面就是计算机屏幕,如果从观察者到屏幕鼠标做一条射线,通过计算射线和围棋平面的交点就可以得出鼠标位置点击到的棋盘坐标,这样就可以拿射线交点坐标和围棋棋盘坐标一一比较得出更接近哪个落子点了。

图片图片

关于射线和平面的求交算法这里不做讲解,如果有兴趣请查阅图形学相关的资料进行查阅。像Babylon.js这样的3D框架已经实现了创建射线、求射线和网格交点这些算法,这里介绍如何使用Babylon.js的提供的API来实时跟踪鼠标位置,并获取观察者到鼠标射线与场景中物体的交点坐标。

图片图片

主要用到的API是scene.pick方法,scene是空间场景Scene类的实例。关于pick方法及参数说明如下:

pick(x, y, predicate?, fastCheck?, camera?, trianglePredicate?) 方法用于从屏幕上的指定位置(x, y)拾取对象。以下是该方法参数的详细解释:

x, y:这两个参数指定了屏幕上的坐标,用于确定拾取操作的起点。这些坐标通常是鼠标事件中获取的,表示用户点击或触摸屏幕的位置。

predicate?(可选):这是一个过滤函数,允许你自定义拾取逻辑。它接受一个AbstractMesh对象作为参数,并返回一个布尔值。如果返回true,则该网格会被考虑在内进行拾取;如果返回false,则该网格会被忽略。这个参数可以用来排除某些对象,或者只拾取特定类型的网格。例如,你可以设置一个predicate来忽略不可见的网格或者只拾取特定标签的网格。

fastCheck?(可选):这是一个布尔值参数,用于优化拾取性能。如果设置为true,Babylon.js将跳过一些检查,从而加快拾取速度,但可能会降低拾取的准确性。默认值为false,意味着执行完整的拾取检查。

camera?(可选):这个参数允许你指定一个特定的相机来进行拾取操作。如果不提供,将使用场景中的默认相机。这在多相机场景中特别有用,你可以指定哪个相机的视角用于拾取。

trianglePredicate?(可选):这是一个更细粒度的过滤函数,用于在三角形级别上控制拾取逻辑。它接受四个参数:三个表示三角形顶点的向量和一个射线对象。返回一个布尔值,决定是否拾取该三角形。这个参数可以用来实现更复杂的拾取逻辑,比如只拾取面向摄像机的三角形。

pick方法返回一个PickingInfo对象,其中包含了拾取操作的结果,例如拾取的网格、距离、撞击点等信息。如果没有拾取到任何对象,则返回null。

下面的示例代码展示了监测鼠标的实时移动,通过pick方法获取射线与网络的相交信息,还可以判断相交的网络名称,如果相交的网格是围棋棋盘则简单打印了交点的坐标信息。可见通过Babylon.js提供的API可以非常轻松地实现鼠标和3D场景的交互操作,激发自己的创意并借助框架提供的能力可以轻松地开发出有趣的3D应用。

复制
// 监测鼠标的实时移动
scene.onPointerMove = function castRay() {
  // (scene.pointerX, scene.pointerY)为鼠标实时屏幕坐标
  var hit = scene.pick(scene.pointerX, scene.pointerY)
    // hit.pickedMesh表示射线与场景的物体有相交
    // hit.pickedMesh.name表示相交物体的name属性值
  if (hit && hit.pickedMesh && hit.pickedMesh.name == "goboard"){
      //hit.pickedPoint表示射线与场景中物体相交点的坐标
    console.log(hit.pickedPoint.x, hit.pickedPoint.y, hit.pickedPoint.z)                   
  }
}

参考文献

[1]. https://doc.babylonjs.com/typedoc/classes/BABYLON.Scene#pick[2]. https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/picking_collisions/

相关资讯

3D城市自动生成方案升级,腾讯GiiNEX游戏AI引擎正式亮相

3月20日,在2024全球游戏开发者大会(GDC)上,腾讯发布了自研游戏AI引擎——GiiNEX。基于生成式AI和决策AI技术,GiiNEX将为游戏全生命周期提供丰富的AI解决方案。借助大模型等生成式AI技术,GiiNEX面向AI NPC、场景制作、内容生成等场景,提供了包括2D图像、动画、3D城市、剧情、对话、关卡以及音乐等多样化的AIGC能力,帮助开发者提升高质量内容生成的效率。同时,GiiNEX也将决策AI技术用于游戏研发测试、模拟玩法等场景,加速游戏创新迭代,以快速适应玩家个性化需求和多变的市场趋势。在会上

为吸引开发者创建游戏地图,“元宇宙平台”Roblox 将推出 3D 模型生成 AI 工具

《Roblox(罗布乐思)》是一个深受孩子们欢迎的社区游戏平台,也是一款“知名元宇宙游戏”, 玩家可以自行为这款游戏(平台)上传一系列场景脚本,从而能够在游戏(平台)中,使用同一角色游玩到各种各样的游戏内容。该平台在上周的开发者大会中宣布将提高游戏创作者的分成比例,并在游戏中集成(实体商品销售)电商平台。此外,Roblox 还将推出基于 AI 的 3D 模型生成工具以吸引开发者创建游戏地图。▲ Roblox 在开发者大会上演示的 AI 生成地区建模效果(下同)Roblox 指出,全球约有 34 亿人玩游戏,游戏产业

索尼 PlayStation 将使用更多 AI 技术,实现游戏开发降本增效

据 Insider Gaming 28 日报道,在索尼公司本月发布的《2024 年企业报告》中,索尼提出了未来的愿景 —— 要成为一家适应社会变革和技术发展的娱乐公司,AI 和机器学习将在 PlayStation 发挥核心作用,尤其是在游戏领域。报告举例说,在《漫威蜘蛛侠 2》的制作过程中,工作人员就使用了语音识别软件来自动同步字幕和人物对话,大大缩短了开发过程。据了解,索尼的目标是在不影响质量的前提下加快流程、降低成本,为此还计划将实时 3D 处理和传感器技术等技术整合到游戏开发中。“今后,我们计划在集团内跨职能