2016-11-18 11 views
1

Rewording位置および配向のゲームオブジェクト明確にするため

私は同じことを表して、基本的に2つのモデル、オブジェクトやシーン内のオブジェクトの3Dモデルの現実世界のスキャンを持っていますが、いかなる手段によっても同じではない。それをモデルや棒のように考えてください。

オブジェクトをオーバーレイしたり、オブジェクトに最適なものにしたいと考えています。私は、整列のために使いやすい複数のポイント/子オブジェクトを持っています。

+1

これは興味深い問題ですが、私は現在、Stack Overflowで適切に答えられるかどうかは疑問です。オブジェクトはすべての点に触れるように指向できることが保証されているか、これが「最適」なシナリオですか?ポイントはどのように生成されますか?それらは恣意的であるか、オブジェクトからの情報を使用していますか?オブジェクトを拡大縮小するか回転させるだけでよいですか?これらはすべてアルゴリズムの複雑さに影響を与え、実際にはどの程度洗練されていなければなりません。 – Serlite

+0

それで、回転して再配置したいですか? 2つのGOの場合は、簡単です。位置と回転を設定するだけです。これがこれです。何かが誤解されている場合は、スクリーンショットを作成するか、それを描画してください。[編集:問題のアイテムが複雑な場合、@Serliteは正しいです。] –

+0

視覚援助が間違いなくあいまいさはここ。あなたの意図を表す図面や一連のスクリーンショットを作成してください。 – Serlite

答えて

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); 
    } 
} 
関連する問題