Blender2.8での頂点の選択について

blenderで簡単なスクリプトを書いていて頂点の選択についてつまずいたのでまとめます。 2020/1/15 blender2.81

編集モードから頂点の編集ができない

obj = bpy.context.active_object
obj.data.vertices[p].select = True

とすることで、頂点の選択を切り替えられるのですが、これが編集モードだとうまく動いてくれません。 なので、一度オブジェクトモードに切り替えます。

import bpy

obj = bpy.context.active_object
old_mode = obj.mode
bpy.ops.object.mode_set(mode='OBJECT')

list = [0,3]
for p in list :
    obj.data.vertices[p].select = True
        
bpy.ops.object.mode_set(mode=old_mode)

参考:

https://blender.stackovernet.com/ja/q/13906

頂点の選択をリセット

頂点の選択をリセット(どの頂点も選択していない状態にする)場合は、ショートカット[AA]からbpy.ops.object.select_all()を呼び出します。これをスクリプトから実行する場合、編集モードでないとうまくいきません。

bpy.ops.object.mode_set(mode="EDIT") #Activating Editmode
bpy.ops.mesh.select_all(action='DESELECT')

謎です。

blender2.8でスローペアレント

[スローペアレント]とは、子オブジェクトの位置を ”遅れて” 親オブジェクトに合わせる機能です。この機能によって、簡易的に揺れ物を再現したりできました。

 

blender2.8では、2.7には存在した[スローペアレント]が廃止されています(たぶん)

非常に便利でよく使っていたのですが残念です。

 

そこで、ドライバーを使ってスローペアレントを再現します。

 

参考 :

blender.stackexchange.com

 

次のようなシーンを用意します。

f:id:aobayu:20190902235017p:plain

[立方体]の座標は(0,0,0)、[球]の座標は(0.2,0,0)です。Cubeの動きに合わせてShepreの座標を遅れながら動かします。

次に、[球]と同じ座標に[エンプティ]などを置き、[エンプティ]を[立方体]にペアレントします。

f:id:aobayu:20190903000949p:plain

[球]を選択し、[トランスフォーム]→[位置]から[x]の値(今は0.2)を右クリックし、[ドライバーに追加]→[ドライバーエディタに表示]を選択し、ドライバーエディタウィンドウを開きます。

 

ウィンドウ左側の[x位置]を選択し、右側を以下のように設定します。

f:id:aobayu:20190903001643p:plain

これで、再生すると[球]の位置が遅れて更新されるはずです。

f:id:aobayu:20190903002138g:plain

これを、y座標、z座標についても同様に設定することで、スローペアレントっぽいことが可能です。

 

また、式の値を

(var + var1 * (n-1)) / n

(nに整数を入れる)とすることで、 nが大きいほどより遅れるといった風に遅れ具合を調整できます。

 

 

 

 

 

 

blender2.8でアウトライン(線画)を出す備忘録

blender2.8でアウトライン(線画)を描画する方法を紹介します。

f:id:aobayu:20190830163345j:plain

正直、アウトラインを綺麗に出すにはfreestyleが最強だと思っています。しかし、freestyleは非常に計算時間がかかってしまいます。(レンダリング時間の2/3以上がfreestyleの計算時間で、動画をレンダリングするのに非常に時間がかっていました。)

そこで、背面法等を使ってキャラクターのアウトラインを出す方法をまとめておきます。背面法を使うことで、ビューポートでの表示でき、アウトラインの調整が簡単になります。太い線を描こうと思わなければ、freestyleと遜色ないアウトラインが描画でき、レンダリング時間もかなり短くなります。

 

目次

 

ソリッド化モディファイアを用いたアウトラインの描画

多くのサイトで紹介されているスタンダードなアウトライン描画の手法です。

 

まず、オブジェクトのスケールが1になっていることを確認して下さい。 

また、板ポリゴンにはアウトラインを描画できないので、あらかじめ、別に[ソリッド化]モディファイアを設定し、厚みを付けておきます。

 

