13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

よく使うVEX集-本編

Posted at

#注意
これはよく使うVEX集-基本編(https://qiita.com/TF_siri/items/e189932d76f40bb56284)
の内容を前提として話します。
基本編の事が分からないとダメです。

#変更しやすくする方法
VEXでアトリビュートを変更する場合、一々調整のたびに値入力なんてしてられないですよね。
なので変更しやすくします。

よく使われるのは、chi("")、chf("")、chv("")、chramp("")ですね。
感の良い方は分かるかもしれませんが、chの後に入っているのが型です。
chiはint型、chfはfloat型、chvはvector型です。
chrampは少々特殊で、カーブで制御が出来ますが、ちょっと複雑です、後日説明します。
もしch("")と何も型を指定しなかった場合、float型で出来ます。

作り方ですが、さっき上げたch("")達を書いてこのボタンを押します。
Desktop Screenshot 2020.06.23 - 22.32.42.49.png
そうするとintだったらint、floatだったらfloat、vectorだったらvectorに対応した入力が出来るようになります。
Desktop Screenshot 2020.06.23 - 22.33.56.72.png
さて、これでアトリビュートの変更がしやすくなりました。
出は本編に行きましょう。

#point
pointは、その名の通りpointを持って来てくれます。
書き方はpoint(入力、”アトリビュート名”、番号);です。
例えば
vector pos=point(1,"P",0);
と書いたらposには1入力の0番ポイントが持っている@Pの情報が入ります。

#rand
randは、その名の通りランダムな値を起こします。
値は0~1、そしてランダムにする為のソースが必要です。
良く使われるのは@ptnumですね。
書き方は

float rand=rand(@ptnum);

のように書きます。
この場合、ポイント番号を軸にランダムにしてますね。
classや別のアトリビュートにしても大丈夫です。
ちなみに、ここでrand()の中の数字が同じだと全く同じrandが出るので、
Desktop Screenshot 2020.02.08 - 18.00.04.71.png
@pscale=rand(@ptnum);
@P.y=rand(@ptnum);

とかにすると上に行くほど大きい物になります。
もしこれでyの位置をランダムにしつつ@pscaleもランダムにしたかったら
Desktop Screenshot 2020.02.08 - 18.00.13.09.png
@pscale=rand(@ptnum);
@P.y=rand(@ptnum+1);

等して、中の値を変えておきましょう。
コレ、初心者がよくやっちゃう。

#noise
noiseも基本的にはrandと一緒です。
こっちは@Pをよく使うかな。
randは完全にランダムだったけど、noiseはその名の通り波を作ってくれる。
書き方も基本一緒だけど、中にch("amp")を入れると操作しやすい。
Desktop Screenshot 2020.02.08 - 18.03.27.77.png
@pscale=noise(@P*ch("amp"));
これでampを変更するとノイズが出来る。
他にもsnoiseとかあるけど基本このnoiseしか自分使わない。

#fit
fitは、任意の長さを任意の長さにフィッティングするときに使います。
書き方はfit(対象の変数,入力の最小値,入力の最大値,出力の最小値,出力の最大値);
です。
例えばrandで出したランダムな値を0~2にフィットさせる時は

float rand=rand(@ptnum);
@pscale=fit(rand,0,1,0,2);

と書きます。
Desktop Screenshot 2020.06.23 - 23.12.22.51.png

##fit01
fit01は、fitで指定する入力が0~1の場合に使います。
よく使うのは先に上げたrandやnoiseが0~1で生成されるので、それらを調整する時に使いますね。
先のfitで出したサンプルを省略できます。

float rand=rand(@ptnum);
@pscale=fit01(rand,0,2);

と書きます。
というかfit01はrandとnoiseでしか使わない気がする。
Desktop Screenshot 2020.06.23 - 23.12.26.73.png
結果は一緒。

#findattribval
findattribvalは、指定したアトリビュートを持っている番号を探してくれる関数です。
使い方は、findattribval(探す先,"クラス","アトリビュート名",探すアトリビュートの値);
です。
例えば、int sidに入力1の中からidが2のポイント番号を入れる場合、

int sid=findattribval(1,"point","id",2);

となります。
#nearpoint
nearpointは、指定したポイントから対象のポイントの中で最も近いポイント番号をもってきます。
書き方は、nearpoint(探す先,探す元,探す距離);
です。
探す距離を大きくするとその分重くなります。その距離内にポイントが無い場合、-1が帰ります。
例えば、int nptに処理中のポイントから見て入力1の中の距離2以下で最も近いポイント番号を持ってくる場合、

int npt=nearpoint(1,@P,2);

となります。
もし、距離を指定しない場合、距離のとこすっぽぬかせば大丈夫です。

int npt=nearpoint(1,@P);

結構使う。

#distance
distanceは、2点間の距離を測ります。
書き方は、distance(ポイント1、ポイント2);
です。
例えば、今のポイント位置と入力1の0番ポイントの位置との距離を測る場合、

float dis=distance(@P,point(1,"P",0));

となります。
#minpos
minposを使うと、ポイントを指定した番号のプリミティブ上の最短位置に移動させます。
書き方は

@P=minpos(1,@P);

意味は
位置は1入力の今の位置から見て最短距離
です。
Desktop Screenshot 2020.02.08 - 17.42.18.32.png
#lerp
lerpは今の位置と指定した位置を直線で指定した値の位置に移動させることができます。
書き方は

@P=lerp(@P,point(1,"P",0),ch("trans"));

意味は
位置は今の位置と1入力の0番ポイントのch("trans")で指定した値の場所
って感じです。
Desktop Screenshot 2020.06.23 - 23.33.39.61.png

#今回はここまで!
さて、本当に基本的な物は説明しました(忘れてたら後々アップするかも)!
では今回はここまでで、次回は「よく使うVEX集-応用編」で組み合わせ等の応用をやっていきます!
今回のサンプルで使用した物が入ったシーンです。
https://1drv.ms/u/s!Al-gq6RIZjNrkC0KHts-IvwjiUg1?e=RoMJKH

.....最後に、更新が遅れて申し訳ございません。本当は2月中に書こうと思ってたんです。
仕事が忙しいとかじゃなく純粋に忘れてました....
次回は...年内に上げられたらいいなぁ。

13
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?