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.y
和renderer.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)和平移向量