脱力駆動開発記

ゲームアプリを作るエンジニアの技術メモ

MENU

UnityのVector3.DIstance()よりもVector3.sqrMagnitudeを使いましょうという話

タイトルの通りです。

cocokyoro.hateblo.jp
引き続きここに追加していってます。
ですがこのままだと非常に長い記事になりそうなので、一個一個の項目ごとに記事に残して、上の記事は目次的な存在にしようかなと。。

というわけで今回は「Consider using distance-squared over distance」の項目について。

普通の距離よりも二乗された距離を使いましょうね、というお話。

通常ルート(√)の計算はCPUに大きな負荷がかかります。
Vector3.magnitudeとかVector3.Distance()は三平方の定理の式に基づいて値を出しています。

f:id:cocokyoro:20160615032106p:plain
これの2で求まる値ですね。

Vector3クラスにはsqrMagnitudeというプロパティがあります。
これは距離を二乗した値に等しいです。
上の図の1で求まる値ですね。

二乗した値を使うことには以下の2つのメリットがあります。

  1. 値の精度のロスを減らせる
  2. パフォーマンスが向上する

・値の精度のロスを減らせる
a,b の大小と a^2,b^2の大小は一致します。
が、a,bはルートを取った際に値のロスが発生します。
より正確な値を取りたい場合は二乗された値を使用した方が安全。

パフォーマンスが向上する
前述の通りルート計算だとCPUに負荷がかかっちゃうからやめましょう。
距離に関わらずルート値を使ってるところは二乗の値に置き換えてやりましょう。
Unity側がVector3のプロパティにsqrMagnitudeというものを用意してるということはそういうことなんでしょう。

・before

float distance = (transform.position - other.transform.position).Distance();
if(distance < targetDistance){
    //処理
}

・after

float distance = (transform.position - other.transform.position).sqrMagnitude;
if(distance < targetDistance * targetDistance){
    //処理
}

ちなみにxのy乗はMathf.Pow(x,y);で表現できます。

簡単だけど以上です。

今回わかんなかった単語
precision = 精度