【问题标题】:ThreeJS flip reversed X axis (left handed coordinate system)ThreeJS翻转反转X轴(左手坐标系)
【发布时间】:2020-05-24 17:14:04
【问题描述】:

我正在尝试创建这个由较小的 3D 对象合并的 3D 平铺系统世界 - 为了创建这些,我们使用 Unity 制作的另一个应用程序,它单独加载所有小型 3D 资产,并可用于创建您的新模型。保存这些模型文件后,将创建一个 JSON 文件,其中包含所有使用的 3D 模型的所有比例、位置、旋转等。

我们决定使用这种“北、东、南、西”系统来确保制作中的一切看起来都不错。然而,现在当我们尝试在 ThreeJS 中渲染这些相同的 JSON 文件时,我们注意到与我们使用的 Unity 应用程序相比,X 轴是相反的。

我们想要的是这样的:

  • 北方正在增加Z值(北方和南方都可以)
  • 东方增加 X 值
  • West 正在减小 X 值

目前这就是 ThreeJS 中的错误

  • 东是减少 X 值
  • West 正在增加 X 值

我们已经尝试过的是:

  • 镜像/翻转相机视图
  • 当坐标低于 0 时,我们将其设为绝对坐标(-10 将变为 10)
  • 当坐标大于 0 时,我们将其设为负值(10 为 -10)

但以上都没有达到预期的效果。当涉及到小于或大于 1x1x1 大小的缩放、旋转对象时,使用代码反转坐标会带来其他问题。理想情况下,我们不必更改坐标,并且仍然可以通过将 X 轴的方向从 0,0,0 的左侧更改为右侧来用作实体参考

目前 ThreeJS 使用“右手坐标系”,而我们想要的是左手坐标系。这是可以在 ThreeJS 中配置的东西吗?

谁知道除了翻转所有 X 坐标之外我可以尝试什么?

【问题讨论】:

    标签: three.js 3d reverse axis mirror


    【解决方案1】:

    这不是你可以在 three.js 或 Unity 中配置的。不同的文件格式通常具有内置的概念坐标系。例如,GLTF 以right-handed coordinate system 表示。处理转换是格式导入器和导出器的责任——这是内置的 three.js 导入器所做的。

    我建议使用现有的格式,例如 GLTF 来表示您的场景(现有的 Unity exporter 可用,并且导入器可用于 three.js)。

    或者,如果您想保留对自己文件格式的控制权,您可以在从 Unity 导出或 导入到 three.js 时自行进行从左到右的坐标系转换。查看您的图像,您似乎需要将所有 X 值乘以 -1.0 以使它们看起来相同。您还需要将旋转保存为四元数,以避免旋转顺序差异。

    当然,您总是可以在 X 上通过 -1.0 缩放整个场景,但这可能会使与three.js 的其他部分一起工作变得困难。

    【讨论】:

    • 我已经害怕这样的答案,因为我在网上找不到任何关于它的信息。不幸的是,我不是制作 .model 文件的 Unity 应用程序的开发人员,但感谢您的解释!
    • 老实说,它并没有那么糟糕,而且必须转换坐标框架是很常见的——左/右手转换恰好是最复杂的一个:) 只要确保你有一个加载器为您的自定义格式并将否定放在那里,当您加载它时一切都会看起来正确。
    【解决方案2】:

    我会考虑将 (-1, 1, 1) 比例应用于“Unity 导出场景”的根,这样您仍然可以保持场景的其他部分不变。

    obj3d.scale.set(-1, 1, 1);
    

    【讨论】:

      猜你喜欢
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 2012-05-27
      • 2023-04-08
      相关资源
      最近更新 更多