今日こそやるぞ5日目(いやもう休む)

今日こそやらないページ(サービス潰れて移転五回目)

パーカー作成はじめ&色調整 +ちょこちょこ追記 4/18 5/06  5/15 6/01



前の日記だと「シェーダーからはじめようかなぁ」とか言ってたのだけど
よくよく考えたらMMMv2の正式配布&エフェクトまわりのマニュアルみたいなの出てからのほうが効率よくないです?って思い直したので
パーカーとかから作成始めることにして現状

まだからだ側面~背中にかけてのシワを作ってる所だけども
それができたら細かい箇所とか追加パーツ的な部分(パーカーから垂れるうさ耳だとか)を作っていくつもり

今シワは体の下に入れてある一本だけはシェーディングのエッジがもうちょっと鋭くなるようにポリ分割ついかしてあるけど
そのほかの腕とかは柔らかい感じになってるのは
一応は体の鋭いシェーディングになるようにしてみようかなとさっき思った
セルシェーディング的にはそのほうがきっちり出てくれそうっていうただの妄想なんだけども

現状でもおおまかなベース形状としては細腕に張り付くぐらいの感じでパーカー越しでも腕の細さがわかる感じとか
身体部分のパーカーのフンワリ感とかはそこそこ出てるんじゃないかなぁ―と思いたい……

手順としてはいまスクショ張っているモデルのシワのない状態をまずポリゴンで作って
スカルプと機能でざっくりシワ乗せてみて形状を吟味して
あるていど納得言ったらとってあったもともとのモデルの方にポリゴン追加する形でスカルプとしたモデルの形状をトレースするみたいな流れ(スカルプと形状からリトポロジーだと特に触る必要性感じないところまでポリゴン貼り直しだし……)にしたけどもどうなんだろうなぁ……
なんかこうすげー効率いいっすよこれ!みたいなワークフローないのかなぁとか



あとは色合い調整を
なんか投稿してから今更「うん、本家のゆかりさんといろいろ全然色具合違うよね?」とか思ったので(なんで疑問に思わなかったんだろう?)
髪の毛をもっと白くて薄い紫に
眼の色がいろいろいじっているうちに青っぽくなってたのをこれまた紫に
髪の色が白くなった分肌も白く

それとは別にお腹のテクスチャラインや手書き影の濃さを結構薄くしたりとか
(感想的なの見つけると(動画投稿した時のコメでもあったんだけども)筋肉質みたいなのがあってべつにそれはそれで悪く無いとは思うんだけど今回はそっちを目指してたわけではないはずなので……ちゃんと柔らかい女の子の体にみえてくれたらなぁ……とか)

MMDだとシェーダー?というかToon用の画像ファイルとかスフィアマップだとかをさわってウンウン唸ってたんだけどとりあえずこんな所でもうちょい本家イメージに近づいたんじゃなかろうか
(こっちは後ほどシェーダーもやってみるつもりだからどうなるやらなんだけども…)




MMMv2上での現状(シェーダーエフェクト類はまだなし)

なんかこうMMDのほかのゆかりさんのモデルってもっと髪の毛が複雑な色味で色的な情報量多いんだよなぁ
でもセルシェード的な表現でそれってできるのかなぁとかやってた挙句に
「うん、もういいや」
みたいな……(根性なし)


その他にもちょいちょい「一段階落ち着いてからみると駄目だこれナンデ見落としてたのナンデ!」みたいなのがあるっぽいので
パーカーとヘッドセットまではついた状態になったらそこも調整とか修正とかしたい……
ほら水着にシワなかったりね
シワでエロさかわってくるだろうになんでしてないの俺……(パーカーのシワ作りだしてから気づく)
水着のフリルとかもできればなんとなーくの形状じゃなくてフリルみたいなのにしたいんだけど
テクスチャで抜く方式だと今回やりたいことと馴染まないしかといってそんなもんポリゴンでいちいち作ってたらとんでもないことになるしうーん……

しかしなんかすごい久々に1からモデリング的な作業始めたけど
この段階だとスクショ貼れていいなぁ……
なんか調整調整みたいなさぎょうだとスクショ貼ってもさぁ……みたいな……

まぁできるだけ細かく進捗は書いていこう
じゃないとダラダラしてしまう&その時思ってたこと忘れる……

16/04/18追記





一応パーカーはモデル的にはできててウェイトとセルシェード用に法線をすこしいじらないとかなーという感じで
腰、右腕のアクセサリとインカムまでを一応モデリングしていま調整中というところ
(いい加減一度進捗を残しとかないと自分で忘れなうなそうなので追記でメモ)


髪の毛に隠れてるけどインカム
大本の資料がないからどんなデザインなのかわからなくてもたもたしてたのに
結局ある程度オリジナルでいいやでもどうしようとかもたもたしてからの
うんまぁこれでいいやっていうグダグダ加減……
なんかもっとこう各パーツの接合部ただぶっさすだけじゃなくてなにかしたの形状作って説得力持たせたいと顔もてったはずなのにコレだよ……
いや流石に腰パーツのバランス調整ももうちょいあるから
それ含めて来週ぐらいにもうちょっとなんかするかも
もうちょい
うn……



05/16




UV展開してライン引き中
髪の毛ほどではないにしてもそうとうライン引く箇所多くて
そうなってくるとUV真っ直ぐにしないといけない箇所やそうするために分割考えなきゃいけない箇所多くて結構疲弊した……

ただそれだけでなく髪の毛だけでなくてこういう箇所増えてくるならもうちょい効率いいやり方考えないとなーとかで一応程度はやりやすくなったのでメモ

UV展開までは相変わらずコツコツやるしかないんだけど、そのあとは
ピクセルスナップを外して上下に0.5ピクセルづつずらす
その後は上記画像のようにblenderのUV/画像エディターのほうで鉛筆&ラインで線をペイントしていく

blenderでペイントするための機能で参考にしたのは以下
http://buildinginblender.blogspot.jp/2015/11/tipstexturepaint_8.html
とくにカーブをいじってボケ幅のない鉛筆ツールてきにするのと
ストローク方法でラインに変えると直線ツール使えるっていうのを知らなかった


え?そんだけ?ってぐらいのワークフローなんだけどこういう手順じゃないと何が厄介かって言うと
まず線を引いたところだけ0.5ピクセルずらそうとすると箇所が多くてそれだけで手間かかるのでもう全部ずらしたほうが早いしそれで問題ないっていう
逆に色の境目とかでちゃんとピクセルスナップしていて欲しいところもあるので
(上の画像だと紫色入れている部分)
そこは逆にスナップしなおさなきゃいけないけどライン引く箇所に比べてそっちのほうか箇所少ないのでこっちのほうが手間が格段に少ない

こういう感じに必要なところだけスナップし直す
黒線部分は0.5ピクセルずらしでライン入れ、紫はラインでなく色分けなのでピクセル吸着でずれのないようにしている

でそのあとblenderで線を入れたほうがいい理由は二つあって
UVをフォトショップに持って行った場合、UVのラインが1ドットの幅を持っちゃうせいで
その一ドットに重ねて書くのと、一度っと横にずらして書くののどっちが明確に外側に線が入るのかを
一々blenderに読み込みなおして確認しないとはっきりしないのですげーもやもやしたまま作業進めないといけない&間違ってたら同然修正しないといけない



こういうのがblenderのUV・画像エディターならUVは画像データじゃなくて普通にソフト上のデータなので(もう一つひとつ上のblenderとのスクショで比較すればだいたい言いたいことわかってもらえると思うけど)
こういう細かい判断を全箇所でやるっていう手間とか思考が省かれて普通に入れてけば良くなる

もちろん線を入れること自体は選択範囲の四角形とか考えればフォトショップのほうが断然楽なんだけど
それを考慮しても上に上げた手間や思考のめんどくささのほうが断然上すぎるのでこっちのほうがいいと思う

