ラベル 数学 の投稿を表示しています。 すべての投稿を表示
ラベル 数学 の投稿を表示しています。 すべての投稿を表示

2012年12月11日火曜日

TPで2直線の交点を求める

前回に続き、数学ネタです。
前々から紹介している、こちらをTPでやってみるって感じで進めます。
もう、リンク先見たほうが早いと思いますが。。


図①




















はじめに、線分AB上の点を求める式です。
前回の式と同じです。


TP式①-- Apos+(unit(AB)*length(AP))

今回もベクトルAPを求めていきます。
図①を見るとわかるように、ベクトルAPは、点Aから直線CDの最短距離ではありません。
前回は外積で最短距離求めていきました。
今回も、前回とちょっと使い方は異なりますが、外積を使い求めていきます。

図②


















ざざっと図にしてみた。
直線CDに対し、直線ACとABの外積を求めると青線、赤線が求まる。
この青線と赤線、二つの比率がベクトルAPの大きさとなる。
つまりTP式①のlength(AP)となる。






























いつものように後半、内容スカスカ!?
いつか自分で記事見直したときに調整します。
さらば。サササ、、、--

2012年12月8日土曜日

TPで、任意の座標からもっとも近い線分上の点を求める

ちょっとタイトルが長くなってしまいました(汗)数学での良い言い回しとかありそうですが。。。
英語では、Closest Pointと言うのですかね?
ここで、躓いてたらいかんので画像でどういった事か説明します。

図①



















といった感じです。
点A,B,Cのベクトル値は確定してるものとして進めていきます。
今回は点Pを求めるにあたって、外積を使い求めていきます。
内積でも、求められますが 外積で求めていきたいと思います。
理由は、外積だと上で求めたものをちょっと応用すれば直線同士の交差点も求められます。
こんな感じです。 すばらしい!
内積だと、これは無理かな~と。すみません、憶測です^^

では、早速やっていきます。※関数とかTP用の表現を使っています。


はじめに、線分AB上の点を求める式です。こちらにも書きましたが復習です。

図②



















TP式①-- Apos+(unit(AB)*length(AP))

ベクトルAとABは、わかっていますので、ベクトルAPの大きさがわかれば、ベクトルPが求まります。



では、ベクトルAPの大きさを求めていきます。
わかりやすいように、辺d,e,fを割り当ててみました。
ベクトルAPの大きさがfということですね。

図③




















ピタゴラスの定理から、fを求めるにはeとdが解ければ求まりますね。


TP式②-- f = sqrt(d*d-e*e)


これで、ベクトルAPの大きさは求まります。
後はeとdを埋めていくだけです。

dの方はベクトルACの大きさを求めればよいので、求まります。
さてeですが、ここで外積を使います。

TP式③-- e = length(AB x AC)/length(AB)
※TP式③のベクトルABの大きさは、1でもなんでも揃っていれば良いらしい。

式の参考

こちら2Dでのある点から直線までの距離より

全ての値の準備ができたので、TPに組み込んでいきます。
上記の三つのTP式を組み込みました。
































さてさて、これの使いどころはいつになるのやら。。
近々公開かな。



















2012年10月12日金曜日

Iteratorで同心円状にパーティクルを配置

Iteratorの基本を米岡さんがまとめてくれています!
自分で記事書かないと覚えないので、メモ程度に作成してみました。

又、今回パーティクルの配置に使用したエクスプレッションについてはこちらにちょこっと書いています。

2012年10月11日木曜日

CGの数学メモ

これまで、TPでパーティクル触ってるうちに学んだものを整理、メモしてみた。

当然のごとく間違って解釈している事もあるかと思うので、その時は突っ込みのほうお願いします。
こちらも、手法見つけるたびに更新していきたいと思いまする。
又、TPのエクスプレッションの記事と、ダブルとこもあるが気にしない。


ベクトル


■ベクトルは方向と大きさを持った値

