基于已知坐标定位和定向GameObject

时间:2016-11-18 17:08:32

标签: unity3d

为了清晰而重写

我有一个对象的真实世界扫描和场景中对象的三维模型,基本上两个模型代表相同的东西,但无论如何都不一样。把它想象成一个模特和一个简笔画。

我想叠加或“#34;最适合"对象彼此。我有多个易于用于对齐的点/子对象。

1 个答案:

答案 0 :(得分:0)

在调整局部位置的差异后,您基本上希望将对象的原点移动到目标对象。然后,您可以从已知点(例如A到B和A到C)获取向量。然后根据差异旋转对象。

这是我的测试代码。似乎工作

using UnityEngine;
using System.Collections;

public class Trangle
{
    public GameObject Master { get; set; }
    public GameObject p1 { get; set; }
    public GameObject p2 { get; set; }
    public GameObject p3 { get; set; }
    public GameObject p4 { get; set; }

    public Trangle(GameObject go)
    {
        Master = go;
        p1 = go.transform.Find("1").gameObject;
        p2 = go.transform.Find("2").gameObject;
        p3 = go.transform.Find("3").gameObject;
        p4 = go.transform.Find("4").gameObject;
    }

    public Vector3 GetRotation(GameObject point)
    {
        return p1.transform.position + point.transform.position;
    }

}

public class PositionTest : MonoBehaviour {

    public GameObject Target;
    private Trangle _target;
    private Trangle _this;
    // Use this for initialization
    void Start () {
        _target = new Trangle(Target);
        _this = new Trangle(gameObject);
    }

    // Update is called once per frame
    void Update () {
        if (transform.position != TargetPosition())
        {
            SetPosition();
            return;
        }

        if (Vector3.Dot(_this.GetRotation(_this.p2), _target.GetRotation(_target.p2)) != 1)
        {
            var v1 = _this.GetRotation(_this.p2);
            var v2 = _target.GetRotation(_target.p2);
            var diff = Quaternion.FromToRotation(v1, v2);

            transform.rotation = Quaternion.Slerp(transform.rotation, diff, Time.deltaTime * 3f);
            return;

        }

        if (Vector3.Dot(_this.GetRotation(_this.p3), _target.GetRotation(_target.p3)) != 1)
        {
            var diff = Quaternion.FromToRotation(_this.GetRotation(_this.p3), _target.GetRotation(_target.p3));

            transform.rotation = Quaternion.Slerp(transform.rotation, diff, Time.deltaTime * 3f);
            return;
        }
    }

    void SetPosition()
    {
        float step = 4f * Time.deltaTime;

        transform.position = Vector3.MoveTowards(transform.position, TargetPosition(), step);
    }

    Vector3 TargetPosition()
    {
        return _target.Master.transform.position + new Vector3(_target.p1.transform.localPosition.x - _this.p1.transform.localPosition.x,
                                                            _target.p1.transform.localPosition.y - _this.p1.transform.localPosition.y,
                                                            _target.p1.transform.localPosition.z - _this.p1.transform.localPosition.z);
    }
}