副産物としてblender上の作業でやっていけるから線引く場所が3D上でどこかすぐ確認しながらできるってのもあるし
(今の場合だと凹みは黒線、出っ張りは白線にしてるからそういう確認がすぐできるかどうかというのもだいぶ作業負荷に関わってくる、多数あるライン引く場所のUV上での場所、どっちを引くかを覚えとくというのもめんどくさすぎる話だし……)
UV展開自体もちょこちょこずれたり、これじゃ線引くのに不都合あるじゃん!って感じにミスってる場合もあるので
そのときもすぐ修正していけるのもデカイとおもう
(従来通りだとフォトショップで気づいてからblenderに戻って修正したらUVガイドを画像として吐き出し直して今のPSDにレイヤーとして持ってきなおして、というのを一箇所いつけるたびにやんないとだし……)


ただこのやりかたでもまだ手間なのと
人工物的なラインの太さ全部一定の箇所ならこれでいいけど、
自然物的なラインの太さ可変させていきたいようなやつだと一律0.5ピクセルずらすやり方(それでうまれるラインの太さ)だと厳しい場合あるかなーと思うので
もうちょい効率のいいやり方はまた考えていきたい

とはいえ、とりあえずは無策にがむしゃらにやるよりは多少マシになるワークフローだとおもうのでメモだけ残しとく


そのほかとしてちょっとした溝部分に関して
そういう造形の部分はポリゴン押出でつくるラインで埋まっちゃってライン色で塗りつぶされちゃう感じなので
その部分だけポリゴンラインが出ないように処置もしたのをメモ


左みたく溝とラインの太さに寄っては完全に埋まっちゃうのを
溝用のマテリアル(及びそのひとつ上に配置したそこから押し出されたポリゴンに適応されるマテリアル)でとりあえず透明にして消してる
(最終的にはマテリアルからのポリゴン選択で透明にしている部分はポリゴンごと消す)
そこには当然ラインでなくなっちゃうんだけど埋まっちゃうより断然マシ&溝自体が埋まっちゃうほど細いから途切れるラインもちょろっと程度だからこっちのほうがよさげ


あとは腰アクセサリパーツのバランスが普通に設定がと比べてズレまくってたのでその編集せいしたら
今度はパーカーのふんわり広がるボリュームがまただめだったので修正したのもメモしとく

さすがにこれで形状的には大丈夫なはずなのでテクスチャというかラインを入れ終わったら
やっとこウェイトに入れるかな……


05/15

一応残しといたほうがいいかなと思ったので追記

ウェイトはPMXに持って行ってどうなるかわらないけど一応ウェイト完了
パーカー、アクセサリーとともにう追加した専用の骨とその骨のウェイトが割り当てられるだろうポリゴンだけ分離して一度自動ウェイトつけたものをすこしスムースしたあと
従来の骨で動く腕だとか背中周りだとかは体からウェイトコピーして
分離したポリゴンを結合しなおし&接合部分をまたウェイとスムースさせておしまい……
肘だけ中身がはみ出すのどうしようもないから
PMXでは材質モーフでパーカー表示時は中身の腕は消すことにしたけども

やり方がよかったから簡単に行ったところもあるだろうけど
今考えるとちょっと簡単すぎてなんかミスってそうな気がしてきた……ちょっと確認しよう(弱気)


でパーカーと水着の方にもついかもでりんぐしたシワだけど
どーにもシワのシェーディングがきっちりつきすぎて筋張った何かにしか見えないので
自作のノーマル編集スクリプトで多少スムースかけて緩和してみたり



モデリングした状態



スムース……なんかなくても良かった気がすんね?ってぐらい弱めちゃったなぁ……

ボリューム的な形状とかには残ってるから無駄ではないと思う&上の画像ぐらいきっちりシェーディング入る状態だとセルシェーディングでもあんまよろしくない感じではあるんだけどもどういうのがベストなのやらわからん感じ……

あとMMD、MMMってシェーディングエフェクトかまさないとノーマルマップとか貼れないからってのもあってモデリングしたけど
普通にやる場合ならシワはスカルプとしてノーマルマップを転写して貼るほうが
シェーディング的にも工数的にも全然いいと思う


MMDとかMMMでもシェーダー各自もっと自由にいじれてキャラクターなどのモデルデータに保存できればなぁと思うけど無理な話か……


この辺はメモってのこしといたほうがいい予感がなんとなくしたので一応更新
やっと再出力工程に入ってPMDの追加設定だけど今日は寝る


6/01
一回出力してみた所パーカーのウェイトが駄目すぎて
そっから土日にパーカーウェイト作業ばっかりしててもう一回再出力したけど
ダメすぎというれべるは脱したもののまだウェイトの不備があってうごごごご
気分転換にもう一回水着の法線編集したのでメモ

上の5/15の状態よりはいいんじゃない?みたいな
5/15の状態から一度全体的にぼかすのやめて3Dの頂点ペイントであまり強く出したくないとこだけぼかすみたいなこともしてたんだけど
そっちはそっちでシワモデリングした分頂点密集してボカシが気分よく処理されない感じだったので
結局からだとか髪の毛(おさげ部分)みたいに一度画像に出力して
フォトショップのほうでノーマルマップテクスチャとして処理してから出し直しっていう
めんどくさがらず最初からこうしたらよかった……


一応使ったノーマルマップ
左上がモデリングそのままのシワつきノーマルマップで、右上のが体からの転写(体に張り付くような陰影にしたかった)ののノーマルマップで
それを一部ぼかし加工したりしつつ重ねて作ったのが左下
(UVはノーマルマップ加工用に仮展開しなおしたもので、ここから頂点色に焼き付けてからさらに本村式ライン用に展開したモデルに転写しなおし&自作スプリクトで頂点法線に変換みたいな工程)
胸側のシワがどうにも悪くはないけどもうちょいうまくやれればエロさでそうなのになーとか思いつつ
まぁとりあえずはコレで行こうと思いましたマル

パーカーのウェイトがうまく直ったらその辺でもう一回追記更新
いや流石にそこまでいけたら水着パーカー状態で一度配布できるだろうから新規記事かなぁ……

ようやっと配布開始……




YOUTUBEで配布されていた海外の方?が作成したモーションながしこんだところから一枚スクショとって配布時の現状をとりあえず晒し

配布中のニコニコ立体のページはこちら
http://3d.nicovideo.jp/works/td24997


それで前回の記事からながながグダグダ調整してた箇所を追加メモ



ひとまず顔周りは前回記事でもちょこっと書いた
「物理演算で髪の毛が広がってなんか絶妙によろしくないところで顔の輪郭が隠れるようになってなんか形状がこれじゃなく見える」みたいなのを髪の毛の物理演算調整して広がり抑えつつも結局顔のエラあたりの位置も調整したりして前よかマシになった気がしてる


あとはフェイシャル、体ともにボーンのウェイト修正を地味にちょこまかとやってた気が……
顔は調整というよりはなんかいじってたら一度変になってそこだけ付け直したとかそういうレベルだったかなぁ……

あー、口内だけポリゴンの割りとウェイトををほっぺたに合わせて口を大きく広げた時にも口の端にいびつな変形が見えることがないように修正したんだった


←の旧形状だと口の端の口内の赤い肉のポリゴンがうまく変形できてなくて
歯や舌が隠れちゃってるけど
→の修正後だとスッキリとみえる
(←はそれ以外にもミスってたとこがいろいろ見えるけどそこは特に何もなく普通に修正しただけなので割愛……)
ある程度リアルなシェーダーかけると口内ムダに広いのがわかっちゃう気がするけどもセルシェードならこっちのほうが正解だと思う多分

体に関しては肘と膝が一段階ほどマシな片気になったと思う
後体前に曲げた時にお腹がやたら凹んで潰れてたので補助ボーン入れて潰れないように
とりあえず行き当たりばったりで補助ボーン入れてるすぎるのだけどいいんだろうかこれで……
あとは脇とかの一部の本村式ラインがボーン変形時に伸びて太くなっちゃってたのを抑えの分割入れて伸びないようにして
股間周りももうちょいマシにならないかとグダグダいじってたけどあんま変わってないかなぁ……
悪いわけじゃないと思うんだけど理想的な感じにはならないし補助ボーン入れるにしてもどういうの入れたら良くなるかさっぱり思いつかないし……
(そんなの思いつくならとっくに誰かがやっててその方法が広まってるって話もある)