■空間での、あるポイントのワールド位置座標は原点からのベクトルの成分値である

■ベクトルAの|A|の意味は大きさを表す記号。
絶対値は、全てをプラスにするという意味に思われがちだが
本来の意味は「始まりから終わりまでの距離」である。

■ベクトルの足し算、引き算で何ができるか?
基礎はこちらが、すんごくわかりやすいです^^
線分上の点を求めることができる→こちらの「ベクトルの加算を用いて~・・」のところ
ベクトルの加算で、動きを滑らかな軌道にする事ができる。こちら
ベクトルの減算で、2点のベクトルを求める事ができる。TPで言う、C distanceノードと思えばよい。こちら

■内積は何ができるのか?

-----------------------------------------------------------------------------------


●二つのベクトルのなす角が求まる。
内積の公式、A*B=|A||B|cosθより
cosθを求めればよい。
--追記2012/10/11-
角度として、値を求めるならarccosθとする。
cosθ=0.5の場合、arccosθ=60度
------------------

●ベクトルの投影の長さ(大きさ)が求まる。
A*unit(B)=投影の長さ
画像
-----------------------------------------------------------------------------------
条件命題

●二つのベクトルの垂直チェック

A*B=0ならば垂直

●二つのベクトルの角度情報(二つのベクトルのなす角をθとする)

A*B>0のとき、θ<90度
A*B<0のとき、θ>90度
-----------------------------------------------------------------------------------


■外積は何ができるのか?
はじめに、AxBで表されるxはcrossという。よってクロス積とも言われる。
結果はベクトル値だが、二次元の場合だとスカラー値になる。

●二つのベクトルに対して、垂直なベクトルが求まる
右手の法則により、垂直の向きを割り出す!
AxBが上向きなら、BxAは下向きになる。
右手の手首を、ベクトルA,Bの交点に置き、親指は立てながら人差し指から薬指までベクトルAの向きに合わせる。んで、4本の指をベクトルBに曲げたとき親指の指す方向がAxBになる。

●二つのベクトルのなす角が求まる。(内積使ったほうが早いとのことだが、時と場合による)
外積の公式、|AxB|=|A||B|sinθより
sinθを求めればよい。

●ベクトル同士の交点を求める
こちらがすばらしい記事になります。


●ベクトルと点の距離を求める
画像|AxC|/|B|



2012年10月8日月曜日

ベクトルの合成で弧を描きならターゲットに移動


ターゲットに向かって、弧を描きながら到達する表現をベクトルの合成を使って行いました。
元ネタは、Joe氏のDVDです。 パートとしては、09_SquirlArt_Crowdsの一部分になります。
一気にやりたいところなのですが、一つ一つ噛み砕いていくのに精一杯です。

手抜きになりますが、一応解説。




いい感じに、曲線の軌跡を残していますね。
これは、ベクトルを毎フレーム足しあわすだけで表現できます。
その足しあわすベクトルは、パーティクルのベロシティとターゲットへのベクトルになります。

イメージ↓↓適当すぎてすんません。




















緑ベクトル、青ベクトルの割合で弧を調整することができます。
青ベクトルを大きくすれば弧は大きくなります。ベクトルを大きくするには、スカラー値をかけてやるんでしたね。
今回、スカラー値は0~1の値に正規化しています。これは、単に解かりやすくするためです 。最終的にDrectionInputにいくので正規化されます。



















大分、説明を省いた部分がありますが、大事なところは、ベクトルの合成による表現です。
上記のように、ベクトルの合成を毎フレーム行うことで、じわじわとターゲットにベクトルが向くので結果、曲線が表せる ということになります。

今後もこういった、数学的な引き出しをどんどん増やしていきたいところです。

2012年7月29日日曜日

maxScriptで行列を勉強してみた④

