Unity3D:如何确定游戏对象的角以便根据它定位其他游戏对象?

Posted

技术标签:

【中文标题】Unity3D:如何确定游戏对象的角以便根据它定位其他游戏对象?【英文标题】:Unity3D: How to determine the corners of a gameobject in order to position other gameobjects according to it? 【发布时间】:2014-03-24 09:41:30 【问题描述】:

我的问题是是否有办法知道游戏对象角的坐标。我拥有的是三个 Vuforia AR 目标和一个游戏对象,在这种情况下是一个立方体。

我需要实现的是,当我移动目标时,立方体的角会跟随目标,例如。立方体与目标之间的空间一样宽。

现在它是怎么做的,它检查目标之间的距离并根据它设置立方体的比例。这导致立方体总是从其设定位置展开,这使得目标的定位在现实生活中很尴尬。

这里有几张图片展示了它现在的功能,在执行期间拍摄:

这是附在立方体对象上的代码:

using UnityEngine;
using System.Collections;

public class show : MonoBehaviour 

float distancex;
float distancez;

// Use this for initialization
void Start () 
    renderer.enabled = false;


// Update is called once per frame
void Update () 
    if (GameObject.Find ("target1").renderer.enabled && GameObject.Find ("target2").renderer.enabled && 
        GameObject.Find ("target3").renderer.enabled && GameObject.Find ("target4").renderer.enabled) 
    
        renderer.enabled = true;

    

    distancex = Vector3.Distance ((GameObject.Find ("target1").transform.position), (GameObject.Find ("target2").transform.position));
    distancez = Vector3.Distance ((GameObject.Find ("target2").transform.position), (GameObject.Find ("target3").transform.position));


    Debug.Log (distancex);
    Debug.Log (distancez);

    transform.localScale = new Vector3((distancex), transform.localScale.y, transform.localScale.z);
    transform.localScale = new Vector3(transform.localScale.x, transform.localScale.y, (distancez));

    Debug.Log (transform.localScale);


如何使对象的角跟随目标?我需要边的宽度是目标之间距离的宽度,有什么方法可以在不使用比例的情况下实现这一点?

【问题讨论】:

【参考方案1】:

我知道你问这个问题已经有一段时间了,但我在想自己解决类似问题时遇到了这个问题。

我发现我需要(其他人可能会得到帮助)是使用Renderer.bounds

在实践中对我来说是什么样的:

void Update () 
  rend = currentGameObject.GetComponent<Renderer>();
  Debug.Log(rend.bounds.max);
  Debug.Log(rend.bounds.min);

在这种情况下,我的对象是位置 0,0,200 和比例为 200,200,1 的四边形。 rend.bounds.max 的输出是(100.0,100.0,200.0),最小值是(-100.0,-100.0,200.0)。这将为您提供每个角的角位置(假设我的示例是在 2D 空间中,但这也适用于 3d)。

如果你想要右上角的例子,为了让它更具体一点,你可以得到renderer.bounds.max的XY,左上角你会得到renderer.bounds.max.yrenderer.bounds.min.x。希望对您有所帮助!

干杯!

【讨论】:

【参考方案2】:
    创建 8 个空游戏对象。 将它们设为要跟踪的“立方体”对象的子对象。 在编辑器中将它们移动到您跟踪的游戏对象的 8 个角上。由于它们是被跟踪对象的子对象,因此它们的位置将为+/- 0.5, +/- 0.5, +/- 0.5。 以令人难忘的方式命名它们(即“左上角”)。 这 8 个对象将随着被跟踪对象移动和缩放,并停留在其角落。任何时候您想知道角落在哪里,只需按名称引用 8 个游戏对象中的一个或多个,然后为每个 transform.position 获取 Vector3

注意:如果您重复执行第 5 步,您可能希望避免每次调用(或类似的)代价高昂的 GameObject.Find()。执行一次并将 8 个游戏对象保存在一个变量中。

【讨论】:

【参考方案3】:

我通过确定目标之间的位置并计算它们的平均值来解决这个问题。 然而,这并非完美无缺,因为在将外部模型与系统一起使用时,很难确定模型准确跟随目标角落的比例因子。

【讨论】:

以上是关于Unity3D:如何确定游戏对象的角以便根据它定位其他游戏对象?的主要内容,如果未能解决你的问题,请参考以下文章

用于在 Unity3D 中定位 3D 对象的 OpenCV 旋转(Rodrigues)和平移向量

如何在 Unity3d 检查器中显示锯齿状数组?

在图像中查找拼字游戏板的角点

Unity3D:将所有游戏对象转换为相同大小,而不管其比例如何

如何访问另一个场景中存在的游戏对象[重复]

如何复制父对象的旋转保持自旋转,因为它在unity3d中