余談だけど股間周り他のMMDモデルどうしてるのか気になって調べたけど
下半身のパンツ的な面積部分は下半身ボーンに完全関連付けして足の影響受けない
その際の歪みは太ももまわりでなんとか受け止めるみたいなウェイトの付け方が多めな感じだったなぁ、なんかみんな苦労してるんだなぁここはという感じ……



変形周りはそんなところであんま工数かかってない割に変化あったのがシェーダー周りかな
と言ってもスフィアマップ作って貼ったのとtoon用の画像を解像度上げたの自作して境界線もうすこしかっちりでるようにぐらいなんだけども
とりあえず水着はセルシェード以外にもスフィアマップ側で少しだけ陰影が入るようにしてみたり

以前この動画見かけてから思ってたんだけど(この動画ではもろにパンツだけど)
こういうところで質感が違うとその違和感から視線誘導できてエロさが一段上がるなとか思ってはいたので

その他に水着のフリル部分もセルシェードオンリーだと形状がほぼわかんないかんじだったので同じくスフィアマップで陰影を少し+してはみてる……

後一番変化出てるのが髪飾りと髪留めまわりかなー


ロゴマークもうっすら入れたり……
スフィアマップ貼っても最初はあんまよろしくない感じだったので
Blenderがわのでシャープをもうちょい細かく入れるとの修正もしてる
あとガラス?カバー部分のスフィアマップは透明度を乗算していれる仕様に
というかこの辺の作業してて偶然Webでページみつけたんでやったけど
スフィアマップで透明度の影響いれれるのね……MMD(いやMikimikuMovingだけども)

でスフィアマップに透明度入れれるのならもしかして、とか思って今週急遽試したのが
「0.5mmほど肌から押し出した薄皮みたいな真っ白なポリゴン用意しとけば
 セルシェード用にいじっちゃった法線とは別に本来の形状のほうでスフィアマップのハイライトだせるんじゃね?」っていう
これがすんなりうまく言っておかげで前回の記事では「諦めるかぁ」とかいってたTad式にはいってるような縁にハイライト乗る表現とカスタム法線でのセルシェードコントロールの両立ができた
情報としてはあまり目立たないのにこれだけで絵面が一段リッチにみえるようになるので
ほんとにありがたい
自分でもよく思いついたなとか思ってしまうレベル


同じ容量で眼の表面にも薄皮をかぶせてすこしスフィアマップのハイライトが乗るように
(こちらは中央の瞳孔や黒目の外側には被ってほしくない%ブッツリ消えてほしくもないので
予め普通のテクスチャの方でそのぶぶんだけアルファで削った上でさらにスフィアマップでという形にしてる)


←がスフィアマップありで →がなし
目は正直微妙なレベルだとおもうんだけどどうも黒目の上側の色合いが濃いため
下を向いて黒目の下半分が下瞼で隠れちゃうとほぼほぼ真っ黒な目の印象になっちゃうぽかったので
なんとかハイライトとかの情報が乗るようにしたかったというところ……
(目のテクスチャの色自体も弄ったり、目のハイライトは黒目本体よりずれて動くようにしてみたりとかもしてみてたんだけどそういう合わせ技で改善してたらいいなぁ……(改善したとは言ってない))
ついでに黒目のスフィアマップがいい具合になるようにこれまた黒目より一段Rがキツ目のポリゴンスフィアから法線転写してたりとかしたり……
(逆に白目は変な影入ることあったのでこれまた本来の目の大きさならこのぐらい?みたいなスフィア置いて法線転写してみている……一応改善したはず……)
唇にも試しに少し入れたんだけど(唇にテカリが入るとセクシーにならないかな―とかおもって)こっちは効果あるのかないのか謎な感じ……
邪魔にはならないからのこしてはあるんだけど……
(いい加減投稿しないとアレだったのでこんな感じだけど後ほど調整したい……)

ただこの個人的にナイス!っておもった薄皮戦法(なんか今週脳内に「コン○ームみたいだな薄い皮とか」とかいう電波が降ってきたのは関係なしに)、
ニコニコ立体のビュアーがスフィアマップのアルファ乗算には対応してなかったらしく
上のアドレスのビュアーでは状態が見れないので注意……
(その他にも髪の毛の物理挙動が違うせいで髪型が一段潰れたようになってしまったのでビュアー用のはそちらも物理削ったりしてる)
ダウンロード用のデータにはちゃんと入ってるので興味持っていただけたらMikumikumovingV2(で自分はは確認してたもんで)でみていただけたらなぁ、とか……



逆に諦めたというかもうこれ以上やってたら3月どころか4月になっちゃうよう!みたいなようするに諦めたところもあって
煽り構図用の顔変形モーフを用意しとこうとおもったんだけど
顔周りのボーン的にはそこそこ自由にいじれるのである程度やれると思ったんだけど
自分の画力のほうがなさすぎて「え?煽り構図時の漫画とかアニメとかの顔のパーツの配置バランスってどんなん?」みたくさっぱりわからなくて「これじゃない」みたいなのしかできなかったので一回諦めた
これは後から挑戦して追加したい……ってかこのぐらいできないと駄目な気がする(3Dモデル的にでなくて自分の脳力、画力的なところにおいて)


ほかにも細かいところはあるけど大まかにはこんな感じかなぁ……

次は多分MMMv2用のシェーダーエフェクトすこし触っていくと思う
以前の記事で「これできると思ってたのにできない」って言ってた影が二重にならないようにする奴がちょっとだけ光明が見えたじょうたいなので
(ただちょっとだけなのでやっぱ俺には無理とか諦めて服作り始める可能性大かもなぁ……スフィアマップとの兼ね合いとかも処理しないとだし……)

一度動画として投稿してからの更に修正中メモ

一度MMDモデルとして吐き出してそこそこ動かせる所まで来たと思われたので
動画として投稿してみた



でここまででいろいろとまたかさばってきて忘れそうなのでメモ

とりあえずやりたいことはそこそこ仕込めた気がするけどもできなかったこともあるので
(今そう思ってるだけで実はできるのかもしれないけど)その辺のまとめ

・表情をボーンで動かす

これは一応出来た
ただMMDではボーンのスケールアニメーションは対応してなかったらしくて(地味に知らなかった)
目の拡縮、歯の大きさ調整みたいな部分だけは頂点モーフのデータとして作りなおした所

あとはエロ可愛いを目指したはずが上の動画であんまり可愛いみたいな感想もらえなくてぐぬぬってなったのもあってボーンである程度顔のバランス変更してみたりとかも今週やってた
(コメントの内容自体はネガティブなものはなかったのだけどなんかこう思ってたのと違う!というか……)


初めてのフェイシャルボーンの仕込みにしてはこのぐらいまでできるのならわりかしうまく行った方ではなかろーかなとかなんとか思ってみたり
(ボーンモーフとして登録してるのでざっくりとロリ顔バランスにできるはず……?)
ただ目の大きさが変わるとまばたきモーフで目が閉じきれなくなったりするので
通常時に若干強めに目を閉じて
上の画像の最大時にもギリギリ目が閉じれるようにしてみたり……