今回は、逆行列を使い、基底をワールドとローカル変換し合って座標を変換していく。
こうすることで、あるオブジェクトのローカル情報を元に座標変換する事ができる。
要は別の基底(基準)を元に調整できる事ができるということである。
3dsmaxでいう下の赤枠を切り替えて調整するときあるけど、ここイメージすると良いかな。



















実例1 マトリックスを使い、ボックスのある頂点を、ティーポットのある頂点へ移動する。

1、ボックスとポットを用意する。頂点番号50をターゲットにする。
ボックスの絶対座標はワールド基底からの値で、ローカル座標はローカル基底からの値である。
ボックスのワールド基底をポットのローカル基底に変換するために下記の2つの基底を用意する。
ボックスのワールド基底の変換行列は、transformプロパティでゲットできる。
ポットのローカル基底が必要なので、逆行列で用意しておく。





2、ティーポットのローカル空間でのボックスの頂点50の座標を求める。そのためには、ボックスの基底をティーポットのローカル空間にすればよい。


3、ポットの頂点100のローカル空間座標を求め、ボックスの頂点50へ移動するため移動ベクトルを求める。



4、後は、3で求めたベクトルをmoveメソッドで頂点100に引数として渡してやるだけだ。














実例2 オブジェクトAのローカル空間を元に、オブジェクトBを動かす。

画像のboxのローカル空間を元にSphereを移動します。ここでは、boxのy軸に沿って移動したいと思います。
①変換マトリクスを用意します。
transmatrix [0,5,0]    ----①
これを$Sphere.transform * transmatrix [0,5,0]してもワールド空間でのY軸に沿っての移動になる。

②boxのローカル空間を取得する
inverse $box.transform    ----②
③①の移動変換マトリクスを②を使い変換する
xformmat ① ②
これでboxのローカル空間でのY軸に沿っての移動になる。












2012年6月14日木曜日

TPのエクスプレッションメモ

TPのエクスプレッションで値を操作する手法などをメモしていこうと思います。随時更新ってことで{%ピクトハカセhdeco%}

こういうのは、なるべく多く引き出しがあると良いですね。
とりあえず、考えるより引き出しを多くしていきたいです!

後、関数が使えるとこは関数使っています。関数ヘルプ←式の使い方で検索

※スカラー値の変換であれば、Value To Timeノード+Floatノードを使えば、グラフで変換できるので便利!!←詳細は米岡さんのブログに記されています。
今後ノードのパラメータ上でグラフが扱えることに期待。

はじめに、、
ベクトルについて
①ベクトルは方向と大きさのみを持った値
②空間での、あるポイントのワールド位置座標は原点からのベクトル値である


■スカラー演算

●値の範囲を「0~1」に変換。値を正規化する。

---------------------------
Input値
lifespan = 200
age = 0,1,2,・・・・,200
---------------------------

age/lifespan
---------------------------
Output値
0,0.1,0.2,・・・・,1
---------------------------

※正規化とは、値を利用しやすくすること。
例えば、範囲が「23~343」のような任意の値を「0~1」の範囲に値を変換し利用しやすくしたりすること。




●値の「0~1」を「1~0」に反転する

---------------------------
Input値
a = 0,0.1,0.2,・・・・,1
---------------------------

1-a
---------------------------
Output値
1.0,0.9,0.8,・・・・,0
---------------------------




●任意の数の比率をフロート値で求める
---------------------------
Input値
a = 30
b = 70
---------------------------

a/a+b =x
b/a+b =y
---------------------------
Output値
x=0.3
y=0.7
---------------------------



●値の「0~1」を0.5を最大値とし、0.5以上は0に減っていくようにする

---------------------------
Input値
a = 0,0.1,0.2,・・・・,1
---------------------------

0.5-(abs(a-0.5)) //absは絶対値
---------------------------
Output値
0,0.1,0.2,・・・,0.5,0.4,0.3,0.2,0.1,0
---------------------------

●三角関数で曲線を表現する

上手く説明できないのでメモです。
sin(a*b)*c+d