まず、目的のオブジェクトに[ソリッド化]モディファイアを追加します。設定は以下のようにしています。

f:id:aobayu:20190830144159p:plain

マテリアルインデックスオフセットが[1]になっているのがポイントです。またアウトラインの太さは[幅]の値で調整します。

次にアウトライン用のマテリアルを用意します。

f:id:aobayu:20190830144915p:plain

この時のポイントは本体のマテリアルの真下にアウトラインが来ていること、アウトライン用のマテリアルが裏面非表示になっていること、です。[ブレンドモード]を[アルファブレンド]にしておく必要があります。(その上の[裏面の非表示]でもいいかもしれません)

また、アウトラインの色は[放射]ノードの色で操作できます。

これでとりあえずアウトラインの描画は行えたはずです。

 

出したいところにのみアウトラインを描画する

次に、モデルの特定の部分にのみアウトラインを出す(出でほしくないところにアウトラインを出さない)方法をまとめます。

考えられる方法として、[ソリッド化]モディファイアの[頂点グループ]の設定によって場所ごとのアウトラインの太さ調整が行えます。しかし、頂点グループを使うと、ボーンアニメーションを行う時にボーンウエイトと干渉してしまうような気がして、個人的には嫌いです。(これを回避する方法はあるのかもしれませんが、、)

そこで、アウトラインを出したくない部分のみ別なマテリアルに設定することでアウトラインを回避します。

今回はスザンヌの右耳のみアウトラインを出さないように設定します。

f:id:aobayu:20190830151201p:plain

まず、[本体のマテリアル]を複製し、そのマテリアルをアウトラインを出したくない部分(今回は右耳)に適用します。

次に、写真のように透過シェーダのみを使用した[ダミー]マテリアルを[アウトラインなし]の一つ下に作成します。この時も[ブレンドモード]を[アルファブレンド]にしておく必要があります。

このとき、写真のようにオブジェクトのマテリアル一覧が

[マテリアル1]→[マテリアル1のアウトライン]→[マテリアル2]→[マテリアル2のアウトライン]

といった順番になっていることが必要です。(ソリッド化モディファイアの[マテリアルインデックスオフセット]=1を利用しています。)

これで不必要な部分のアウトラインを除去できるはずです。

 

出したい部分に強制的にアウトラインを描く

ソリッド化モディファイアでは出したいところにアウトラインを描くことはできません。

そこで、[ベベル]モディファイアを用いてアウトラインを描画していきます。

今回はスザンヌの目にアウトラインを付けます。

f:id:aobayu:20190830152109p:plain

まず、上のように、アウトラインを描きたい部分辺を選択し、[Ctrl+E]を押し、ベベルウエイトを[1]に設定します

f:id:aobayu:20190830152250p:plain

すると、その辺が水色にハイライトされます。

f:id:aobayu:20190830152651p:plain

次に、オブジェクトモードに戻り、[ベベル]モディファイアを設定します。この時のポイントは、[マテリアル]が[1]であることと、[制限方法]が[ウエイト]であることです。これによって先ほど設定したマテリアルで、ベベルウエイトを付けた辺にのみアウトラインが発生します。[幅]の値で、アウトラインの太さを調整します。

 

複数オブジェクトのアウトラインの色、太さを一括で操作する

アウトラインの色に関しては、同じ色のアウトラインを出すオブジェクトに同じ[アウトライン]マテリアルをセットすることで、そのマテリアルの放射ノードの色で一括操作できます。

しかし、線の太さに関してはオブジェクトごとに設定が必要になり、オブジェクト数が大きくなると非常に大変です。

そこで、blenderの[ドライバー]機能を用いて太さを一括で操作していきます。

f:id:aobayu:20190830153607p:plain

まず、操作用のシーン変数を設定します。プロパティウィンドウのシーンタブに移動し[カスタムプロパティ]→[追加]→[編集]から適切な名前と値を設定したプロパティを追加します。

