スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    CG屋のベクトル覚書

     最近ちょっとベクトルを使う機会が増えて来たんですが、毎回毎回使うたびに忘れては調べてを繰り返してるので、ここに覚書を残しときます。
     かなり基礎的なことしか書いてませんが・・・

     ちなみにここでは3軸ベクトルのみを扱います。ベクトルAはA、ベクトルAの長さは|A|で表します。
     また、ベクトルの各要素はベクトルAの要素の場合
    <<ax, ay, az>>
    と表記します。
    ■ベクトルの長さ
     まずは長さから。ベクトル自体の長さを求めます。
    算出方法
    |A| = √ ((ax * ax) + (ay * ay) + (az * az) )
    記号が書けないからこんな感じになってしまいましたが・・・用は各要素を2乗して足した合計の平方根です。
     とくに求め方以外とくになし。



    ■ベクトルの正規化 - ノーマライズ
     ベクトルの長さが1になるように各要素を修正したベクトルですね。
     ベクトルの計算を行っていく上でよく使います。正規化しとくといいこといっぱい。(もちろん場合による)

     やり方は簡単、各要素をベクトルの元の長さで割るだけです。
    算出方法
    Aの正規化 = <<(ax / L), (ay / L), (az / L) >>
    ※ただしLは元のベクトルAの長さ
     さっそくベクトルの長さを使用しました。



    ■加算 - ベクトルの足し算(A + B)
     こっから2つのベクトルの計算。ベクトルAの先端にベクトルBをくっつけて、ベクトルAの始点とベクトルBの終点を結んだベクトルになります。
    vector_001.png

     ベクトルの計算の最初に習う基礎の基礎ですね。
     ただ、これが座標を求める上で意外と役立つんですなぁ。
    算出方法
    A + B = <<(ax + bx), (ay + by), (az + bz)>>
     算出方法は各要素を足すだけですね。簡単簡単。



    ■減算 - ベクトルの引き算(A-B)
     ベクトルAとBの始点を同じ場所にして、ベクトルBの終点からベクトルAの終点に向けて結んだベクトルになります。
    vector_002.png
     2点を結ぶベクトルを求めるときなんかに使えます。
    算出方法
    A - B = <<(ax - bx), (ay - by), (az - bz)>>
     算出方法は各要素を引くだけですね。これも問題なしですが、最初のベクトルAに向かったベクトルになる点だけ注意!



    ■積 - ベクトル×スカラー(A * S)
     ベクトルに数字をかけた場合です。かけた数字の数だけでかくなります。向きは変わりません。
    vector_006.png

    算出方法
    A * S = <<(ax * s), (ay * s), (az * s)>>
     算出方法は各要素に右側の数字を掛けるだけ。



    ■内積1 - ベクトルどうしの掛け算(A ・ B)
     ベクトルどうしの2種類の掛け算の一種、内積で「インナープロダクト」・「ドットプロダクト」などと言ったりもしますね。
     内積を行った結果はベクトルではなくスカラー値になるのが他の計算とは違うところ。
    算出方法
    A ・ B = (ax * bx) + (ay * by) + (az * bz)
     算出方法は超簡単。それぞれの各要素をかけてそれらを足すだけです。Pythonなどスクリプトなら1行で終わるレベルですね。
     さて、問題はその使い道。とりあえず数値が出てきたけど何ソレ美味しいのレベルの不可解な数字です。

     で、面倒くさいから結論を言いますと、この出てきた数字はベクトルBがベクトルAの向きにどれくらいの割合で一致してるかを表してます。


     ・・・イマイチよくわからないので、双方とも正規化されたベクトルAとベクトルBで考えてみます。
    vector_003.png
     ベクトルAとBが完全一致してる場合から考えてみましょう。試しにA(<<1, 0, 0>>)とB(<<1, 0, 0>>)で計算してみます。
     内積は
    (1 * 1) + (0 * 0) + (0 * 0) = 1
    です。1と出てきました。完全一致している場合は1と・・・

     次にベクトルAとBが真逆を向いている時を考えてみます。A(<<1, 0, 0>>)とB(<<-1, 0, 0>>)で計算してみます。
    vector_004.png
    内積は
    (1 * -1) + (0 * 0) + (0 * 0) = -1
    です。-1と出てきました。なんか完全一致の時とはいかにも真逆っぽい数字ですねw(え、こじつけ臭い?)

     では今度はAとBが直角の場合を見てみましょう。A(<<1, 0, 0>>)とB(<<0, 1, 0>>)で計算してみます。
    vector_005.png
    内積は
    (1 * 0) + (0 * 1) + (0 * 0) = 0
    です。なんと0になっちゃいました!!

     ってことで今の3つの例を見てみると、完全一致している場合は1、真逆を向いている場合は-1、直角の場合(まったく向きがあっていない)は0になります。
     正規化しているベクトル同士の内積の場合は一致率が-1~1の範囲で表され、0の場合は微塵も向きが合っていないことを表すようになっています。(証明などいらん!CG屋は事実だけを受け入れればいいのだ!!)

     これを利用すると複数のベクトルがあり、目的のベクトルにどれが一番一致しているかを判断する時に、すべてのベクトルを正規化してから内積を調べ、一番数字がでかい奴が一番目的のベクトルに近いということを簡単に判別することが出来るわけですね!!!!!!
     CG的に具体例を出すなら、複数のオブジェクトがシーンに散在している中、最もカメラの向いている方向と同じ方向に回転されているオブジェクトを発見出来たりします!

     ・・・イマイチぱっとしない例だった・・・



     って事でかなり長くなってしまったんで、今回はここまで。現状数学の勉強のおさらい程度の内容ですな・・・これを活かすための実例がないと、ここらへんの座学は勉強する気になれないんですよねぇ・・・
     もっと実例を挙げれればいいんですが、いざ実例を挙げようと思うとなかなかでないっすな(-_-;)
    スポンサーサイト

    コメントの投稿

    非公開コメント

    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココからアクセスできますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。