2016-11-30 55 views
0

私には惑星と月があります。月は、惑星の中心に位置するダミーオブジェクトの親である(本質的に0,0,0)。月は自由に(惑星上の任意の位置に)回転する。それは惑星から一定の距離を維持する必要があります。オブジェクトを別のオブジェクトの特定の位置に回転させるにはどうすればよいですか? (基本的には特定の位置に周回します)

私は月を回転させたいと思っていることを心に留めていますが、直立したままにする必要があります。すなわち、月は一貫して惑星の表面に対して相対的に上を向くべきです。基本的には、私が探しているポイントに達するまで、月が地球上を「回転」しなければならない場合のみ、「moveTo」スクリプトのようなものです。ここで

は、私が使用する正しいロジックをうまくすることはできませんけれども、私は、これまで持っているものです。

Vector3 targetDir = moveToPos - moon.transform.position; 

float angle = Vector3.Angle(targetDir, moon.transform.up); 

dummy.transform.RotateAround (moveToPos, moon.transform.up, angle); 

私が正しく、このことを考えていますか?私がこの作業をしたら、別の月のVector3の位置に月を送り、月を地球の表面上で回転させたいと思います。私は何か類似のものを検索しましたが、私が探しているものを見つけることができません。

このスクリーンショットに表示されるマーカーは、「ここに回して」と言うべきですが、これは次のように私のシーンが見えるもの、本質的です:あなたは既に物事が非常に簡単に作った

Marker shows where the moon should be moved

enter image description here

+0

あなたの階層のスクリーンショットを表示することはできますか?ただ、状況を正確に読者に明確に示していますか?私は解決策にアプローチする方法を知っているかもしれませんが、私は誤った前提に基づいていません。 – Serlite

+0

Serliteを助けてくれてありがとう、私はちょうどスクリーンショットでOPを更新する。 – Valerie

+0

大丈夫です。 1つの追加の明確化 - あなたは月が常に上に向き合うべきだと言うとき、それはあなたが惑星の表面に対して相対的に "上"を意味するように聞こえる。これは正しいです?それとも、世界の空間で "上"を意味するのですか? – Serlite

答えて

2

あなたの月を空の変換の中に入れ子にすることによって。それが正しく設定されていれば、月のtransformを直接操作する必要はないことを意味します。コンテナオブジェクトを目標位置に向けるまで回転させるだけです。

* これは、惑星に対してコンテナオブジェクトが(0,0,0)であり、月がz軸に沿ってローカルにのみ翻訳されることを意味し、コンテナのtransform.forwardベクトルと並んでいます。

コンテナが直面する必要が目標方向を決定
  • 問題は、我々は小さなステップにそれを打破する場合に接近することが容易です。これは、目標位置からコンテナの位置を単に差し引くことで得られます。

  • コンテナが目標方向に向くために必要な回転を計算します。これはQuaternion.LookRotation()のための良い場所です。
  • コンテナをその方向が目標方向と一致するまで回転させます。これを達成するためにQuaternion.Lerp()を使用することができます。ここで

は、これらの手順を実装するかもしれない方法は次のとおりです。

Quaternion targetRotation; 
Quaternion startRotation; 
float progress = 1; 

void SetTargetPosition(Vector3 position) 
{ 
    // Calculating the target direction 
    Vector3 targetDir = position - dummy.transform.position; 

    // Calculating the target rotation for the container, based on the target direction 
    targetRotation = Quaternion.LookRotation(targetDir); 
    startRotation = dummy.transform.rotation; 

    // Signal the rotation to start 
    progress = 0; 
} 

void Update() 
{ 
    if (progress < 1) 
    { 
     // If a rotation is occurring, increment the progress according to time 
     progress += Time.deltaTime; 

     // Then, use the progress to determine the container's current rotation 
     dummy.transform.rotation = Quaternion.Lerp(startRotation, targetRotation, progress); 
    } 
} 

注:月は(それが現在〜1秒で回転を完了します)あまりにも速く回転している場合は、単にすべてのprogressに以下を追加しますフレーム、例えば。因子で分けてください。

コンテナが惑星の中心に置かれている限り、月は常に表面から一定の距離のままでなければならず、この方法では常に惑星の表面に対して一定の「上」の方向を保ちます。

希望すると便利です。ご質問がある場合はお知らせください。

+0

Serliteありがとう、私は今それを試しています。エレガントなソリューションのように見えて、それを分解していただきありがとうございます。それは働いているようですが、逆の方向に進んでいるように見えます。それはおそらく私がやっていることです。私は戻ってきます... – Valerie

+0

@Valerie Hm、weird。月がそのローカルz軸に沿って確実にマイナスに変換されていないことを確認します。そうでなければ、このアプローチを使用して惑星の反対側になります。 – Serlite

+0

ありがとう、それは私が考えるものです。私は階層を示すより良いスクリーンショットでOPを更新しました – Valerie

関連する問題