f:id:aobayu:20190830154002p:plain

次にドライバを設定していきます。

設定したソリッド化モディファイアの[幅]を右クリック→[ドライバーを追加]をクリックし、開いたポップアップから、[ドライバーエディタに表示]を選択します。

f:id:aobayu:20190830154352p:plain

開いたウィンドウから、上のように設定を行います。初期状態では青四角で囲った部分の設定ができないので、一度[x]を押し、[入力値を追加]から新しく変数を作成しないといけません。現在のシーンを選択し、[パス]の部分には[ [”設定したシーン変数の名前”] ]を撃ち込みます。

その後、[依存関係を更新]を押します。

これで、先ほど設定したシーン変数の値を変えるとアウトラインの太さが変わるはずです。

f:id:aobayu:20190830154804p:plain

他のオブジェクトの線の太さを同期させたい場合は、先ほど設定し、紫色になったモディファイアの[幅]を右クリックし、ドライバーをコピーし、他オブジェクトの同じ部分を右クリックし、[ドライバーを貼り付け]を選択することで、同じドライバを設定できます。

 

特定のオブジェクトや特定のみ太さを調整したい場合は、ドライバーエディタ―の、[式]を、[ ver*0.5 ]などに設定することで、太さを調節できます。

 

シーン変数の方にさらにドライバを設定することで、カメラ距離に応じてアウトラインの太さを調整する、などの操作も行えるはずです。

 

ただし、この状態では、[ソリッド化]を用いて描いたアウトラインと[ベベル]を用いて描画したものとの太さに差が生じていると思います。そこで、変数を一つ追加します。

f:id:aobayu:20190830155729p:plain

次に、同じようにドライバーをコピー&ペーストした[ベベル]モディファイアの[幅]から、ドライバーエディタを開きます。

f:id:aobayu:20190830160003p:plain

上のように[入力値を追加]し、[式]を変更します、この時の値や式はシーンに合わせて適切に設定します。(スザンヌの場合はoutline_coef=0.5が最適でした。)

 

【blender】ボーンコンストレイント、IKが1フレーム遅れる、ラグがある件の改善

使用ソフト blender2.79

 

blenderで、IKなどのコンストレイントを使用したシーンを使っていると、なぜかコンストレイントを設定したボーンがその元となるオブジェクトの動きに対して1フレーム遅れて更新されることがあります。これはレンダリング時も起こってしまいます。

同様にタイムライン上をクリックして時間をとばすと、ボーンの位置がついてきてくれません。計算順序などの問題なのでしょうか?

f:id:aobayu:20190401213024g:plain

これを改善するためにいろいろ探した結果こちらに書いてありました。

blenderartists.org

f:id:aobayu:20190401213515p:plain

ここに✔を入れることで、

f:id:aobayu:20190401213612g:plain

改善されました。

【blender】効率的なクロスシミュレーションのベイクと、ベイクデータの部分的な差し替え

aobayu.hatenablog.com

※この記事は筆者の備忘録ですが、何か間違いや改善点があれば教えてくださると嬉しいです。

 

この記事でできること

blenderのディスクキャッシュ機能を用いて、

  • 長いシーンのシミュレーションベイクを小分けで行ったり、
  • 気に食わない部分のベイクのみを差し替えたり、
  • ベイクデータを確実に保存したり

することができます。

 

動機

blenderでアニメーション(キャラクターを躍らせるアニメーション)を作っていたのですが、どうにもスカートのクロスシミュレーションについて、とても不便な点が出てきました。

  • ベイクしないと途中から再生してもシミュレーションをプレビューできない
  • フレーム数がやオブジェクト数が多いと、鬼のようにベイクに時間がかかる。

    (6000フレームベイクしたいのですが、3時間たっても半分くらいしかベイクができていませんでした。

    また、はじめは10fpsくらいでしたが、後半は1fps以下というように後の方になるほど、長い時間がかかっているように感じました)

  • ベイクがいつの間にか消える。(おそらく間違って消してしまっているのですが、、)

 

