ThreeJS翻转反转X轴(左手坐标系)
ThreeJS flip reversed X axis (left handed coordinate system)
我正在尝试创建这个由较小的 3D 对象合并的 3D 瓷砖系统世界 - 为了创建这些,我们使用了另一个在 Unity 中制作的应用程序,它单独加载所有小型 3D 资产,并可用于创建您的新模型。保存这些模型文件后,将创建一个 JSON 文件,其中包含所有使用的 3D 模型的所有比例、位置、旋转等。
我们决定使用 'North, East, South, West' 的这个系统来确保在生产中一切看起来都很好。但是,现在当我们尝试在 ThreeJS 中渲染这些相同的 JSON 文件时,我们注意到 X 轴与我们正在使用的 Unity 应用程序相比是相反的。
我们想要的是:
- 北方在增加Z值(北方和南方都可以)
- 向东增加X值
- 西边正在减少 X 值
目前这就是 ThreeJS 中的错误:
- 东减少 X值
- 西增加 X值
我们已经尝试过的是:
- 镜像/翻转相机视图
- 当坐标低于 0 时,我们将其设为绝对坐标(-10 将为 10)
- 当坐标大于 0 时,我们将其设为负值(10 将为 -10)
但是以上都没有达到预期的效果。当涉及到小于或大于 1x1x1 大小的缩放、旋转对象时,使用代码反转坐标会带来其他问题。理想情况下,我们不必更改我们的坐标,并且仍然可以通过将 X 轴的方向从 0,0,0
的左侧更改为右侧来用作实体参考
目前ThreeJS使用的是'right handed coordinate system',我们想要的是左手坐标系。这是可以在 ThreeJS 中配置的东西吗?
有人知道除了翻转所有 X 坐标之外我还能尝试什么吗?
这不是您可以在 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 的其他部分难以处理。
我会考虑将 (-1, 1, 1) 比例应用于“Unity 导出场景”的根,这样您仍然可以保持场景的其他部分不变。
obj3d.scale.set(-1, 1, 1);
我正在尝试创建这个由较小的 3D 对象合并的 3D 瓷砖系统世界 - 为了创建这些,我们使用了另一个在 Unity 中制作的应用程序,它单独加载所有小型 3D 资产,并可用于创建您的新模型。保存这些模型文件后,将创建一个 JSON 文件,其中包含所有使用的 3D 模型的所有比例、位置、旋转等。
我们决定使用 'North, East, South, West' 的这个系统来确保在生产中一切看起来都很好。但是,现在当我们尝试在 ThreeJS 中渲染这些相同的 JSON 文件时,我们注意到 X 轴与我们正在使用的 Unity 应用程序相比是相反的。
我们想要的是:
- 北方在增加Z值(北方和南方都可以)
- 向东增加X值
- 西边正在减少 X 值
目前这就是 ThreeJS 中的错误:
- 东减少 X值
- 西增加 X值
我们已经尝试过的是:
- 镜像/翻转相机视图
- 当坐标低于 0 时,我们将其设为绝对坐标(-10 将为 10)
- 当坐标大于 0 时,我们将其设为负值(10 将为 -10)
但是以上都没有达到预期的效果。当涉及到小于或大于 1x1x1 大小的缩放、旋转对象时,使用代码反转坐标会带来其他问题。理想情况下,我们不必更改我们的坐标,并且仍然可以通过将 X 轴的方向从 0,0,0
的左侧更改为右侧来用作实体参考目前ThreeJS使用的是'right handed coordinate system',我们想要的是左手坐标系。这是可以在 ThreeJS 中配置的东西吗?
有人知道除了翻转所有 X 坐标之外我还能尝试什么吗?
这不是您可以在 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 的其他部分难以处理。
我会考虑将 (-1, 1, 1) 比例应用于“Unity 导出场景”的根,这样您仍然可以保持场景的其他部分不变。
obj3d.scale.set(-1, 1, 1);