口もこのぐらいまで広げても大丈夫な感じ?
まだこの状態で動かすとかまではできてないから確定ではないのだけれども
(口の端だけ今調整中のモデルはウェイトミスってるので黒溜まりがあるけども

関係ないけどモデリング上での顔の輪郭はこんなもんかなと思っているんだけど
上の画像見たく内部の髪の毛でそn輪郭が一段削られた時の感じがなんかもうちょい……
ここ調整したほうがいいなとか今思った来週やろ……


目の位置や角度も動かせるのである程度カメラ似あわせて嘘ついた絵とかにもできるはず……?
でもいま自分で試しにやってみようとしたら画力がなさすぎて
「このカメラ角度なら目の位置はこう!」とかできない過ぎた


←がこのカメラ角度用に顔のボーンいじってみたやつで
→がこの顔を正面からみたいな奴だけど
(口の端の黒いのは上でも書いたけどウェイトミスってるので後で直す)
CG雑誌とかのセル系のメイキングで見る奴ってこういうのでいいのかなー……
作った本人が使いこなせないとかダメすぎる……
(あと口はこれ以上広げると黒い端が出てきちゃうみたい?
そもそも論外にウェイトミスってる場所とは別に正面からだとちょこっとみえちゃってるけども)




ついでなのでMMDのモーフで困った点についてもメモ
困ったというか単にカルチャーショックなのかもしれないけど
あんまりモデルごとに共通したモーフってない感じなのねMMD
見る専だから知らなかった……
あいうえおと目の瞬きと涙、照れ、青ざめぐらい?眉周りは共通してはいるけどそもそもバリエーションがすくないみたいな?
目とかでもハイライト消す系は大体のモデルに実装されてるけど名前が違ったりとか
体の骨ほどしっかりした共通ルールない感じなのねっていうのが

ちょこちょこいろいろな表情の流しこみに対応できるようにとモーフ増やしては見たけども
このモデルの事だけ考えるなら最低限のボーンモーフだけ置いて
これ以上微妙な感じ触りたかったら3Dビューで直接おさわりくださいのほうがデータとしてはスックリして使いやすい気がしてる……



・ライン関係

テクスチャに引くラインはギルティギアで言われていた本村式ラインというのにするというのは一応やったことはやったけどクオリティ的にどうなのかというのはさっぱり……
(ほんとやっただけ)
以前も書いたかもだけど髪の毛周りがほんとにめんどかった
これは本村式ライン用のUVだけでなくてウェイトとかも
ちょっとモデル作るときに考えなさすぎた

そうそう本村式ライン確かに法線反転ポリとのラインの違和感というか感じ方の違いはぐっと減るんだけど
それでもテクスチャに書いた情報だってこと意識しておかないと
実際動かした時にラインがすげー伸びてむっちゃ太くなったりする
自分のモデルだと特に尻の下に入れたラインが伸び方ひどかったので
ラインの周辺に分割追加してウェイトであんまり伸びないようにした



贅沢言えば足関節曲げた時に消えるのがベストなんだろうけど……この位置のラインは


あとは押出のラインの方も厚みの強弱をつけるということを一応やった
これも自己満足範囲内ではいいかなという感じ
(だからラインはMMD、MMM上の材質設定じゃなくてモデルとしてblenderから持ち込んでる)
一応自分の中でラインの厚みの法則はあって
柔らかさで太さ、
かかる力で(慣性や重力など)で太くなる方向、
弾力でその太くなる力にどれだけ抵抗するか(弾力が弱い場所だど重力方向(下)にしか太くならないけど、弾力があるものなら上方向にも太くなる、みたいな)
みたいな基準でつけた

ただラインはもうひとつ目指してたのがあってラインに物理演算付けて動きによって太さが少し変化するというのがしたかったんだけど
(上の「太くなる方向」に慣性とそれに抵抗する弾力を考えてたのはこれがしたかったからで)
これはMMDでのウェイト数が1頂点に付き4つまでのところを普通の体で一杯一杯なのに
この上各場所にライン物理演算用の骨仕込んでそっちとのウェイトの兼ね合いとか無理!とかおもったので一旦諦め中
作業量も半端なくなりそうだし……
ソフトボディとかいう機能があるのでそっちで簡易的に出来たりしないかなーとか思って入るけどまだ調べてない……


・各種揺らし

一応胸と尻は揺らしたいというのは仕込んだんだけど
あんまりプルプルするのは個人的な好みに合わなかったみたいで
ゆっさと一回揺れる程度になった感じ?あんま目立たないかなーと
実際動画でもおしり揺れてエロい!みたいなのはなかったしこっちも自己満レベル
胸はAH式とかいう仕組みを組み込んでは見たもののよくわかってないので効果あるのかどうか……

髪の毛も当然揺らしてるけどこれは他のMMDモデルよりふんわりとする感じになっているとおもう?
というか他のMMDモデルの設定パクってみたけど自分が思った感じに
ならなかったのでこっちのほうがいいかなみたいな……?
三者から見てどうなのかは不明

お腹もすこし揺らしたら柔らかさとかでないかなと思ってちょっとさっきまで触ってたんだけど
お腹が凹まないように補助ボーン入れたのとの兼ね合い考えるときつかったので諦めました

頬も一応程度に揺れるようにしたけどこれも微妙にしすぎて意味あるのか不明

・シェーダー関連、法線含む

これ前々回の記事ぐらいでblenderスクリプトまでくんどいてなんだけど
MMDに(正確にはMikuMikuMovingの方だけどMMDのほうも調べたので両方)影の色をテクスチャでっていうシェーダーないのね……
(逆に見逃してて「そののぐらいあるわ馬鹿!」だとすげー嬉しい……)

おかげで手書きの影とシェーダーの影が二重影になっちゃってて想定した事ができてない……


比較画像だけど(ライトの位置が違うとかあるのは申し訳ないけども)
←がMMD(というかMMM)でのシェーディングで
→がblender上での実際MMDでもいい感じのエフェクトが転がっててできるでしょー!とか思い込んでたシェーディング

髪の毛の手書き影とか首下あたり見てもらえればわかるけども影が二重になってる
(どういう構造でこれを表現しようとしてたのかは過去記事にあるので割愛)

ただこれに関してはMMMv2でカスタムエフェクトなるものがあって
ノードベースでシェーダーが少しいじれるらしいのでそれでなんとかならないかなーとか思って
カスタムエフェクトのマニュアルを全裸待機中
それでも無理なら妥協しやす……
(最悪シェーダーのスプリクトかけばいいんだろうけど自分の頭じゃ偶にpythonかじるので精一杯すぎて……)

あと顔の法線に関してもさっきもう一段階いじり直した(上の動画ではまだ直してない)
MMDにもってきて動かすと意図しない角度でライトあたってこりゃいかんみたいなのがちょこちょこあったので調整しなおし
何処まで対応できたのかこれまた自己満レベルで謎なんだけども……

顔側面の領域作って
各領域の法線微妙に緩やかにしてたのをかなりまっ平らにした感じ?
前よかマシな結果になりやすくなったと思ってるんだけどまだ今日作業したばっかりだから日にち立ったらどうなるか……
ただ一番上の動画の状態よりかは良くなったと思う
動画の時の状態だと頬のラインに抉れたように影の分割ラインがはいるもんだから……

逆にこの顔の法線弄ったおかげでTda式とかでやってる輪郭にハイライトが乗るのは無理になったかなーとか思ってる
緩やかな形状なら端だけにハイライト乗るんだけど
面としてべったりしたノーマルだからハイライトもべったり乗っちゃう感じ……?
あの要素あったほうが一段絵としてリッチな感じになったとおもうのですごい残念……

という感じでシェーダー周りはイマイチ思ったことにたどり着けてない感じがあるきがする……
(完全に自分で映像作るのなら普通の法線のモデル出してそっちでハイライト素材だして後で合成すればいいじゃんってだけなんだけども)

あとアクセサリみたいな金属パーツ部分にセル的なハイライト乗せないとなんか物足りないっぽい
これはどうしようか何も考えてなかった……
(出すまでそこそこそれっぽくなるだろう程度にしか考えてなかったから……)
なにかいいアイディアあればなぁ……

・ツールの学習

これはそこそこ覚えれたかなという感じ
このモデル作りながら3d-coatとBlenderの操作覚えるっていう目標があったんだけど
ある程度果てに馴染んだ感じでこれからも使っていけそう
でも3d-coatは触ったの最初の方だから結構忘れてるかな……うn……

blenderもキャラセットアップまででアニメーションつけたりはしてないので
そこの機能はまださっぱりなんだけども……


・現状のそのほか問題点というかどうにかならないかなーというところとか


なにかミスや修正点を見つけてblenderにもどって修正というのばかり最近やってるんだけど
この場合に自作スプリクトがヌケサクすぎてシャープ情報がメタメタになるから出力のたびにやり直しなのは自業自得としても
頂点モーフ(シェイプ)つけるとモデファイアを「適用」でフリーズできないから
体のライン押し出すための厚み付けもでファイア「適用」してから毎回歯の拡大用モーフ作ってあげて出力しないと駄目とか
PMDEに持ってくるときにボーンはマージしてくれるのに材質や頂点モーフはマージしてくれないんですかとか
自分が知らないだけかもしれないけど何度も繰り返すとなると結構めんどいことが溜まってきててだいぶ辛い……

なんかいい方法ないのかなこれ


あと髪の毛の後ろのラインがごちゃごちゃしすぎてて
カメラが遠くなった時ぐらいはDDSのミップマップの仕組み利用してライン減らせないかなーとか考えてはいたんだけど
なんかもうめんどくさすぎて据え置き中


こんな感じか……
なんかもっといっぱい一度吐き出さなきゃみたいなことあった気がするんだけどだめだもう忘れてる
しょーもないレベルでももうちょいこまめに更新スべきだったかなぁ
思い出したらまたちょこちょこ追記するかも


あと水着の状態で一度配布しようと思ってるのは変わらないんだけども
もうちょい調整したい所あるのでモデルデータとして投下するのはもう少し後になるかなぁ……

それができたら服作っていって再投下して完成としたい……
したいんだけどなぁ……(やる気も元気もなさすぎて全然進まない)

blenderからMMDへの作業するにあたっていろいろかさばってきたのでメモ

今作っているモデルの身体部分に骨を仕込んで
一度MMDにだしてみてうまくいくかみたいなことをずっとやってたんだけど
いろいろあれこれ頭のなかに溜まってきたものを一度メモで吐き出しておいて
あとで見返せるようにしとく


まず今詰まっているというか引っかかっちゃったところからだけど
blenderでウェイトつける時にアーマチュアのモディファイアから「体積維持」のチェックは使っちゃ駄目
自分はこれONにしてウェイト着けてた
というのもちょこちょこ仕入れてた知識でSDEFという方式が体積を維持して変形するって感じらしいとみかけててこの方式と同じ効果だと思い込んでいたからなんだけど
SDEFというのは1頂点に付き2ウェイトまでで、なおかつボーンが親子関係じゃないと使えない?(あまり詳しくは調べてないけども)とかいろいろ縛りがあるらしく
blenderの体積維持と同じようには使えないっぽい
それでQDEFというのもあってこっちなら縛りもなくblenderの体積維持とほぼ同様の効果が得られるんだけど
これはPMDEでしかあつかえないようでMMDにもMMMにも対応してないみたいで実質使えない形式っぽい……

なので今から体積維持のチェックを外した状態でウェイト調整しなおし&いろいろ補助ボーン入れなおしして体積維持するような感じに変形してくれるようにボーン構造も調整しなおさないと駄目っぽい……



次に指ボーンの方向なんだけどこれはまっすぐいれないと駄目っぽい
自分は少し指を外に広げた状態で手をモデリングしてそれにそってボーンを入れたんだけど
MMD(じぶんがつかってみてたのはMMMだけど)の機能で指をまとめて握りこむ時に
ボーンが回転する方向がボーンのローカル軸参照でなくてワールド軸方向で決まってるっぽくて
指が変な方向に曲がってしまう
既存のモーションとか流しこむときもこの機能使ってモーション作られてるからか指が変な方向に曲がるのでモーション流し込みできないモデルに成ってしまうっぽい?


←がさいしょの状態でコレだと駄目で
→が修正した状態でワールドのX方向に真っ直ぐ指を生やしてるこれなら指もちゃんと曲がってくれるっぽい



次にMMDには基本的なボーン構造に加えて標準ボーンというのがあるっぽくて
これは本来PMDEのプラグインとかで自動で追加してくれるらしくそっち使ったほうが良さそうなんだけど
自分はコレの下にいろいろ仕込みたい事があったのでblneder上で再現しないと駄目だった

でその関係で各ボーンがどんな仕組みなのかとかもわかっている範囲でちょっとだけ書く?
なんとなーくだけどこの辺


腕周りの捩じりボーン
捩じりの変形を分散変形させるためのボーンで普通の3DCGソフトでセットアップされるリグ構造とかでもよくみるアレ
ただ基本的にこういうのは3つほどに分散されるのがよく見るパターンだと思うんだけど
MMDのばあいは5つほどに分散されるっぽいのでウェイト付けが微妙にめんどい
ちなみに根本(肩)側から肘に掛けて
腕->腕捩1->腕捩2->腕捩3->腕捩
の順番でウェイトを割り振るっぽい腕が全く捩じり入らないMMDもでる標準ボーンで
腕捩が捩じり具合を調整するための操作ボーン、逆に言うと100%拗じられるボーンで
その捩じり具合をそれぞれ25%、50%、75%受けるのが1,2,3という具合っぽい
肘から手首に関しても似たような具合なのでそこは割愛


腰キャンセルボーン(腰ボーンも含む?)
肩キャンセルボーン
それぞれ下半身の動きを足に
肩の動きを腕に伝えなくするための仕組みみたいでコレ自体にウェイトは割り振らなくても良い感じっぽい
腰だけを動かしたり肩だけを動かしたりするのに都合がいいっぽいのだけど多分これは仕込まれたモデルと仕込まれてないモデルを動かし比べないとわからん気がする
逆にちょっと触れば一発でああはいはいたしかにこりゃ便利ねってなる感じ


上半身2 親指0
準標準ボーンと言われてるけどもはや標準ボーン扱いぐらいの扱い
効果的にもむしろ普通に仕込むボーンじゃないのこれって感じの普通のボーン


操作中心
MMDやMMMはいま選択しているボーンを中心に画面を回転させるとからし
そのときに都合のいい場所に画面の回転中心を持ってくるためのボーンらしい?
どっちかというとUI補助みたいな感じでキャラの動きには一切関係しないし、ウェイトも当然無い


足先EX
足の先をもう一段曲げるためのボーンでこれも上半身2や親指0見たく普通にあってしかるべきなボーンな気がするんだけど
実装方法というかボーン構造がなんか特殊な感じで
標準ボーンでの足までの回転をコンストレインでコピーした親子構造のボーンをもう一つ用意して
そっちの先につけるっぽい(こっちにはボーン名の後にDがつく)
足->足D 膝->膝D 足首->足首D でその足首Dの先に足先EXが着く
ウェイトもDのほうについて標準ボーン側はウェイト一切つかないっぽいので注意

(自分は足の指にもボーン仕込むってことを一度やってみたかったのでblender上でこれを自前で仕込んで足先EXの先に指ボーン追加しないと駄目だった)

あと、足と足Dでボーンのロール方向変えとかないとコンストレインしても方向が逆にいっちゃうっぽいのでそこも注意……
とおもって今自分のデータ確認したらロール方向一致してたあれ?
ちょっと前に作業した時は編集モードでのボーンのロール方向は片方は0、片方は180度にしとかないと駄目だった気が……
またわからなくなったら調べ直す……


グループボーンは仕組み自体は単純なんだけどどういう時に使うのかはちょっといまいちわからない?
とりあえずウェイト自体は割り振らなくても良いっぽい


すべての親は流石に説明不要だとおもうので割愛



あとMMDでは明確な大きさの単位とかは取り扱ってないっぽい
なので今自分は結月ゆかりを作っているつもりだけど
その大きさを合わせる時とかは一度blenderの方に他のMMDモデルをインポートしてきて
それと相対的な大体の大きさでモデルの大きさ設定してあげないと駄目
キャラクター設定で身長が○cmだから……とかで数字で決めるのは無理だから
ミクさんのモデルインポートしてミクさんの設定上の大きさが△cmだから相対的にこのぐらい?みたいなかんじになってしまう



おっぱいボーン

これまたいろんな仕組みが考案されててまじめによくわからないのだけど
一応AH式とかいうのを設定してみるつもりではある状態
上半身2の子供に
胸操作->P_SFS1->P_SFS2の順番の親子関係でボーンを作って
胸操作はウェイト一切振らない手で胸の方向を調整するためのやつっぽくて
位置や大きさも普通に胸に一本仕込むならこんな感じ?みたいな位置に置かれるっぽい
P_SFS1は根本側が胸操作よりもうちょい奥側に、ボーン先は胸の乳首方向の更に結構先の空中に配置されるような形で配置されてウェイトも胸の先端~根本にかけて
P_SFS2はP_SFS1とどう位置に真逆方向に置かれるボーンのようで
ウェイトは胸の根本にもっとも強くついて先端側にはつかない感じみたい?

ここからさらにPMDEで剛体仕込んでやっと上手く動くかどうか分かるというかんじなので
今はとりあえず「これでいいのか?」とやってみている段階だからいろいろ間違ってるかもしんない



そのほかモデルによっては付いているけどみたいなボーンがあったりするのだけど
各モデル製作者のこだわりがあるっぽくてイマイチ用途がわからないのとか
効果はなんとなくわかるけどどう実装したら良いのかみたいなの結構あったりする……



そのほかで詰まったのはだいたいblenderでの初めてウェイト付けで機能がよくわかんなかったって話だからまた後日別にメモしよう
blenderからMMDにって話で忘れてることあったらまた追記もしていくかも
メモってるだけでえらい夜更けにたってきたので今日はここまで
とにかくウェイトできたと思ったら体積維持オプションまわりで全然駄目だったのが徒労感でてホント疲れた……

でpythonスプリクトを作ってどうしたかったのかっていう

そりゃ当然セル用に法線整えたかったんですよっていう
法線挑戦前と後(髪の毛頭部部分と肌(主に顔)部分)
斜め45度からのライトを一回転

おさげ部分の髪の毛とかアクセサリー、水着はまだいじってない感じ
顔はとりあえずこんなもんかなと思うんだけど
体もいじったほうがいいのかどうかもう少し考えたい
顔も鼻周りをもう一段いじれるかも?と思ってる

一応別角度


髪の毛については球体を一発転写しただけなので
顔の方についてもうちょい画像とメモのこしておく


通常シェーディングだと通常と調整後はこんな感じ
体も鎖骨とかの段差(その他のもうちょいセルシェーディングが緩くでて欲しい似たような箇所)は一段陰影緩くしてみている
比較は正面からだけで十分だと思うので調整後のほか角度だけ


顎下先がちょい失敗している感あるけど今のところ目立たないしとりあえず放置

基本的に前回とか前前前回とかで書いたように
スプリクトと転写使ってノーマルマップとして法線素材とって合成しての繰り返し&最後にそれを法線として焼付けなんだけど
顔は「首(体とのなじませ)」「首~顎ラインまでの領域」「顔表面」の3つに分けて単純な形状の法線焼き付けてから
顔表面領域だけ更に細かくマスクとって法線方向調整していった感じ
・口両端のおきな凹みをごまかすべく法線を

やや上に向ける&その領域調整
・顔を左右の領域に分けてそれぞれの向きに法線角度もうちょいつける
・唇部分だけ別に単純な法線になるように処理
・目の下の頬周りだけ明るくなるようにマスクとってまた法線調整
ぐらい?
本村式ラインでUV展開がうごごごごーッ!とかやってるときより相当早く結果出た感ある
(スプリクトで頭悩ませてた時期入れても)


一応ノーマルマップ状態も貼り
最終的にMMD持って行きたいなーって思ってるからこの色から頂点法線に焼き付けたけど
blender内で完結するか他のソフト持って行くにしてもその先がオブジェクトスペースノーマルマップを扱えるならソッチのほうがいいかもと思う今のところ

あと一応こんなもんかなとおもうけど完璧なシェーディングとかは無理な感じ
例えば「アニメの絵でこんな角度からライト当てた絵とかねーよそもそも」みたいなのは当然変な風にしかならないし


縦回転だとこんなん
GIFキャプチャーしたときのフレームレートの関係でこっちが確認した一番ひどい状態はコマとしてはいってないっぽいけど
とにかく自分が想定したある程度にはベストな状態になるけどイレギュラーなの角度ライトとか当てられると「うn」って感じかなぁと思う
(自分の調整の仕方が下手なだけかもしれんけど)

その他の注意点とかはスプリクトの記事の方にだいたい追記した気もするからいいかなぁ?
一応「スプリクト」or「blender標準のデータ転送->カスタム法線」するとなんか
シャープとかがぐちゃぐちゃになるっぽいから其れ関係の作業orモデファイア(「辺分離」とか)は全部作業済み適応済みにしといたほうがいいっぽいことだけはもっかい書いとこう



法線いじってるとなんかこんなかんじにシャープが勝手に追加されていく
自分のデータor環境が何かしら悪いだけかもしれないけど
ちなみにシャープを解除するとカスタム法線が壊れるのでもう触れない


全身選んで「シャープをクリア」した結果

なんかまた書いとかないと忘れるよコレみたいな事があるようなら追記していこう

とりあえずはこの状態で髪の毛のお下げ部分もシンプルにして
そしたら法線はノーマルマップテクスチャとして取っておいて他の作業に移るかんじになるかなぁ?

頂点法線とオブジェクトスペースノーマルカラーを行き来するスプリクトがもうちょいマシになった「Blender+Python」

更新メモ 
8/29 18:00頃スプリクトのミスと速度を改善
8/30 不具合あったので不具合3として明記

通常の想定した使い方は8/22付けの記事のほう見てもらうとして

既知の不具合だけ先に書いておく(以前の記事の方でも追記はしたけど雑多になってきてたので)


既知の不具合1
このスプリクトで入れ込んだカスタム法線を読み込んで色を付けることが出来ない
(法線が取れずに全部0が帰ってきて、結果全部灰色になる)
blenderの機能で転写したカスタム法線orカスタム法線ナシの状態ならまず普通に色がつかないことはない
要するに現状
法線->色->法線 まではいけるけどそこからもう一回
法線->色->法線->色 みたいにもう一回色となると無理っぽい?
回避策として同じ形状を一度複製して
スプリクトで法線流し込んだほう->複製できたてホヤホヤのほうに再度転写してやれば
スプリクトでいじった法線を再度色化はできるっぽいのでとりあえず作業はできる

既知の不具合2
不具合というか仕様というかだけど
今回追加した頂点色スムースはちょっとでも頂点数多いモデルにかけるとクソ重い
(処理する頂点自体が少なくても
 その選択されてるのの割り出しに頂点総当り処理している為)
改善できるやり方がネットで見つかったら更新したいけどなぁ……
またしらべていこうとは思うけど今回はとりあえず機能実装まではできたのでここまで

8/30追記
既知の不具合3
Color->Normalしたときにモデルのシャープ設定がぐちゃぐちゃになるっぽい
予め辺分離モデファイアは適応済みにしておく
コピーしたモデルでこのスプリクト使って色々編集して最後に元のモデルに転写し直すとか?
なにかしらの対応が必要
更に追記:
なんかblender標準のデータ転写機能法線転写してもシャープがグチャるっぽい
スプリクトのバグとかでなくblenderのカスタム法線周りの仕様?
それとも自分のデータの持ち方が何かしら駄目なのか?
今のところ法線はいろいろいじったらスプリクトで画像テクスチャデータとして退避させておいて
シャープが関係するようなすべての作業終わってから最後に適応させるしかなさ気?
blender内で完結もしくは他のソフトにもっていくとしてもそっちがオブジェクトスペースのマールマップつかえるならそっち使った方がいいっぽい)