そこで、複数のシーンを使って、クロスのベイクを効率的に行う方法を考えてみました。

 

用意したシーン

以前の記事で作成したスカートにクロスの入っているモデル【以下、メインシーン】

構造は下の記事の通りになっています。

aobayu.hatenablog.com

 

ここにステージ、もう一体のモデル、照明、シェーディング..etc.を追加していったらとても重いシーンになってしまいました。

 

何もないシーン【以下、tempシーン】

何もないシーンを、そのまま保存しておきます。保存場所はどこでもOKです。また念のためフレームレートをメインシーンと統一しておきます。

 

作業内容

 【メインシーン】のクロスのプロパティ画面です。

f:id:aobayu:20190331221222p:plain

 今回は、[30_skirt_main]という名前のキャッシュを作成します。(何らかの名前を付けておいた方が、後々わかりやすくなります。)

開始時間、終了時間を設定し、[クロスのキャッシュ>ディスクキャッシュ]にチェックを入れておきます。

ここにチェックを入れることで、キャッシュデータが blendcache_[blenderのファイル名] というフォルダに保存されるようになります。このフォルダはメインシーンと同じディレクトリに自動で作成されます。

このフォルダの中に、軽いシーンでベイクしたデータを無理やり入れて、ベイクを行ったとblenderに勘違いさせることが今回のメインです。

 

この状態で[ベイク]を押してベイクをスタートします。

通常ならこれでベイクが行われるのですが、このシーンでは非常に重く待てたものでないので、[ESCキー]を押してベイクを強制終了します。

 

次に、クロスオブジェクトと、衝突用のオブジェクトたちを【tempシーン】にCtrl+C、Ctrl+Vでコピーします。

f:id:aobayu:20190331222333p:plain

同様に、同じ名前のキャッシュセットが存在し、ディスクキャッシュに✔が入っているはずです。

この際、シーンに名前を付けて保存しておかないと、ディスクキャッシュができません。

 

とりあえず終了フレームを500に設定し、ベイクしてみます。作成されたblendcache_[tempシーンのファイル名] フォルダを確認すると、500個のファイルが作成されているはずです。

f:id:aobayu:20190331223142p:plain

これらのファイルをすべて、blendcache_[メインシーンのファイル名]  フォルダにコピーします。(すでにある分については、置き換えします。)

 

【メインシーン】に戻り、ファイルを保存し、再度ファイルを開くと、500フレームまでベイクが行わていることがわかります。

f:id:aobayu:20190331223454p:plain

青いラインが入っていて、ベイクが行われていることがわかります。

次に、【tempシーン】で[ベイクを削除]し、501~1000フレーム目までベイクを行います。

これを同様にコピーし、シーンを再読み込みすると、1000フレーム目までベイクが行われいます。

今回の500→501フレームのように、ベイクの切れ目ではどうしても不自然になってしまうので、カットの切れ目やクロスの形がデフォルトに近いフレームで切っていきます。

 

 

このように、blendcache_[blenderのファイル名] 内のデータを置き換えることで、長いシーンのシミュレーションベイクを比較的早く行うことができます。

また、シーンをプレビューして、気に食わない部分などかあったら、そのカットだけ再度シミュレーションを行い、ファイルを差し替えることも可能です。

(クロスのパラメータなどを変えてしまった場合にうまく渡せるかは未確認です。)

また、このフォルダをZipに圧縮するなどして保存することで、ベイクを安全に保護できます。

 

 

 

 

 

【blender】カメラに追従するパーティクルエフェクトの再現

※この記事は筆者の備忘録です。

 


【アイドルタイムプリパラ】華園しゅうか ライブシーンをヌルヌルにしてみた!@60FPS

こちらはアニメ”アイドルタイムプリパラ"のライブシーンです。こちらのシーンで使われている画面端のエフェクトをblender上で再現していきます。

