イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

Processing 自作関数

void draw_inside_circle(int cx,int cy,float r,int cnt){//外側のサークルの中心と半径
  cnt--;
  if(cnt<0return;
  float r_comp = 2*sqrt(3)/3;
  float nr = (r_comp/(1+r_comp))*r;
  float kr = r-nr;
  float rad = 30*PI/180;
  int nx,ny;
  for(int j=0;j<3;j++){
    rad += 120*PI/180;
    nx = round(cx + cos(rad)*(nr));
    ny = round(cy + sin(rad)*(nr));
    circle(nx,ny,kr*2);
    draw_inside_circle(nx,ny,kr,cnt);
  }
}
 

void draw_triangle(int cx,int cy,int r){
  float deg = 180;
  triangle(cx+r*cos*1,r*sin*2+cy,
           cx+r*cos*3,cy+r*sin*4,
           cx+r*cos*5,cy+r*sin*6
          );
}

 

void center_square(float x,float y,float len,float deg){
  float ax=len ,ay=len;
  float bx=-len,by=len;
  float cx=-len,cy=-len;
  float dx=len,dy=-len;

  float eax = rot_x(ax,ay,deg), eay = rot_y(ax,ay,deg);
  float ebx = rot_x(bx,by,deg), eby = rot_y(bx,by,deg);
  float ecx = rot_x(cx,cy,deg), ecy = rot_y(cx,cy,deg);
  float edx = rot_x(dx,dy,deg), edy = rot_y(dx,dy,deg);

  eax+=x;eay+=y;
  ebx+=x;eby+=y;
  ecx+=x;ecy+=y;
  edx+=x;edy+=y;

  line(eax,eay,ebx,eby);
  line(ebx,eby,ecx,ecy);
  line(ecx,ecy,edx,edy);
  line(edx,edy,eax,eay);

}

 

斜め網目

  rot_at_center(45);

  int line_num = 20;
  int f = 400;
  for(int i=1;i<=line_num+20;i++){
    int sx = 0-f;
    int sy = (g_h/line_num)*i-f;
    int ex = g_w+f;
    int ey = sy;
    line(sx,sy,ex,ey);
  }

  for(int i=1;i<=line_num+20;i++){
    int sx = (g_w/line_num)*i-f;
    int sy = 0-f;
    int ex = sx;
    int ey = g_h+f;
    line(sx,sy,ex,ey);  
  }

  noLoop();
}

void rot_at_center(int deg){
  translate(g_w/2,g_h/2);
  rotate(to_rad(deg));
  translate(-g_w/2,-g_h/2);
}

float to_rad(float deg){
  return deg*(PI/180);
}

float to_deg(float rad){
  return rad*(180/PI);
}

 

void keyPressed(){
  if(keyCode==ENTER){
    String fname = str(day())+str(hour())+str(minute())+str(second())+".png";
    save(fname);

    PGraphics pg = createGraphics(g_w,g_h);
    pg.beginDraw();
    pg.tint(0,0);
    PImage img = loadImage(fname);
    img.loadPixels();
    for(int j=0;j<g_w;j++){
      for(int k=0;k<g_h;k++){
        int c = img.get(j,k);
        if(!compare_color(c,g_black)){
          pg.fill(c);
          pg.stroke(c);
          pg.square(j,k,1);
        }          
      }
    }
    pg.endDraw();      
    pg.save("trans"+fname);
  }
}

 

boolean compare_color(int a,int b){
  return (red(a)==red(b) && green(a)==green(b) && blue(a)==blue(b));
}