今回追加した機能

頂点色スムーズの「ColorSmoothSelectVertex」ボタン
他のボタンはオブジェクトモードで使用するけど
これは編集モードでなおかつ対象頂点を選んでから使用するのに注意
当然頂点カラー情報も持ってないと駄目
オブジェクトモードで編集中オブジェクトも選ばれている必要がある
(編集モードでデータセーブして作業再開時に編集モードから始まった場合とかに
オブジェクトモードで今エディット中のオブジェクトが選択されてないとかがありえるので)

一応色に焼き付けてから色の方を今回の機能でぼかして
サイド法線に転送することで画像見たく陰影を柔らかくできる

(画像の耳は三回ほどかけた感じでやり過ぎたかも感ある二回ぐらいでよかったかも)
8/29追記:
なんか命令文の記述順序おかしくて必要以上に色を入れなおし(結果的にボカシまくり)してたっぽいので
今はそれを正確にやるようになったかわりに一回のボカシは弱くなったので
三回程度じゃ画像見たくまではボケないかなと思う

もっとスムースかけていけばどんどん陰影が柔らかくなるので
リアル系のシェーダー掛ける場合であっても光が透けるような素材の箇所やできるだけ柔らかく見せたい箇所には有効かも
箇所によってスムースの力加減は気をつけないとだめだろうけど
毛関係とか画像の耳みたく薄いところとかおっぱいとか