a:位相
a=0,1,2,・・・∞

b:周期
c:振幅
d:初期位置


xにcos、yにsinで円を表現することができる。
さらにzに位相(時間など)を加えることにより、上方に向かう螺旋を表現できる。
a,b,c,dにそれぞれ任意の値を入れ、(x、y、z)に上記の式を入れることにより、様々な曲線を表現できる。
もちろんcosでも良い。

パーティクルを動かすというより、パーティクルの配置に使うほうが良いか。。
動かす場合は、Positionオペレータでフレームごとに位置を与えていく感じ。
よってベロシティが簡単にとれないので、パーティクルを動かすには不向き?
ということは、ベクトルで動かすほうが良い?
すみません、すげー基本的なことかもですが混乱気味なのでダラダラと、とりあえずメモしました。

●オブジェクトを地面に転がせる際に回転を同期させる
1軸 degreerad((X_Position)/(Radius*pi))*360

3軸 quaternionを使用

https://vimeo.com/album/2630843/video/80532054


●剰余を使ってエクスプレッションの値を繰り返す
http://sidefx.jp/doc/ref/expression_cookbook.html

■ベクトル演算

●単位ベクトルを求める
---------------------------
Input値
v1(任意の名前) //ベクトル値

---------------------------

unit(v1)
---------------------------
Output値
v3(任意の名前) //v1,v2に対する直角のベクトル
---------------------------


●二つのベクトルに対する直角のベクトルを求める。これを外積という。

---------------------------
Input値
v1(任意の名前) //ベクトル値
v2(任意の名前) //ベクトル値
---------------------------

v1xv2
---------------------------
Output値
v3(任意の名前) //v1,v2に対する直角のベクトル
---------------------------

●二つのベクトルのなす角を求める。これを内積という。値はスカラー値になるので注意。


---------------------------
Input値
v1(任意の名前) //ベクトル値
v2(任意の名前) //ベクトル値
---------------------------

acos(v1*v2)
---------------------------
Output値
v3(任意の名前) //v1,v2のベクトルのなす角(スカラー値)
---------------------------



●ベクトルの加算を用いて、ある二点(A,B)を結ぶ線上に位置するポイントのワールド位置座標を取得する。

画像


ベクトルを加算する前に、v2の値を決める。
①線分ABの単位ベクトル(方向)を取得する。(TPでいうと、点A,Bをポジションとする、DistanceノードのDirection値)
②ベクトルの大きさを用意する。(スカラー値)
③①と②を乗算することで、大きさと方向を持ったベクトルv2ができあがる。
---------------------------
Input値
v1(任意の名前) //ベクトル値
v2(任意の名前) //ベクトル値
---------------------------

v1+v2
---------------------------
Output値
v3(任意の名前) //原点から線分AB上を終点とするベクトル
---------------------------

●ベクトルの減算を用いて、ある二点(A,B)のベクトルを作成する。distanceノードがあるのであまり使い道ないかもだが。。。






















●反射ベクトル
Input値
v1(入射ベクトル) //ベクトル値
v2(衝突サーフェスの法線) //ベクトル値
---------------------------

(-1*2*(v1*v2)*v2-v1)+v1
(2*(v2*v1)*v1-v2)
---------------------------
Output値
v3(反射ベクトル)
---------------------------



■条件式

if(式,真,偽)
例:if(pos.z>50,1,0)→Zポジが50以上なら、真、以外は偽


2012年6月1日金曜日

パーティクルの衝突の超基礎 #TPJP

先に一言。この記事見たからって、外積が把握できるという内容ではございあせん。
外積の詳細は別のとこでお願いします~

今回記事にしたのは、自身が外積について一つ引っかかったからです。



box(v1)とロケット(v2)の方向を取得し、外積をつかってboxをかわすように、設定してみた。

それがこちら↓↓

v1 x v2