test from aobayu on Vimeo.

 こんな感じになります。

用意するもの

カメラ :カメラはエンプティを親に設定しています。(個人的にはこうすると劇的にカメラが使いやすくなる気がします) エンプティは[0,0,0]、カメラは[0,-2,0][90°,0°,0°]に置いてあります。

f:id:aobayu:20190325225420p:plain

 

テクスチャ:とても見ずらいですが下の画像のようなものを三種類用意しました。(アルファを含んでいます。)

f:id:aobayu:20190325225131p:plain

パーティクル発生用オブジェクト:このようにカメラ視点にしたときにちょうどカメラのふちを覆うようなメッシュを作成します。位置や回転は適用しておきます。

f:id:aobayu:20190326005924p:plain

 パーティクルの作成

 発生用オブジェクトにパーティクルを設定します。タイプはエミッタで、レンダーをハロー、重力や速度の値を0にします。レンダーのマテリアルには以下のようなマテリアルを設定します。

f:id:aobayu:20190326013033p:plain

 

マテリアルの設定

パーティクルのハローに設定するマテリアルを作ります。(パーティクルのレンダータブで指定したマテリアルを設定します。)

マテリアルのタイプは[ハロー]、ハロータブの[オプション:テクスチャ]をONにします。また、サイズは0.01くらいに設定しました。

次に、マテリアルに三種類のテクスチャを設定していきます。

f:id:aobayu:20190326101824p:plain

 メインのテクスチャです。カラーとアルファを影響に持っています。

サイズ調整用のテクスチャです。テクスチャのタイプは[ブレンド]を使用しています。

また、マッピングを[ストランド/パーティクル]に設定することで、それぞれのパーティクルの発生時間から消える時間まで、画像の左端から右端へと移動するテクスチャを作成できます。

パーティクル発生時→黒、アルファ0

消える時間(パーティクルの寿命で設定)→白、アルファ1

これをサイズにのみ影響を与えるようにすれば、ハローパーティクルのサイズがだんだん大きくなるアニメーションになります。(アルファの値をサイズにしているようです。)

また、このままではハローのサイズが多く過ぎるので、影響:ブレンド値を低めに設定します。

 

f:id:aobayu:20190326103046p:plain

同じように、はろーのアルファ値を時間変化させるテクスチャを用意します。このテクスチャによって、ハローパーティクルがフェードアウトするようになります。[影響:アルファ]にのみチェックを入れます。

これらの作業を行うと、以下の画像のようなエフェクトが出来上がります。

 

カメラ追従設定

このままでは、カメラが移動すると、ハローパーティクルは取り残されてしまいます。

ここで、パーティクルの設定から、[レンダー>親]をカメラの親にしているエンプティに設定します。(工夫すればカメラを親に設定しても実現できます。)

f:id:aobayu:20190326122228p:plain

こうすることで、パーティクルはカメラの方向に合わせて移動します。

ただ、現段階の実装では、カメラの親エンプティのサイズを変更すると、パーティクルのサイズが相対的に小さくなるという問題があります。

これによって、最初の動画のようなシーンになります。

 



 

【blender】クロスとボーンを使ったスカートのアニメーション

※この記事は筆者の備忘録です。なにか間違いがありましたら指摘してくれると助かります。

使用ソフト:blender2.79

動機

スカートの物理シミュレーションをボーンにベイクして、アニメーションとして出力したい!(Mayaにもっていきたかった)

そこでいろいろ試してみたのですが、

MMD→剛体の設定は非常に簡単だが他の面で思い通りのことができない、、リグが組めない、、

blenderで剛体+ジョイント→うまく横ジョイントが組めず貫通を防げなかったため挫折、、

 

必要なオブジェクトの設置

今回スカートのシミュレーションを行うモデルです。

(キラッとプリ☆チャンより歩堂デヴィ)

すでにスカート以外にはボーンが入っています。