画像の順序としては
 14
 23
な工程な感じ

ただ上でも書いたように現状クソ重なので
今回の耳の場合だと顔だけのモデル頂点7463に両耳800ちょいの頂点数選んでスムースかけると

自分の3,4年前のPCで1分か二分?ぐらいは応答なくなる感じ
8/29追記:
スプリクトいじって多少改善した?
同じ状況下で一分まではギリかからなくなったと思うけど
まだ瞬間的に処理終わらないのでなんか無駄なことしている感
やっぱ選択している頂点取るのに全頂点総当りしてるのが原因な模様
更に追記:
重い原因の大部分はオブジェクトモードとエディットモードの行き来にあった
模様
これがオブジェクトの総頂点数に応じて処理時間取られるっぽい
任意の1頂点選ぶためと、頂点カラーをいじるために
1頂点につき計二回オブジェクトモードに移行してるんだけど
(該当箇所は下のスプリクトで赤字にした)
これが片方だけでもどうにかできれば単純計算で倍速になるっぽい感
でもおかしくね?なんで頂点選ぶ命令文がオブジェクトモード動作なの?普通に考えて編集モードで働くべきじゃね?おかしくね?(愚痴)
編集モードのままでもそちらの動作が出来る方法が見つかったら処理速度改善するので
其れまでは必要箇所だけメッシュ切り出してスムースかけるしかないかなぁ……

