为了清晰而重写
我有一个对象的真实世界扫描和场景中对象的三维模型,基本上两个模型代表相同的东西,但无论如何都不一样。把它想象成一个模特和一个简笔画。
我想叠加或“#34;最适合"对象彼此。我有多个易于用于对齐的点/子对象。
答案 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);
}
}