*1:90+deg)*(PI/180

*2:90+deg)*(PI/180

*3:210+deg)*(PI/180

*4:210+deg)*(PI/180

*5:330+deg)*(PI/180

*6:330+deg)*(PI/180

blender プリーツスカートの作り方

メッシュでこの形をつくる。A

このとき、配列を追加したとき、左端の頂点と右側の下側の頂点が重なるような形にする。

f:id:arumogina:20210831162833p:plain

カーブの円Bを追加。Aに配列・カーブモディファイアを設定し、カーブに追加したBを設定。配列数を良い感じに設定し、S+xでAを操作し隙間を調整する。

f:id:arumogina:20210831162901p:plain

Aにオブジェクト=>変換=>メッシュ、これでモディファイアが適用される。

切れ目の頂点を結合。M=>距離で で結合。

E+zで上に伸ばす。

上部分の頂点を選択し、Sで縮小。

上部分の内側の頂点を選択

R+Zで回転。

f:id:arumogina:20210831163738p:plain

上の頂点を選択し、shift+alt+s マウスを操作しえ円にする。

f:id:arumogina:20210831162910p:plain

下側の内側の頂点を選択肢R+Zで回転

f:id:arumogina:20210831162919p:plain

プロポーショナル編集を有効にし、下側のX軸上に並ぶ2つの頂点を選択し、g+zでいい感じになるように下に引っ張って完成。

f:id:arumogina:20210831162927p:plain

 

メッシュに変な影ができてる場合は、編集モードで全選択=>メッシュ=>ノーマル=>面から設定、でなおる

 

あと、このやり方で作った場合、unityに持っていくと影が変な風に付くので適当に法線転写して法線をカスタムしたほうがいい。

VRChat DynamicBoneの設定例 貫通防止

参考にした記事:

DynamicBoneでふわふわスカートを作る(基本パラメータ編)|うぃりあむ|pixivFANBOX

f:id:arumogina:20210827143107p:plain

 

スカートのボーンの配置。足の前に2本。左右に2本。足の後ろに2本。

f:id:arumogina:20210827143140p:plain

 

f:id:arumogina:20210827143131p:plain

 

insideコライダーの配置

f:id:arumogina:20210827143337p:plain

 

足の前と横にのみ配置。後ろは配置した場合、足を上げた時後ろも動いてしまう不自然な動作になるので配置してない。

insideコライダーによるスカートの制御についてはこちらを参照

DynamicBone式スカートの貫通防止 解説本 - ヒヨ家の交易所 - BOOTH

 

ちなみにコライダーを配置するときは、スカートのボーンにskinedMeshRendererを付与し、Meshに適当なサイズに縮小した球体のメッシュを設定するとボーンを常時可視化できて設定しやすくなる。

blenderカーブに沿ってオブジェクトを配置する方法

オブジェクトとカーブの二つを用意する。左がオブジェクト。右がカーブ。

f:id:arumogina:20210826182346p:plain

 

オブジェクトに配列、カーブモディファイアを追加する。

f:id:arumogina:20210826182418p:plain

 

カーブモディファイアのカーブオブジェクトにカーブを指定し、配列の数を良い感じに設定する。

f:id:arumogina:20210826182510p:plain

 

blender 簡易フリルの作り方

Alt + クリックでループ選択

f:id:arumogina:20210822163423p:plain

選択=>チェッカー選択解除

f:id:arumogina:20210822163439p:plain

Alt+s で適当に拡大

 

f:id:arumogina:20210822163503p:plain

Alt+クリックでループ選択

メッシュ=>トランスフォーム=>ランダム化

f:id:arumogina:20210822163536p:plain

数値を適当に調整

サブディジョンサーフェースモディファイアを追加

f:id:arumogina:20210822163556p:plain

微調整して適用

f:id:arumogina:20210822163648p:plain

 

Unity clothの使い方メモ

++クロスを使うときのblender側でのウェイトの塗り方

以下のように固定する部分のみHipボーンなどに赤で塗り、揺らす部分はウェイトを塗らないようにする。

f:id:arumogina:20210820140857p:plain

 

++cloth側でのウェイトの塗り方

edit cloth constraintsを押して、出てきたウィンドウの中からselectを選択する。

そしたらメッシュの頂点が球体として強調表示され、その球体を範囲選択出来るようになる。範囲選択したらウィンドウのMax Distance,Surface Penestrationの左側にチェックを入った状態で、右側の枠に数値を入力することでウェイトを塗ることが出来る。Unityのシーン画面のどこかで適当にクリックを行い、範囲選択を解除することでウェイトが反映される。

(便宜上、ウェイトを言ってるが正確にはウェイトではない

 

++fbxファイルを差し替えた場合、clothのウェイトはリセットされてしまう。

unityでメッシュを差し替えたいとき、現在のFBXファイルを削除して同名の新しいFBXファイルを置けばメッシュを差し替えらえれるのだが、これをやるとclothのウェイトが初期化されてしまう。

 

++clothを使うときはオブジェクトの拡縮を1:1:1にする必要がある。

でないと、爆発する。

blender側でトランスフォーム適用すればよい。

 

++++パラメタ説明

 

++max distance

頂点が元の位置から移動できる最大の距離。単位はメートル。

スカートの付け根など固定する部分は赤(0)にする。

固定する部分以外のところは0.5~1で全体塗ればいい気がする。

 

++Surface Penestration

頂点の法線の反対方向に移動できる距離。

法線方向には制限しない。

単位はメートル。

0以上にするとメッシュの形が崩れるので0が良いかもしれない。

 

 

++Stretching Stiffness

メッシュの伸びにくさ。小さいほど伸びやすくなる。

0.8から始めると調整しやすい。

 

++Bending Stiffness

メッシュの曲がりにくさ,捻じれにくさ。小さいほど曲がりやすくなる。

0.8から始めると調整しやすい。

 

++Use Tethers

有効化すると頂点が元の位置から離れ過ぎないようになる。

true推奨。

 

++Use Gravity

有効化すると、重量が働くようになる。

true推奨。

 

++Damping

速度の減衰係数。各頂点の揺れの収束が早くなる。

0.1~0.5推奨。

 

++External Acceleration

クロスに外部から一定に加えられる加速度を設定します。

 

++Random Acceleration

クロスに外部からランダムに加えられる加速度を設定します。

 

++World Velocity Scale

ワールド空間でのキャラクターの動きがクロスの頂点にどのくらい影響を与えるかを設定します。

0.1以下が安定する。

 

++World Acceleration Scale

ワールド空間でのキャラクターの加速がクロスの頂点にどのくらい影響を与えるかを設定します。

0.1以下が安定する。最初、やたらあらぶるのはデフォルトでこれが1になってるせい。

 

 ++friction

コライダーとの摩擦係数。コライダーと引っ掛けたいなら1にする。

 

++Collision Mass Scale
各頂点の質量。布の重さの表現に使う。20から試すと良い。

 

++Use Continuous Collision
高速で動く物体に対しての接触判定の精度が上がります。

計算量は2倍になります。

 

++Solver Frequency

物理演算の頻度。120~300推奨。

 

++Use Virtual Particles / Virtual Particle Weights

衝突の安定性を向上させ突き抜けを防止する。

true,デフォルト値を推奨。

 

++Sleep Threshold
スリープ状態になる頂点速度のしきい値を設定します。

この値以下の細かすぎる動きを無かったことにできます。裾とかが小刻みにプルプルし続けるのを防いでくれる

 

++Capsule Colliders / Sphere Colliders

コライダーを設定する場所。 SphereCollidersの場合,2つで1セットとなり、コライダー間もコライダーとして機能する。

 

++++コライダーの設定方法

空のオブジェクトを生成しそこにColliderコンポーネントをアタッチし、それをclothのcollidersにセットすることで使用する。Collderコンポーネントをアタッチした空のオブジェクトは最終的にオフにするか、IsTriggerにチェックを入れておく。

 

スカートなどの場合、コライダーをUpperLeg,LowerLogアーマチュアの直下に入れればよい。

 

++++設定例

f:id:arumogina:20210820155338p:plain

 

 

++参考

説明書に載ってない本当のClothコンポーネント ~VRChatで使うClothコンポーネント~ - Qiita

Cloth - Unity マニュアル

VRoidのワンピーススカートに、UnityのClothコンポーネントを適用し、VRChatに持っていくまで - Qiita