重いのでDOS窓から起動した場合にDOS窓に処理状況表示する機能追加したのでこっちで自分のPC、モデルと処理スピードの兼ね合いみてくだち……

こっちのスムースじゃなくてもblender標準の頂点ペイント機能のブラシでぼかしてもいいんだけど
選択した範囲に均一にボカシをかけたかったけどその手段が自分の調べた範囲だとなかったので作成した感じの機能
ちゃんとそういう機能あるよ、とか代わりになりそうな機能orやり方知ってるのなら
そっちの手段取った方がいい


前回記事からの改善
Color -> NORMAL時に値をノーマライズしてなかったので
しれっと動作おかしくなることがあったのでちゃんとするようにしました
(これやっとかないとこんかいみたくぼかした色は法線に戻せない)

色をぼかさなくても直接法線スムースすればいいじゃんとかもあるかもだけど
上の画像の使い方以外にも白黒の頂点色付けてそれをぼかして
テクスチャの色合いをつけるため、ノーマルマップ合成する時にとかのマスクにしたいとかもあったので

以下スプリクト
例によってブログに貼るために半角スペースを全部全角スペースに置き換えてるので
使いたい奇特な人がいたら要逆置き換え

import bpy
import mathutils
import bmesh

class NormalColorSmoothSelectVertex(bpy.types.Operator):
    bl_idname = "object.color_smooth_vertex_operator"
    bl_label = "ColorSmoothSelectVertex"

    def execute(self, context):
        
        
        #アクティブオブジェクト取得するのにオブジェクトモードに行かないと駄目っぽい
        bpy.ops.object.mode_set(mode='OBJECT')        
        for object in bpy.context.selected_objects:
            if object.type == 'MESH':
                object = bpy.context.scene.objects.active
                mesh = object.data
                

        #頂点情報を得るためにエディットモードに移行
        #選択拡大や頂点選択解除もエディットモードに入らないと駄目っぽい
        bpy.ops.object.mode_set(mode='EDIT')
        bm = bmesh.from_edit_mesh(object.data)
        selected_verts = [vert for vert in bm.verts if vert.select]

        #なんかオブジェクトモードに入ると取得したbmeshデータが死ぬ?っぽいので
        #頂点番号リストだけ退避
        verts_list = 
        for id in selected_verts:
            verts_list.append(id.index)

        Vertex_Color_list = 

        
        i = 0
        #取得した頂点を一つ一つ処理
        for id in verts_list:
    
            #頂点の選択解除
            bpy.ops.mesh.select_all(action='DESELECT')  
            #今処理する頂点を選択(頂点選択なのにオブジェクトモードじゃないと働かないぞこいつ)
            #ここが糞重い原因その1

            bpy.ops.object.mode_set(mode='OBJECT')
            mesh.vertices[id].select = True    
            #後々選択拡大でとなりの頂点の取得するためのモード移行を先にやっておく
            bpy.ops.object.mode_set(mode='EDIT')

            #一度取得したbmeshがモード行き来で死んでるっぽいので再取得
            bm = bmesh.from_edit_mesh(object.data)


            #今回処理する頂点のloopをまず取得
            verts_list_now = 
            #選択頂点を取得してから
            selected_verts_Now_bm = [vert for vert in bm.verts if vert.select]
            #その頂点のloopを取得
            #初回のforはいらないと思うけど、この直後のほうと記述変えるのめんどいので放置
            for now_vert in selected_verts_Now_bm:
                for loop in now_vert.link_loops:
                    verts_list_now.append(loop.index)
                
            #選択拡大
            bpy.ops.mesh.select_more()
            
            #選択拡大状態で再度loop番号取得
            more_verts_list_now = 

            selected_verts_Now_bm = [vert for vert in bm.verts if vert.select]
            for now_vert in selected_verts_Now_bm:
                for loop in now_vert.link_loops:
                    more_verts_list_now.append(loop.index)

            #色取得する命令文がこいつまたオブジェクトモードじゃないとうごかねぇ
            #糞重い原因その2前半
            bpy.ops.object.mode_set(mode='OBJECT')
            
            #アクティブな頂点カラーグループの取得
            #直前にとらないとオブジェクトモードとエディットモードの行き来で
            #なんかデータのつながりおかしくなるっぽい?ので頂点色データはここで取る
            #object、meshは取りなおさなくても大丈夫っぽい?

            VertexNormalColor = mesh.vertex_colors.active.data if len(mesh.vertex_colors) else None 
            
            NowColorR = 0
            NowColorG = 0
            NowColorB = 0
            
            for id_now in more_verts_list_now:
                vcolor = VertexNormalColor[id_now].color
                NowColorR = NowColorR + vcolor[0]
                NowColorG = NowColorG + vcolor[1]
                NowColorB = NowColorB + vcolor[2]
                
            #全部足して(足すのは直上の処理で済んでるけど)割って値的にスムース
            #後々色としてぶち込むために小数点三位以下は切り捨てもする
            NowColorR = round(NowColorR / len(more_verts_list_now), 3)
            NowColorG = round(NowColorG / len(more_verts_list_now), 3)
            NowColorB = round(NowColorB / len(more_verts_list_now), 3)       

            #処理済みの値として後々実際にぶち込むために一度リストに格納
            for id_now in verts_list_now:
                Vertex_Color_list.append([id_now,NowColorR,NowColorG,NowColorB])
            
            #最後の頂点の処理が終わっているなら色をぶち込む
            #終わってないなら今の処理状況をprintで出力
            if i == (len(verts_list) - 1):
                for NowColor in Vertex_Color_list:
                    id_now = NowColor[0]
                    VertexNormalColor[id_now].color =(NowColor[1],NowColor[2],NowColor[3])
                print('end')
            else:
                i = i + 1
                print('NowVertex:'+str(i)+'/'+str(len(verts_list)))
            
            #糞重い原因その2後半
            #色の処理終わったのでエディットモードに戻る
            bpy.ops.object.mode_set(mode='EDIT')
            
        
        #元々選択してた頂点の状態に戻そう
        bpy.ops.mesh.select_all(action='DESELECT')
        bpy.ops.object.mode_set(mode='OBJECT')
        for id in verts_list:
            mesh.vertices[id].select = True
        bpy.ops.object.mode_set(mode='EDIT')
        
        return {'FINISHED'}


