【问题标题】:Unity transform.position always (0, 0, 0) for objects form obj importUnity transform.position always (0, 0, 0) for objects form obj import
【发布时间】:2017-11-23 09:42:12
【问题描述】:

我最近一直在处理一个导入的 obj 文件。

当导入编辑器时,所有对象看起来都在正确的位置,但位置为 (0, 0, 0)。

每当我遍历对象并将transform.position 写入文件时,每个对象都会设置为 (0, 0, 0)。

只是为了检查我使用了返回相同结果的父对象 transformPosition。

任何想法将不胜感激。

谢谢。

编辑:刚刚被问到。问题是他们不应该为所有事情都返回 0,他们遍布世界各地。

rangeObjs = GameObject.Find("firing_range").GetComponentsInChildren<MeshFilter>();
for(int i = 0; i < rangeObjs.Length; i++){
    Debug.Log(rangeObjs[i].transform.position.ToString());
}

【问题讨论】:

  • 好的,太好了。你有什么问题?
  • @Draco18s 它们不应该都在 0、0、0。它们都在不同的位置。
  • @CBusBus 你能显示你的代码吗?或许还有一些关于它在场景中如何发生的截图
  • @endrikexe 我添加了导致问题的代码。它适用于其他模型而没有问题。

标签: unity3d


【解决方案1】:

好的,看来您的模型枢轴已转换为根转换的中心。

这要么是您的模型有错误的枢轴,要么是统一内的错误,将每个枢轴转换为根 (0,0,0)

请在其他 3D 建模软件(如搅拌机)中打开您的 obj,查看枢轴是否处于零位。

请在 3D 建模软件中修复枢轴。

如果没有,那么您可以尝试将其导出为不同的格式,例如 FBX(推荐)并尝试将其导入回统一格式。

但是,如果你想要棘手的方法。 您可以使您的 MeshFilter 游戏对象成为具有正确枢轴位置的某个父级的子对象,您可以创建一个 Empty GameObject 来为此创建新的枢轴。

编辑

同时在统一编辑器中检查,选择包含 MeshFilter 的子对象,然后在检查器中查看对象的位置。

不同的绑定位置并不意味着枢轴在其中,网格可能在其他地方,但不能保证枢轴在网格的相同位置

【讨论】:

  • 感谢您的回复。编辑器显示相同的零值,因此我认为您对枢轴点的看法一定是正确的。有没有办法在不生成新模型的情况下解决这个问题?
  • "但是,如果你想要棘手的方法。你可以让你的 MeshFilter GameObject 成为某个具有正确枢轴位置的父级的子级,你可以创建一个 Empty GameObject 来制作新的为此旋转。” STEP 右键单击​​您的游戏对象根,然后选择创建 Empty,然后将其定位到与您的 MeshFilter 对应的正确位置,然后将您的 Mesh Filter 游戏对象设置为您的新建空游戏对象,将其拖放到空游戏对象中。
  • 你的循环代码应该是这样的 ' rangeObjs = GameObject.Find("firing_range").transform; foreach(在 rangeObjs 中转换 t) { Debug.Log(t.position); }
  • 对不起,我的意思是有办法让我从现有的枢轴点计算出他们的位置吗?不确定循环,我需要知道它们附加到什么对象,所以我使用了网格过滤器,本来只是使用游戏对象,但它更方便进一步。懒惰猜测。
  • 您可以使用 Renderer.bounds 来获取网格中心点,但这不是枢轴,如果您想获取网格中心,这只是另一种方式。上面的代码是您的代码的修改版本,因为我们不再使用 MeshFilter 枢轴,因为我们使用没有 MeshFilter 的空游戏对象。这是一个参考如何获得网格中心docs.unity3d.com/ScriptReference/Renderer-bounds.html
【解决方案2】:

您是否尝试过检查对象的 localPosition? (相对于对象的位置)?

即而不是;

foreach(Transform t in group){
  print(t.position)
}

使用;

foreach(Transform t in group){
  print(t.localPosition)
}

【讨论】:

  • 我尝试了父级的 localPosition 和 TransformPoint。两者都没有返回不同的结果。
  • hmmm... 现在我可以看到您的代码,您不应该检查 GameObject.Find("firing_range") 的子项的 transforms 的位置吗? .您似乎在检查每个的 MeshFilter 组件的位置,而不是实际的孩子自己变换。
  • 我也检查了游戏对象,这只是我检查的最后一件事。抱歉,应该补充一下,我一直在检查位置、localPosition 和 TransformPoint(position)。
猜你喜欢
  • 1970-01-01
  • 2021-05-17
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
相关资源
最近更新 更多