• nミニキャラボーンプラグインの使い方補足(不具合ではなかった)

    2019-06-18 20:15
    配布しているnミニキャラボーンプラグインのreadmeには書いていなかった、
    使う前にやらねばならないことが判明したので、ここに書いておきます。
    最新版はver.1.06です。(2019.06.18更新)
    (配布場所→http://moeechandon.blog111.fc2.com/blog-entry-171.html

    【必須ボーン】
    ・センター
    ・首
    ・頭
    ・上半身or上半身2
    (・肩)←なくても良いようにver.1.03から変更。
    ・腕
    ・ひじ
    ・足
    ・足IK
    ・つま先IK

    表示枠に入っていないボーンがあるとエラーになります。
    →2019.06.18:エラー出なくした。


    自分自身がモデル修正中に表示枠を全部消してから使おうとしたので、
    エラーが出て気づきました。
    普通に使っていたら大丈夫だと思います。
    プラグインの方で、入ってなかったら、入れることもできるんですが、
    ちょっと考えたらめっちゃめんどかったので、
    表示枠の名前とか各自違ったり、入れ方も違ったりすると思うので、
    入れておくことを前提にしてもらいたいと思います。


    [2019.06.13.追記]
    また必須ボーンが表示枠に入ってなくてエラーが出て、
    「原因がわかんない!」ってなった(忘れている)ので、
    表示枠がない場合「必須ボーンを表示枠に入れろ」表示を出すように変更しました。
    よく考えたら「表示枠がない」場合に表示が出るのであって、
    「表示枠があって必須ボーンが表示枠に入ってない場合」にはエラーが出ることに今気づいた。
    後で直してくれ自分。

    [2019.06.18.追記]
    めんどくさいので表示枠に入ってないボーンがあった場合、
    全部まとめて表示枠「仮」を作成して突っ込むことにした。
  • 広告
  • Inkscapeの操作を覚えるための生放送のお知らせ

    2018-12-09 16:23
    3Dモデルのテクスチャ、みんな何で描いてるかなー!
    私はイラレ!

    ということで、フリーソフトのイラレこと「Inkscape」の使い方講座です。
    基礎の「き」。

    公式サイトはここ。ダウンロードもここ。
    https://inkscape.org/ja/

    【対象】
    ・Inkscapeが初めてorほぼ分からない人。

    【講師】
    ののの先生
    略歴:始皇帝が欲しくて召喚しまくってたら馬が6頭来た。
       普段はAdobe Illustrator使いだが、出先や借り物のPCとかで何かしなきゃいけない時にInkscapeを頼る。
       Inkscapeの名前をすぐ忘れるのは申し訳ないとは思っている。
       モデリングはblender。

    【目的】
    Inkscapeの基本操作を覚える。
    この模様↓が描けるようになる。

    ※講師の都合により、ショートカット設定をイラレに変更します。
     宗教上の問題などで変更したくない人は頑張ってついてきて下さい。

    【日時】
    12月10日(月)21:00から。
    休憩あり1時間半くらいを予定。
    20:30に生放送の予約をしてありますが、
    冒頭30分は放送テストで講座自体は21時から始まります。

    【場所】
    ニコ生(タイムシフト可)。

    コミュニティに入る必要はありません。
    コミュニティがないと生放送ができないので、作ってあるだけのコミュニティです。

    一応録画しておく予定だけど、高確率で忘れるのでタイムシフト予約しておいたほうが良い。

    【用意するもの】
    ・Inkscapeを起動しているPC。
    (ダウンロード、インストールは済ませておいてください)
    ・暖かい飲み物。
    ・広い心。
    ・優しさ。

    【その他】
    ・分からなかった、できなかった、なんかおかしいとか、その都度質問して下さい。
     気軽に答える。
    ・だがわしにもわからんことはある。

    質問あればコメント欄に書いておいてくれるとQ&A的にやる。


  • NaN値チェック用のPmxEプラグイン解決しました。すまん。

    2018-06-21 22:472
    前回(ar1583293)謎の。
    「NaNが入っているにも関わらず異常なしと出てくる」
    のがあったんですけど、原因が分かりました。
    入ってる文字が違った。
    ・Windows10 PmxEditor_0254eの64bit版 →NaN
    ・Windows7  PmxEditor_0254eの64bit版 →NaN(非数値)
    なんでや。

    前方一致で処理することにしました。
    IsNaNを使えっていう話もあるんですけど、なんかうまくいかなかったんですよね。
    とか思ってたら突然動作し始めました。
    なんでや。
    ちゃんとstringのNaNじゃなくて、floatのNaNが入ってた。
    私が悪かった。

    とりあえずいつものブログで配布始めました。
    http://moeechandon.blog111.fc2.com/blog-entry-171.html


    以下はなんか雰囲気で書いたC#。

    //基本部分省略//
    int jLgt = this.PMX.Joint.Count; //jointの数
    if (jLgt < 1)
    {
    MessageBox.Show("jointがありません。終了します。", VerInfo);
    return;
    }
    NaNForm f = new NaNForm();
    f.ShowDialog();
    bool jChange = f.ChangeRadio;
    //0に変換するかどうかのチェック用(true/false)
    //フォームのボタンで選ぶやつ。trueかfalseだけを返してくる。

    //ここで[X]で閉じた時に終了するやつが入る。//

    string ChangeMessage = ""; //NaNを0に変換した時にメッセージを仕込む。
    if (jChange == true)
    { ChangeMessage = Environment.NewLine + "→ NaNを0に変換しました。"; }

    int cnt = 0; //NaNになったjointの数をカウント
    int first = 0; //そのjointをメッセージ用に入れるのが最初かどうか。
    string Tell = ""; //NaNがあったjointのインデックスを通知用に入れる
    IPXJoint jnt; //jointを入れる変数

    for (int i = 0; i < jLgt; i++)
    {
    first = 0;
    jnt = this.PMX.Joint[i];
    //ここから下をできればもっと略したいんじゃよ。
    //関数jointNaNcheck()の中身は後述。

    jnt.Position.X = jointNaNcheck(jnt.Position.X, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Position.Y = jointNaNcheck(jnt.Position.Y, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Position.Z = jointNaNcheck(jnt.Position.Z, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Rotation.X = jointNaNcheck(jnt.Rotation.X, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Rotation.Y = jointNaNcheck(jnt.Rotation.Y, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Rotation.Z = jointNaNcheck(jnt.Rotation.Z, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_MoveLow.X = jointNaNcheck(jnt.Limit_MoveLow.X, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_MoveLow.Y = jointNaNcheck(jnt.Limit_MoveLow.Y, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_MoveLow.Z = jointNaNcheck(jnt.Limit_MoveLow.Z, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_MoveHigh.X = jointNaNcheck(jnt.Limit_MoveHigh.X, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_MoveHigh.Y = jointNaNcheck(jnt.Limit_MoveHigh.Y, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_MoveHigh.Z = jointNaNcheck(jnt.Limit_MoveHigh.Z, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_AngleLow.X = jointNaNcheck(jnt.Limit_AngleLow.X, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_AngleLow.Y = jointNaNcheck(jnt.Limit_AngleLow.Y, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_AngleLow.Z = jointNaNcheck(jnt.Limit_AngleLow.Z, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_AngleHigh.X = jointNaNcheck(jnt.Limit_AngleHigh.X, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_AngleHigh.Y = jointNaNcheck(jnt.Limit_AngleHigh.Y, i, ref cnt, jChange, ref first, ref Tell);
    jnt.Limit_AngleHigh.Z = jointNaNcheck(jnt.Limit_AngleHigh.Z, i, ref cnt, jChange, ref first, ref Tell);
    jnt.SpringConst_Move.X = jointNaNcheck(jnt.SpringConst_Move.X, i, ref cnt, jChange, ref first, ref Tell);
    jnt.SpringConst_Move.Y = jointNaNcheck(jnt.SpringConst_Move.Y, i, ref cnt, jChange, ref first, ref Tell);
    jnt.SpringConst_Move.Z = jointNaNcheck(jnt.SpringConst_Move.Z, i, ref cnt, jChange, ref first, ref Tell);
    jnt.SpringConst_Rotate.X = jointNaNcheck(jnt.SpringConst_Rotate.X, i, ref cnt, jChange, ref first, ref Tell);
    jnt.SpringConst_Rotate.Y = jointNaNcheck(jnt.SpringConst_Rotate.Y, i, ref cnt, jChange, ref first, ref Tell);
    jnt.SpringConst_Rotate.Z = jointNaNcheck(jnt.SpringConst_Rotate.Z, i, ref cnt, jChange, ref first, ref Tell);
    }

    if (cnt == 0)
    { MessageBox.Show("NaN値を含むjointはありません。 "); }
    else
    {
    MessageBox.Show(" "個数" + cnt + "/" + (jLgt + 1)
    + Environment.NewLine + Environment.NewLine +
    "NaN値が含まれているjointのインデックス" + Environment.NewLine+
    Tell + Environment.NewLine + ChangeMessage,
    VerInfo);
    }
    //処理ここまで//

    //関数にしてるとこ//
    public float jointNaNcheck(float j, int i, ref int cnt, bool jChange, ref int first, ref string Tell)
    {if (float.IsNaN(j)) //IsNaNによるチェック。
    {
    first = first + 1;
    if (jChange) //NaNを0に変換するかどうかにtrueの場合
    {
    j = 0;
    }
    if (first < 2)
    {
    Tell = Tell + i + ", ";
    cnt = cnt + 1;
    }
    }
    //IsNaNによるチェックが上手くいなかった時のために前方一致で強引に処理する。
    else if (j.ToString().StartsWith("NaN", StringComparison.OrdinalIgnoreCase))
    {
    first = first + 1;
    if (jChange) //NaNを0に変換するかどうかにtrueの場合
    {
    j = 0;
    }
    if (first < 2)
    {
    Tell = Tell + i + ", ";
    cnt = cnt + 1;
    }
    }
    return j;
    }