class NormalColorImput(bpy.types.Operator):

    #ボタン押して呼び出すときの名前
    bl_idname = "object.normal_imput_operator"

    #ボタンに表示するときの名前
    bl_label = "Normal -> Color"

    def execute(self, context):
  
        #選択中オブジェクトを順番に処理するためのfor?
        for object in bpy.context.selected_objects:
            #選択オブジェクトがメッシュかどうか判定
            if object.type == 'MESH':
                #選択オブジェクト取得
                bpy.context.scene.objects.active = object 
                
                #取得したオブジェクトのメッシュをさらに取得?
                #メッシュ取得しないと各種頂点情報取れない?
                mesh = object.data
                
                
                #新規頂点カラーグループを追加
                #名称はNormalColor
                mesh.vertex_colors.new(name = "NormalColor")
   
                #頂点カラー取得して色をセットする準備
                #名前指定で取らないと自分の知識では無理
                #アクティブな頂点カラーで取ろうとしても
                #スプリクト内で作ったばかりだからアクティブな状態ではないため?
                VertexNormalColor = mesh.vertex_colors["NormalColor"]
            
            #カスタム法線がある場合はそちらから取得
            

            if mesh.has_custom_normals == True:

            
                #ポリゴンを一つ一つ処理?                
                for poly in mesh.polygons:

                
                    #ポリゴンの頂点を一つ一つ処理?                      
                    for id in range( poly.loop_start, poly.loop_start + poly.loop_total ):


                        #blnederではXが左右、Yが前後、Zが上下なことに注意
                        #カスタム法線はmesh経由のnormalでなくloops経由で取れる
                        #カスタム法線セットがない場合は旧カスタム法線だとかの色を持ってくる感じ?
                        #とにかくエラー的な動作になる
                        VertexNormalColor.data[id].color.r = 0.5 - (mesh.loops[id].normal[0] / 2)
                        VertexNormalColor.data[id].color.b = 0.5 - (mesh.loops[id].normal[1] / 2)
                        VertexNormalColor.data[id].color.g = 0.5 + (mesh.loops[id].normal[2] / 2)

                        
            #カスタム法線がない場合は通常の法線から取得
            else:
                
                for poly in mesh.polygons:                    
                    for id in range( poly.loop_start, poly.loop_start + poly.loop_total ):

                        VertexNormalColor.data[id].color.r = 0.5 - (poly.normal[0] / 2)
                        VertexNormalColor.data[id].color.b = 0.5 - (poly.normal[1] / 2)
                        VertexNormalColor.data[id].color.g = 0.5 + (poly.normal[2] / 2)


        return {'FINISHED'}



class NormalColorSmooth(bpy.types.Operator):
    bl_idname = "object.normal_smooth_operator"
    bl_label = "ColorSmooth"
    
    def execute(self, context):
    
        for object in bpy.context.selected_objects:
        
            target_obj = object.data
            
            #頂点カラーがハードエッジ的につく場合のスムース            
            bpy.context.scene.objects.active = object            
            bpy.ops.object.mode_set(mode='VERTEX_PAINT')
            target_obj .use_paint_mask = False
            bpy.ops.paint.vertex_color_smooth()
            target_obj.update()
            bpy.ops.object.mode_set(mode='OBJECT')
    
        return {'FINISHED'}



class NormalColorOutput(bpy.types.Operator):
    bl_idname = "object.normal_output_operator"
    bl_label = "Color -> Normal"

    def execute(self, context):
        
        object_normal_set = []
        
        for object in bpy.context.selected_objects:
            if object.type == 'MESH':
                bpy.context.scene.objects.active = object 
                mesh = object.data
                
            #アクティブな頂点カラーグループの取得
            #今度は名前(NormalColor)指定で取得するときとは後々の処理で
            #.dataが必要なくなることに注意
            #名前指定時  VertexNormalColor.data[id].color
            #今回        VertexNormalColor[id].color
            VertexNormalColor = mesh.vertex_colors.active.data if len(mesh.vertex_colors) else None
                
                
            for poly in mesh.polygons:
                
                for id in range( poly.loop_start, poly.loop_start + poly.loop_total ):
                    
                    vcolor= VertexNormalColor[id].color
                    
                    VerR = ( vcolor[0] * -2 ) + 1
                    VerG = ( vcolor[1] * 2 ) - 1        
                    VerB = ( vcolor[2] * -2 ) + 1

                    #値を法線角度としてふさわしくなるように正規化                
                    VV = mathutils.Vector*1
                    VV.normalize()
                    #カスタム法線にセットするためのリストにAdd  
                    object_normal_set.append(VV)
                    

            #カスタム法線にimport        
            object.data.normals_split_custom_set(object_normal_set)
    
        return {'FINISHED'}





class HelloWorldPanel(bpy.types.Panel):
    """Creates a Panel in the Object properties window"""
    bl_label = "Normal_Color_Panell"
    bl_idname = "OBJECT_PT_hello"
    bl_space_type = "VIEW_3D"
    bl_region_type = "TOOLS"
    bl_category = "Tools"


    def draw(self, context):
        layout = self.layout
        
        row = layout.row()
        layout.operator("object.normal_imput_operator")
        
        row = layout.row()
        layout.operator("object.normal_smooth_operator")

        row = layout.row()
        layout.operator("object.color_smooth_vertex_operator")
        
        row = layout.row()
        layout.operator("object.normal_output_operator")

def register():
    bpy.utils.register_class(HelloWorldPanel)
    bpy.utils.register_class(NormalColorImput)
    bpy.utils.register_class(NormalColorSmooth)
    bpy.utils.register_class(NormalColorOutput)
    bpy.utils.register_class(NormalColorSmoothSelectVertex)
    

def unregister():
    bpy.utils.unregister_class(HelloWorldPanel)
    bpy.utils.unregister_class(NormalColorImput)
    bpy.utils.unregister_class(NormalColorSmooth)
    bpy.utils.unregister_class(NormalColorOutput)
    bpy.utils.unregister_class(NormalColorSmoothSelectVertex)
    
if __name__ == "__main__":
    register()

*1:VerR,VerB,VerG

blender+pythonスプリクト用メモ 8/24 選択中のloopのindex番号を取得したい

昨日悩んでて出来なかったのが上手く行ったので貼り貼り
例によって半角スペースはブログに貼り付けると消えるので全部全角スペースに置き換え

import bpy
import bmesh

#アクティブオブジェクト取得するのにオブジェクトモードに行かないと駄目っぽい
bpy.ops.object.mode_set(mode='OBJECT')
obj = bpy.context.active_object
mesh = obj.data

#頂点情報を得るためにエディットモードに移行
bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(obj.data)

#まずfaceを取得して
for face in bm.faces:
    #face経由じゃないとloopsでforが効かないっぽい
    for loop in face.loops:
        #loopsに対応したvertが取得できるのでvertの方で選択状態か判別
        #loops自体がselect持ってくれてないので
        vert_now = loop.vert
        if vert_now.select:
            #やっといま選択中のloopのindex番号を取得できた
            print(loop.index)


選択中の頂点番号(vertsのindex番号)はネット徘徊して取得方法わかったんだけど
loopとかいう扱いの方の番号の取得方法がわかんなかったので
1頂点に付き接している面(エッジ?)分の番号を何か持ってるらしいのよね
で法線とか頂点カラーはとはこっちのloop方の情報として持ってる臭くて
(頂点カラーがエッジで別れてパキッと色ついたりとか法線がわかれてエッジが立ったりするのはそのせいっぽい?)
頂点番号とかいらないんですけど!こっちがないといろいろできないんですけど!!
みたいな感じだったので困ってたのが解決 嬉しい という話


一昨日ブログにペタリした法線と頂点色行き来するスプリクトはオブジェクトの頂点一括処理とかな感じの命令ばっかだったから
選択してるところだけ取り出したいとかいらなかったけど次のは普通に使うので


もうちょい書きたいことあるんだけど
新規記事を作るほどでもなくてでも前後の記事は長くなりすぎちゃってるのでここに追記

blenderpythonを触ってみて思ったのはなんかEDIT、OBJECTその他のモードの行き来に
すげー気を使った方がいいっぽいなーって
なんかこれいききするだけで取得してたはずのデータのつながりがダメに成ったりとか
これ普通このモードで使う命令文じゃねーの?っていうのが他のモードじゃないと動かなかったりとか
数回モード移動するだけならいいけど反復処理のなかでモード移行する必要性が生じた時は
モード移行の回数と処理中のオブジェクトの重さでかなり処理が遅延したりする

どうにかならんのかなーこれ
(日曜スプリッターの愚痴なので間違ってる可能性は大いにあるけど)
愚痴も兼ねつつ、個人的に思った注意点
ネットの情報って誰かの役に立つこともあるかもしれんから一応ねほんと