もし、v1、v2が平行ならば、ゼロベクトルになるはず。そうなるよう設定してみた。

だがなっていない↓↓

v1 x v2




デバックで値を確認してみた。

画像


法線のyに意図しない数値はいってる!!ゼロベクトルになっていない!!
もちろん、max上の回転値はall0です!
なのに法線がずれている。。

boxを新しく作り直してみた!!

画像

ゼロベクトルになるとこんな↓↓




では、どのタイミングで意図しない数値が入った??
一度boxを回転して、回転(0,0,0)と入力で戻すと駄目らしい。0ベクトルには戻れず、何かしら値が入っている。
なぜなら、maxちゃんの0.0って表示は小数点を第何位まで表示すると0になっていない>o<
0.00005213みたいな。。


まあ、結果boxを避けてほしいので0ベクトルにならず良いのだが、気持ち悪い。


んで、気になったのが、このような衝突をセットアップする際、万が一にも0ベクトルになる場合があると思うのですが、それを防ぐ対処法ってあるんですかね?なんとでもなるのかもしれませんが、ベターな方法があれば知りたいものです^^


2012年1月30日月曜日

TPで、あるポイント間にパーティクルを配置する手法 #TPJP

今回の記事は、主に基礎的なベクトルに関しての手法、ベクトルを操作するためのエクスプレッションについて取り上げました。

慣れないエクスプレッションなので、説明というより、単なるメモ書きになっているのはご了承ください{%トホホwebry%}


最終的に画像のように、ある2つのポイント間にパーティクルを配置します。

画像



流れとしては、図の①からたどっていけばよいかと思います。
又、めんどくさいので、ひとつの画像に内容詰め込んでいます{%ごめんねwebry%}

画像



ベクトルについての参考はこちら
↓↓↓↓↓
Zで行こう!
この方ぐらい数学できるようになりたいものです。

余談、、、
これに、いろいろあって半日かかってしもた。。
図を作るのにphotoshopほしい。gimpとかで何とかやったった。



2011年10月3日月曜日

ベクトルの正規化について

Zで行こう!さんのサイトでスクリプトを勉強してたら、ベクトルの正規化というものが出てきた。エフェクトアーティストたるものこれは見逃せないことだと思い色々と調べてみた。高校時代の数学ことなんて全く覚えてません。{%泣くwebry%}

まずベクトルの正規化を学ぶにあたって、以下のお題を進めながら学んでいこうと思う。


お題:3D空間に存在する球(sphB)を球(sphA)に接するように移動する

デカルト座標で示すとこんな感じ。分かりやすく2Dで考えていきます。

画像


この図から見るように、moveメソッドに引数として赤の矢印のベクトル値を渡してやれば、OKだ。


①赤いベクトルの大きさを求める。
大きさをsph_distanceとすると、
sph_distance = (distance sphA.pos sphB.pos)-(sphA.radius+sphB.radius)
となる。

②赤いベクトルの単位ベクトル(方向)を求める。
①の大きさのベクトルを求めるとなると、大きさ1となる単位ベクトルが必要になる。
なぜなら、ベクトルは大きさと単位ベクトルの積で表されるからである。

画像

こんな感じかな{%トホホwebry%}

単位ベクトルが必要ということで、それを出すにはnormalize を使う。赤いベクトルの単位ベクトルをsph_unit_vectorとすると、
sph_unit_vector=normalize (sphA.pos-sphB.pos)
となる。

③上記のように①*②で赤いベクトルの値が求められる。
赤いベクトルをsph_vectorとすると、
sph_vector = sph_distance*sph_unit_vector

④最後にmoveメソッドに③を渡してやればOKだ。
move $sphB sph_vector


以上、ベクトルを使った移動を見てきたが、ベクトルの正規化という言葉が出てきてない。
ベクトルの正規化というのは②で見られるようにベクトルを単位ベクトル化するということである。
メソッドで言うと、normalize  がそれにあたる。