我目前正在开发一个在线浏览器3D游戏. 整个碰撞检测应该在服务器端和客户端都进行计算,以避免黑客攻击.

作为物理引擎,我决定使用剑杆,因为它似乎是最新的一个. 现在我需要加载我从BLENDER导出为.gltf文件的游戏场景. 要在客户端显示它,我只需使用Three js gltf装载器. 然而,在服务器端,我没有使用Three.除此之外,我必须为场景内的所有对象生成边界框,以便在加载gltf文件后在Rapier中使用它.

如何在没有Three的情况下加载gltf文件?如何生成边界框?我是否应该在gltf场景中包含边界框?Rapier似乎并不支持它的开箱即用.我与剑手无关,但我更喜欢它.

推荐答案

在没有任何预先存在的库或加载器的帮助下从gltf加载边界框将是一个编程挑战,但这是可以做到的.当然,您将使用浏览器的JSON解析器,并且某种向量/矩阵数学助手库将非常有用.

以下是大体轮廓:

  1. 将gltf的JSON部分解析为一个我们称之为glTF的对象.
  2. 读取glTF.scene以获取默认场景索引,通常为0.
  3. glTF.scenes[sceneIndex].nodes获取根 node 列表,它是从glTF.nodes[]glTF.nodes[]的索引array.
  4. glTF.nodes[n]的每个 node 上,考虑matrixtranslationrotationscale中的变换.这些将转换 node 的边界框及其子边界框.
  5. 向下递归 node 的children(如果存在),它将是具有自己的转换的子 node 的索引array.
  6. 对于在步骤4和5中找到的所有 node ,查找node.mesh,这将是glTF.meshes数组的索引.
  7. 对于步骤6中的每个网格,查找对象mesh.primitives的array.与gltf中的其他数组不同,基本体直接嵌入到网格中,而不是单独索引.
  8. 对于步骤7中的每个基元,查找primitive.attributes.POSITION,它将是glTF.accessors[]数组的索引.
  9. 规范要求gltf中的位置访问器具有两个数组accessor.min[]accessor.max[],这两个数组都有X、Y和Z的3个元素.这是该网格中原始的、未转换的数据的边界框.

所以现在你已经向下递归了整个 struct ,并在叶 node 上找到了一些边界框.这些长方体包含原始网格数据,并且必须通过其父 node 、祖父 node 和所有祖先 node 的变换进行变换,才能了解这些长方体在模型空间中的位置.

当然,如果每个网格代表一个单独的物理对象,那么您可能不想要所有的祖先变换.您可以将原始网格数据的长方体按原样接受,并将其直接父 node 的变换作为物理的开始位置.你必须想出你想要在这里发生什么的细节.

请注意,像动画、蒙皮和变形这样的东西会增加边界框计算的额外复杂性,但这超出了这里的回答范围.祝好运!

Javascript相关问答推荐

为什么我达到了时间限制!?LeetCode链接列表循环(已解决,但需要解释!)

我试图实现用户验证的reduxstore 和操作中出了什么问题?

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

Next.js(react)使用moment或不使用日期和时间格式

如何根据当前打开的BottomTab Screeb动态加载React组件?

使用GraphQL查询Uniswap的ETH价格

try 使用javascript隐藏下拉 Select

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

在使用REACT更改了CSS类之后,无法更改CSS样式

如何在 Select 文本时停止Click事件?

从逗号和破折号分隔的给定字符串中查找所有有效的星期几

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

图表4-堆叠线和条形图之间的填充区域

如何根据输入数量正确显示alert ?

我正在试着做一个TicTacToe Ai来和我玩.但是,我试着在第一个方块被点击时出现一个X,然后在第二个方块之后出现一个O

在JavaScript中,有没有一种方法可以迭代字符串的词法标记?

在没有任何悬停或其他触发的情况下连续交换图像

如何使用useparams从react路由中提取id

在执行console.log(new X())时记录一个字符串

Js问题:有没有办法将数据从标记表转换成图表?