f:id:aobayu:20190320002634p:plain

このスカートに物理シミュレーションを設定していきます。

まず、ベースになるクロスと、衝突用オブジェクトを用意します。

f:id:aobayu:20190320095512p:plain

スカート内部と、太ももの衝突用オブジェクトです。これらのオブジェクトは、オブジェクトコンストレイント[チャイルド]を用いてボーンに追従させています。

f:id:aobayu:20190320003128p:plain

ベースになるクロス用オブジェクトです。プロパティウィンドウのオブジェクトタブから、最高描画タイプをワイヤーフレームにしてあります。

 衝突用オブジェクトには、プロパティウィンドウの物理演算タブから、[コリジョン]を設定してあります。また[ソフトボディとクロス]の[外側]は0に設定しておきます。

 クロスの方は、クロスシミュレーションをONにし、下の写真のように設定した頂点グループ[pin]を[クロス>ピン止め]に設定しておきます。また、こちらも[チャイルド]コンストレイトを使用し、キャラクタのボーンに追従するように設定しています。

 また、クロス用のオブジェクトの縦向きの辺の数はボーンの数と一致します。ですので、程よいポリゴン数でオブジェクトを作成しましょう。

f:id:aobayu:20190320003825p:plain

 その他の設定は、後から行います。

 

アドオンを用いたボーンの設置

次に、クロスに追従するボーンを作成します。

今回、こちらのアドオンの助けを借りることにしましょう。(ありがとうございます!)

dskjal.com

こちらにある、GitHubへのリンクからアドオンを入手し、有効化します。

 

クロス用のオブジェクトを選択した状態で、3Dビューのツールタブ内の[ツール>Setup skirt bones]の[Setup skirt bones]をクリックすると、ボーンが作成されます。この時点で、アニメーションをスタートすると、ボーンも一緒に動いてくれるはずです。

f:id:aobayu:20190320004821p:plain

この際、[ctrl+a]でクロス用オブジェクトの[位置,回転,拡大縮小]を[適用]してからボーンを設置しないと、おかしなことになります

 作成したボーンを、[ctrl+j]でキャラクタのメインアーマチュアと結合し、スカートボーンの一番上にあるボーンの親をhipボーンなどに設定します。

ここで、タイムライン[0]からアニメーションを開始すると、キャラクタのアニメーションに合わせてスカートが動きます。

f:id:aobayu:20190320005830p:plain

ctrl+zを押したりすることで、このようにボーンがおかしくなることが多々ありました。タイムラインの0にしたり、その状態で←キーを押したりすると元に戻ります。

 

クロスのパラメータ設定

最後に、クロスのパラメータを設定していきます。

今回は、下のように設定してみました。

f:id:aobayu:20190320104915p:plain

 衝突用オブジェクトと、クロスのみを表示し、動きに合わせてプロパティウィンドウ>物理演算タブの値を変更していきます。(このセットアップは、クロスプリセット:Leatherをベースに作っています。)

 また、スカートの下の方に行くほど、柔らかい動きをしてほしいので、左のように頂点グループ[pin2]を作成し、これをクロス剛性スケーリングに適用しています。

 

このように設定し、アニメーションを行うと以下のようにシミュレーションされます。

f:id:aobayu:20190320105841g:plain

 まだ少しメッシュがおかしくなってしまっていたり、動きがいまいちな部分もありますが、とりあえずは動いてくれました!必要に応じて衝突用オブジェクトを増やしたり、設定を変えたりして、狙った動きになるようにします。

 これをボーンアニメーションとして出力すれば、ほかのCGソフトやUnity などにスカートの動きも含めたアニメーションを出力できるはずです!

 

 また、現在は

クロスシミュ→IK→ボーン→ウエイト→スカート

という構造ですが、

クロスシミュ→IK→ボーン→ウエイト→スカートを覆えるサイズのダミーオブジェクト→メッシュ変形→スカート

とすることで、さらに綺麗に変形することができるかと思います。