2017-10-03 4 views
0

私は2つの同一のオブジェクトと2つのカメラを持っています。私は何を達成したいことは以下の通りです:他のオブジェクトに対するオブジェクトの位置と回転のキャプチャ

1)カメラでB(これはIように、キューブBにそのカメラA

2)転送に対するキューブの位置と回転をキャプチャキューブAがカメラに見えるよう、キューブBが正確に見える)に移動することはできません

私は次のコードで位置していることをやって成功しました:

positionDifference = CubeA.InverseTransformPoint(CameraA.transform.position); 

は、キューブBにそれを転送するには、私が実行します。

cubeBpos = transform.InverseTransformPoint(CubeB.transform.localPosition);  

while (Mathf.Abs (cubeBpos.x + positionDifference.x) > 0.01f) { 
    if (cubeBpos.x + positionDifference.x > 0) { 
     CubeB.transform.position += new Vector3(-0.01f, 0, 0); 
    } 
    else if (cubeBpos.x + positionDifference.x < 0) { 
     CubeB.transform.position += new Vector3(+0.01f, 0, 0); 
    } 
    cubeBpos = transform.InverseTransformPoint(CubeB.transform.position); 
} 

これは厄介ですが、機能します。しかし、回転を移そうとすると、キューブBは原点を中心に回転を開始します。面白いことに、キューブAを世界座標で移動すると、キューブBはローカルで移動し、逆も同様です。私は地元から世界への座標変換が問題だと思っていますが、私の回転コードはナイーブだとも思います。私が最初にこのように、二つの方法で回転をキャプチャしてみました:

rotationDifference = Quaternion.Inverse(CubeA.transform.rotation) * CameraA.transform.rotation; 

CubeB.transform.rotation = Quaternion.Inverse(rotationDifference); 

第二の試み:

rotationDifference = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z); 

CubeB.transform.eulerAngles = rotationDifference; 

両方のアプローチは、奇妙な回転オフセットの結果を。私はlocalPositionとlocalEulerAnglesを使ってみましたが、助けにはなりませんでした。

私はこれを行うには、よりスマートな方法があります願っています:)

EDIT: ここでDropboxのlinkのプロジェクトへ

答えて

0

問題は、彼らがそれぞれに影響を与えるが、あなたは別に位置と回転を扱っているということですその他。両方をまとめて、2つのカメラと2つの立方体(均質行列として表現され、列ベクトルを仮定)のモデル変換があるとします。

TCameraA^-1 * TCubeA = TCameraB^-1 * TCubeB 

TCameraモデルはカメラではなく、ビュー行列の変換であること:その後、我々は、そのようなことを、立方体B TCubeBに対する変換見つけたいと思います。ビューマトリックスをお持ちの場合は、単に逆のままにしておきます。私たちはすぐにTCubeBのために解決することができ

TCameraB * TCameraA^-1 * TCubeA = TCubeB 

私はユニティAPIとあまり慣れていないんだけど、あなたが直接変換行列を使用することはできませんように思えます。それでは、回転部分Rおよび翻訳部分Trに変換行列Tを分割してみましょう:

TrCameraB * RCameraB * (TrCameraA * RCameraA)^-1 * TrCubeA * RCubeA = TrCubeB * RCubeB 
TrCameraB * RCameraB * RCameraA^-1 * TrCameraA^-1 * TrCubeA * RCubeA = TrCubeB * RCubeB 

我々は回転についてのみ気にしている場合、我々は単に行うことによって、それぞれの四元数を計算することができます。

QCameraB * QCameraA^-1 * QCubeA = QCubeB 

翻訳はもう少し難しくなります。

擬似コードで
TrCameraB * RCameraB * RCameraA^-1 * TrCameraA^-1 * TrCubeA * RCubeA * RCubeB^-1 * (0, 0, 0, 1) 

、これはつまるところ:私たちは

TrCameraB * RCameraB * RCameraA^-1 * TrCameraA^-1 * TrCubeA * RCubeA * RCubeB^-1 = TrCubeB 

は、単に左側に起源を掛け、並進ベクトルを見つけるには、そのようなことを、翻訳変換を見つける必要があります(それぞれの並進ベクトルを表す現れる行列):

Vector4 translation = (0, 0, 0, 1) 
translation += TrCubeA 
translation -= TrCameraA 
translation = RCameraA.Inverse().Transform(translation) 
translation = RCameraB.Transform(translation) 
translation += TrCameraB 

は再び、私はやっとユニティAPIを知っていると私はTRANSFORMA中(慣習たよりもそれはいくつかの異なる規則を使用する場合があります数学は特に難しい)。しかし、何かが間違っていると、上記の派生を適応させることができると確信しています。

+0

ありがとうございますニコ!私はUnityにそれを適応させる方法がわからなかったが、私はこれで終わった、それは私が何を望むかを行います。 \t \t 'するVector3翻訳=新しいのVector3(0,0,0);' \t \t '翻訳+ = cubeA.transform.position; ' \t \t'翻訳 - = cameraA.transform.position; ' \t \t'翻訳= cameraA.transform.InverseTransformPoint(翻訳); ' \t \t'翻訳= cameraB.transform.TransformPoint(翻訳/ 2); \t \t 'cubeB.transform.position = translation;' \t \t 'クォータニオン回転= Quaternion.identity;' \t \t '回転= Quaternion.Inverse(cameraA.transform.rotation);' \t \t 'cubeB.transform.rotation =回転;' –

0

ニコの偉大な答えは、私の問題を解決しますが、コードのフォーマットのコメント欄では、このために構築されていないので、ここで私はニコの回答に基づいてユニティのために書いたコードは次のとおりです。

Vector3 translation = new Vector3(0,0,0); 
    translation += cubeA.transform.position; 
    translation -= cameraA.transform.position; 
    translation = cameraA.transform.InverseTransformPoint(translation); 
    translation = cameraB.transform.TransformPoint(translation/2); 

    cubeB.transform.position = translation; 

    Quaternion rotation = Quaternion.identity; 
    rotation = cameraB.transform.rotation * Quaternion.Inverse(cameraA.transform.rotation) * cubeA.transform.rotation; 

    cubeB.transform.rotation = rotation; 

それは一つではないのですキューブAが静止し、カメラAがその周りを移動すると、キューブBはカメラBに対して動きます。キューブAとキューブBは常に同じ位置にあります。それぞれのカメラに関連して回転する。

+0

私はあなたが行を削除すべきだと思います'translation - = cameraA.transform.position'は既に次の逆の一部です。おそらくこれが最後の行に 'translation/2 'を持っている理由でしょうか?正しく見える、そうでなければ。どういたしまして。 –

関連する問題