2025年6月18日水曜日

本当に久々の Blender スクリプト

いやー本当にギリギリまで追い込まれないと知的な行動ができない子なんですよ、自分。
以前ちょこっとだけ、顔のモデリングをはじめました…と書いていたのですが…。

瞳を作成
瞳を作成するに当たって通常どうやってモデリングするでしょうか?
一般的にはUV球にテクスチャを描いて貼り付けると思います。
又、黒目のように円一周の模様が同じパーツなら、切り分けたピザの様に一部だけテクスチャを描いて、ぐるっと一周コピーして使用するのでは無いでしょうか?
が、残念ながら私はテクスチャを描く技術がありません。
普通ならココで絵を描く技術を磨くところですが、残念ながら私にはやる気と時間が(年齢的にも)ありません。
よって、全て細かいメッシュで表現しようとしているのですが、流石にまるまる全てをモデリングすると労力がかかりすぎます。

そこで眼球の右下部分だけをモデリングして、それをコピー接合していきます。
…左上に当たる座標に3Dカーソルを当てる→複製→縦横にマイナス拡縮を行って反転→自動吸着を行う…とやっていてけば確かに手動でも可能ですが、流石に面倒すぎる。

※ぶちゃけた事を書けば
眼球を作ると言うより、幾何学模様があるカラーコンタクトを大量に作って重ねるという感覚の方が近く、これら(カラーコンタクト)を1個作る毎に毎回この処理をやってるのは面倒すぎるのです。

そこで、手動操作を「スクリプト作成」で書き出して繋ぎ合わせたのが下のコードになります

コード開始

import bpy
import bmesh

while bpy.context.mode == 'EDIT_MESH':

    bFirst=True
    min_x=0.0
    min_z=0.0
    max_x=0.0
    max_z=0.0

    #### get center point ####

    me = bpy.context.object.data
    bm = bmesh.from_edit_mesh(me)

    for v in bm.verts:
        if v.select == False:
            continue
        if bFirst:
            min_x=v.co.x
            max_x=v.co.x
            min_z=v.co.z
            max_z=v.co.z
            bFirst=False
        if min_x>v.co.x:
            min_x=v.co.x
        if max_x<v.co.x:
            max_x=v.co.x
        if min_z>v.co.z:
            min_z=v.co.z
        if max_z<v.co.z:
            max_z=v.co.z

    bm.free()

    if bFirst == True:
        break

    center_x = min_x
    center_z = max_z
    width = max_x-min_x
    height = max_z-min_z

    #### dupricate ####

    old_pivot = bpy.context.scene.tool_settings.transform_pivot_point
    bpy.context.scene.tool_settings.transform_pivot_point = 'MEDIAN_POINT'

    old_merge = bpy.context.scene.tool_settings.use_mesh_automerge

    #### 1 ####
    bpy.context.scene.tool_settings.use_mesh_automerge = False
    bpy.ops.mesh.duplicate_move(
        MESH_OT_duplicate={"mode":1}, 
        TRANSFORM_OT_translate={"value":(-width, 0, 0)}
    )
    bpy.context.scene.tool_settings.use_mesh_automerge = True
    bpy.ops.transform.resize(value=(-1, 1, 1))

    #### 2 ####
    bpy.context.scene.tool_settings.use_mesh_automerge = False
    bpy.ops.mesh.duplicate_move(
        MESH_OT_duplicate={"mode":1}, 
        TRANSFORM_OT_translate={"value":(0, 0, height)}
    )
    bpy.context.scene.tool_settings.use_mesh_automerge = True
    bpy.ops.transform.resize(value=(1, 1, -1))
        
    #### 3 ####
    bpy.context.scene.tool_settings.use_mesh_automerge = False
    bpy.ops.mesh.duplicate_move(
        MESH_OT_duplicate={"mode":1}, 
        TRANSFORM_OT_translate={"value":(width, 0, 0)}
    )
    bpy.context.scene.tool_settings.use_mesh_automerge = True
    bpy.ops.transform.resize(value=(-1, 1, 1))

    bpy.context.scene.tool_settings.transform_pivot_point = old_pivot
    bpy.context.scene.tool_settings.use_mesh_automerge = old_merge
    
    break

コード終わり

一応解説

#### get center point ####
バウンディングボックスの算出

#### dupricate ####
ぐるっとコピー。コピーして反転しての繰り返し。反転する前に頂点同士がくっつくと不味いので、自動頂点吸着のフラグ操作が忙しくなっている。


はい、大分久しぶりでした。こんなんでも1週間くらいかかったような…
いや、コードが動き始めてからは2日くらいでしたが調べるのに時間かかりました。

速度を出すなら bmesh で全ての処理を完結させるべきだとは解るのですが、瞳に使う頂点、辺、面、法線…を全て網羅するコードを無事駆動させる自信が無かったので、「早い手動」でいいかなと。
あと、今回はじめて「スクリプト作成」を見ながらスクリプトを作ったのですが…フラグを弄ろうとして、わざわざ設定したのに反映されない場面が多々ありました。
なんでフラグ設定に従ってくれなかったのか?おかげでどのフラグがどういった意味を持っているのか判らないと言う部分がありまして、結局は動く分だけでどうにかしたのが今回のコードになります。

また、今回のスクリプトですが、例によって開発に使った機材は…以前購入した Latitude3120 です。Celeron N5100 マシン。
何年か前にスクリプトを書いた際にも書きましたが、こういう物は気付いた時に枕元で作るのが一番進みます。スペックではないのですよ。

まあ、久々に趣味で頭を使ったのでそれなりに満足ではあります。今後はコレを使ってモデリングを進めねば。

2025年6月17日火曜日

グリーンランダー6人で最強拳士を目指す13

はい、苦行回です。また、結構な発見もありました。
約一ヶ月分の食料を持ってスプリングからキャットロンの城へ。途中で酸性雨を食らったり、ガスでダメージを負ったりして運べる重量が下がるので、最大荷重より2kgくらい軽い重量を担いで移動します。

到着と同時に最初の発見
キャットロンはこちらを発見すると長い演説のあと、隣の塔からスラルを呼んで自らも戦闘態勢に入るのですが…。最初のセリフが出た時点で、クイックセーブ/ロードするだけでこの特殊行動を全てキャンセルできます。殴る必要すらなかったんですね。

で、計画通り最初は格闘戦
当初は筋力1キャラを4人と筋力1+老兵の2チームに分けて武術の訓練をする予定でしたが…正直、筋力1のキャラは頭以外にまともなダメージを与えることができずとんでもない時間がかかりました。
で、全員で殴る事にしたのですが老兵は片腕を最低腕(試作品等級エコノミー腕)に換装。こうすることでカバンを降ろしてギリギリ重量内に収まります。

暗殺がうまく行かない。
一度殴り倒した後、予定通りキャットロンに暗殺者の衣を着せて今度は暗殺上げに移行しましたが…。
なんと暗殺が85になった辺りでKO可能になってしまう。体力全快の時はこうではなかった気がしたのですが。まさかここまできて無印プレートメール(暗殺バフアイテム)を買いに戻る訳にも行きませんし(キャットロンから最も近いのはフラットラグーン)どうしたものか。

現地調達!
隣の塔に居るスラルの錆びた鎧を現地調達。これで暗殺成功率は5割落ちるので安心して修行ができます…が。筋力1のキャラの最大積載量は16kg。対してこの鎧は17kgなんですよね。表示も適量になってしまうし。
ただ、このままプレーした限りではなぜか筋力は上昇しなかったのでこのまま使わせて頂きます。

そして全員の暗殺が100になったが…
…まだキャットロンが回復していない。キャットロンの回復速度なのですが、おおよそ1時間で4ポイント回復。なので頭部の150ポイント回復にはおよそ1日半かかる計算。
最初にやった時より効率よく暗殺上げを行ったとはいえ、ちょっと予想以上に回復が遅い。

仕方がないので、ピッキングでも上げるか
とはいえ、器用アームをつけると練習にならないので老兵以外は最低腕に換装。
また、これ以上暗殺を上げる気がない(99→100への上げる時点で1%経験値を上昇させるのにキャットロンを40回くらい暗殺する必要がある)ため、鎧を大カバンにしまう。
お気づきの通り、これが後の筋トレ用ウェイトにないます。17kgの鎧9個とナタを詰めてわざと背負わず、体で持てばそのままのウェイトとなり、2個で300kg以上になります。これに加えて筋力が約4割下がる最低アームをつけて筋力トレーニングする算段です。

老兵以外を全員最低アームをつけて2Fで唯一解錠できる宝箱へ…
あっさり解錠できてしまった。最低アームは器用度や解錠にもかなりのデバフが乗るので時間稼ぎができると思ったがそうも行かない。
それでいて、まだキャットロンの回復には時間がかかる…

めざせインテリゴリラ
キャットロンの塔2F右側に6個研究台がありまして、実はこれ使用できます。
これを使用すると科学のパラメータが上がるのですが…実はもう一つ「見た目が華奢になる」という特徴があるのですよ。
武術、筋力、運動、水泳がマッチョになるのに対して科学と料理は華奢になるのですが…ひょっとして見た目普通のゴリラを作れるのでは?武術上げはキャットロン回復中の1日半の間やることが無いのでコレで時間を潰すのも良いのかもしれませね。

で、回復したキャットロンを再度殴り倒したのですが老兵以外は武術80未満。
このまま研究台で時間つぶしでも良いのですが、今後のデッドウェイト作りを優先する事にしました。
基本的にやる事は、

1.隣のスラルの塔に老兵が侵入、中のスラルを気絶させて鎧と鉈を奪う
2.外で待機させてあるキャラの大鞄に鎧と鉈を詰める
3.大鞄に鎧9個と鉈1本が入ったら、デッドウウェイトが一つ完成
以上を鞄12個分繰り返します

忍者装束を着て隠密91でスラルの塔に隠密で乗り込んでもスラルにバレることは多々あります。特に密集地で暗殺や盗みを行った際には結構な確率でバレます。
ちなみにここのスラルの索敵範囲は驚異的に広いです。なんと隣の塔(キャットロンの居城)に居ても捕捉される可能性があります。
盗み役(基本老兵)がスラルの塔に入り、スラルをKOした後で鎧を剥ぎ、重量いっぱいまで積んだら荷物持ち用のキャラのに渡して行く行程ですが、
本来こういった用途の場合荷物持ちキャラは建物のすぐ外に待機させますが、前述の通りスラルの索敵範囲が広いのでキャットロンの塔の中で荷物持ちキャラを待機させます。
スラルの錆びた鎧とナタ1本を詰め込んだカバンはそこらへんの床に置いておくと無くなりそう(というかキャットロンの居城のガラクタオブジェクトに埋もれて見えなくなる)なので、2階下にある古代の金庫を拝借。ここなら12個の大カバンを入れる事が可能です。
鎧を盗んだスラルがどれか判り辛いので、一度気絶させて鎧を盗んだスラルはついでに腰布と武器も剥ぎ、等級の低いものはそのまま床に放置…とやっていたらスラルの塔が気絶したスラルと散乱したアイテムでカオスな事に…

その後キャットロンを殴ってKOして…
アレ?キャットロンの回復が止まってる…と思ったら。やっぱりキャットロンでも摩耗はする模様。
大体1回KOする度に15くらい頭が削れている。

仕方がないのでひとまず筋力1組のみで3回目のキャットロンをKO
その時のパラメータがこちら





…これ多分、全員の武術の値が85~6辺りでキャットロンの頭を削りきってしまうのでは?又、武術のレベルが82を超えた辺りになると、老兵はカニ鎧ではなく両腕を最低腕にして暗殺者の衣を着せた方が良いようです。蟹鎧から暗殺者の衣に替えると武術のデバフ値が減りますが、最早ベースとなる武術の値が83ともなれば誤差ですし、エコノミー腕と器用腕だけが武術に追加ダメージがないのでこれらの方が与えるダメージが少なくなります。

あとはひたすら武術と研究台のループですが…「最強」を目指すはずが微妙なパラメータに落ち着きそうな予感がしてきています…

2025年6月11日水曜日

メインマシンのメモリを変えてみたり

 米騒動の余波
ここ半月下痢が続いていまして、ストレス性胃炎かと思っていましたが、米に混ぜていたもち麦が消化できなかった為と判明しました。大抵の貧乏生活には耐えられるという自負があったのですが、よもや内臓が耐えられないとは。

以前APUを差し替えたメインマシンですが、どうもカクつくことがありまして。
具体的にはニコニコ動画の読み込みが妙に遅い/Blender の起動が遅い…等がありまして。ニコニコの方は Chrome の可能性も在るのですが、偶に落ちたりもしていたのですよ。
そこで、じゃんぱらで中古でメモリを買ってきました。
速いメモリで2枚共同じメーカーだとコレしかなかった…
またもやコルセアの16GBx2。ちなみにマザーボードはビデオメモリ設定をメモリ総数の半分までに制限しているらしいので、以前は8GBまでだったのが16GBになりました。
※ちなみに以前は4GBに設定していました。流石にメインメモリが8GB以下というのは怖すぎるので。
で、2666から一気に3600にしたのですが…正直そんなに変わらない。iGPU の問題っぽいですね。
あと、以前書いた通り、メインマシンはお手製網戸張りケースなので中の光が漏れるのですが…夜通しつけっぱなしにすると部屋が七色に明滅します。
コレしかなかったので仕方ないのですが、マザボに光の設定が無かったのですよね…
※6/17追記
なにやら起動しなくなりまして…XMP を用いてマザボで 3600Mhz 駆動させていたのですが、起動しなくなった為、3200Mhz に落としたところ起動するようになりました。マザボも古いですしね…ただ、このデスクトップ 750W 電源乗っけているのですよ。ちなみに Ryzen7 8700G を載せたゲーム用の方はケースに付属の 300W 。いくら何でもビデオボードの無いデスクトップで不足は無いハズなんですけどね。温度は75度くらいなのでそこも大丈夫だと思いますが…。又、なぜかビデオメモリ割り振りが2GB以下になってしまいました。マザボが改悪されたように見えるのは気のせいでしょうか?

ちなみにモデリングは
とりあえず、4年程前に作りかけていたモデルの別レイヤーとして顔を置くことはできまして。
アタリを取る為ローポリゴンでモデリングを開始。
以前は下あごにボーンを入れていましたが、鼻から下はセパレートで切り替える方式にする予定。又、目元も瞼をセパレートにする予定。
で、なぜゆえこんなにセパレート?といえば、今回のモデルはセルレンダに特化しようかなと。そうなるとへんな所でエッジがでないかが気になりますが、そこは調整。
顔本体は相当なローポリでも良いハズですが、唇や瞼、まつ毛などは相当なハイポリゴンになりそうなのでシームレスに繋ぐよりも良いのでは無いかと考えています。

ホリのファイティングコマンダーオクタがイマイチ使いこなせませんで
うーん、3Dスティックで必殺技は出るけど、2回素早く横入れしてダッシュとかは普通に無理。
で、ふとセガサターンのパッドは良かったよなあと。20年くらい前は IF-SEGA/ISA という内蔵ボードを使ってPCでサターンパッドを使っていましたが、現在はISAバスそのものが廃れています。
その後も希少なUSB接続セガパット(PC版ぷよぷよの特典。売れ残った物が一時秋葉に流出していた)を使っていたのですが、コレは使いすぎて壊してしまいました。
このセガパットが壊れたのが原因で「チョン除け」が出来なくなり東方を引退していたりします(地霊殿EX…15年前ですねえ)。

今のコントローラはセガパットに勝てねえ
ゲームハードトップにもなってねえセガにだ
だったらどーするよ
なっちまえばいいじゃんセガに

と、思って購入しました USB 変換器。案外手軽に買えるのね…と。
コントローラの方はブックオフで程度の良さそうな物を購入。流石に新品は無いでしょうけど、コンシューマ機の標準コントローラはかなりの数市場に出ているので入手性も悪く無いです。
ちなみに、セガサターンコントローラの十字キーの独特な入力感覚ですが、これはドーム状の軸受けによるものだそうで、セガが特許を持っているらしいです。
一応、retro-bit が出しているセガ公認コントローラも持っているのですが…微妙に違うんですよね、アレ。

という訳で、恐らくコレがベストだろうというパッドは入手しました。まあ GGST を今後プレーするかは謎ですが…
…いろいろな所に配慮してか、ブリジットもそうですが、刺激的絶命拳無くなったりバレンタイン姉妹やディズィーのコスとかどこに配慮しちゃったのかな?って部分ありますよね。
ゲーム速度を遅くしたってのは良い判断でした。リベレーターの速度だと何が起こったのか判らないうちに長いコンボ食らって終了って事もありましたし。
ただ4ボタンで完結するように調整して欲しかったですね、今時6ボタンのゲームパッドなんて碌な物がありません(そしてセガパットに走る事になる)。

ちなみに、当初難易度設定が無かったと聞いているソロモードも難易度設定があって、ひとまず最低難易度攻略をしようとしたのですが…
なんっスかね、1ラウンドも落とさずに進めた際に出て来るあのハチャメチャな難易度のラスボスは。90年代のSNKのラスボスみたいな判らん殺しに遭ったのですが…
まあ、先述した通り今後プレーするかは謎です。

2025年6月6日金曜日

後顧の憂い

 まあ、これから忙しくなる…ハズでして、面倒事は済ませておきたい…と思ったら、あのイベント後にとんでもない数の面倒事を積んできました。
…で、ハイ。
勢いで全て終わらせましたよ。生涯最上位も更新しまして1日だけ1群に入りました。
なぜか今月分の【梅雨限定月間任務】西方海域統合作戦2025 (戦果440)が発生しなかったので、月末には3群落ちする公算が高いですが。
※追記:今月分のマンスリーが出ない件で問い合わせたんですけどね…
先月31日に攻略して、今月分のマンスリーが出ないハズですが…私が6/1日に攻略した?って事なんですかね。
私、残り30時間のタイミング(実際は5/30の20時なので28時間)でマンスリー投入されたから気を付けろ~ってネットで書き込みしてまして、そこの日付も確認しまして。当然自分も31日に攻略したと思っていたのですが、寝ぼけましたかね?
兎にも角にも公式がこのように回答した以上覆りません。現状1群に36時間留まっていますが…月末に2群に残る事を祈るしかありません。例年通りならこの月の2群報酬はフリッツXなんですよねえ…欧州前に手に入るか否かで結構差が出るんですが…

  • ついでで前イベント後のお話を…
まず、前イベント最終ステージの6-2中ボスを63回ほどS勝利したのですが、流石に3隻目のアイオワは出ませんでした。
※ルート選択間違えて6-3に行ってしまった際に2隻目のサラトガが落ちましたが…
同様に2-1も50回くらいは回したと思いますが3隻目の大和も出なかったですね。5隻目の矢矧は出ましたが…既に矢矧改二が3隻居ますが、前イベでも使い切らなかったので育てるかは微妙です。
リチャードは…2隻来ました。2-4で掘りあてて、掘り当てた分を含めて米国艦のみでクエスト攻略していたらもう一隻出てしまった…。

で、前イベ。
公称では突破率63%…では無いですね。
0.9x0.9x0.95x0.96x0.9x0.95と各ステージのクリア率を発表してますが、次のステージを全く出撃せずにイベントを終えた人は突破率に算入されません。
※例えばE1だけクリアしてE2を出撃しなかった人はE2の突破率に算入されず、突破率は下がらない。
なので、E1を挑んだプレイヤーの中でミネアポリスを得たプレイヤーは…良くて5割では。私はイベント以降大将以上、ほぼ元帥だったのですが、あまりに少ないのですよ演習でミネアポリスを見かける確率が。

社員さんはギリギリ攻略できたとか
イベント終了日に攻略。やらせ疑惑とか言われていますが、難度が天地ほど違う後段を前段よりも短い期間(4/15~5/12)で攻略しています。
しかも最後はかなり無理があるタイミングでしたから、普通に考えれば重課金してギリギリ。課金が会社の経費で落ちていないとすればかなり気の毒な事になっていそうです。

再三書きましたが、このイベントかなり炎上しまして目に見えてユーザーが減りました
で、周年記念でアイテム保持数を配ったり、通常海域に初出の艦(リチャード)を入れたりしています。
リチャードは出ない人はとことん出なかったそうですが…まあ夏イベでは普通にドロップすると思われます。夏イベ開始は恐らく8月半ばを過ぎるのでは無いかと思われますが。

リチャード自体は大変良い出来で、尚且つ性能も高い艦です。イベントに投入していれば不満をある程度解消できたのではないでしょうか?ただ、そうなるとこのリチャードの本来の投入タイミングはここだったのか?という疑問が出ます。

大和の通常海域放流もそうですが、フィリピン周辺でミニイベントをやる予定が春イベの1カ月延長で潰れたのでは無いかな?と。
※いや、夏が前段欧州で後段にいきなりフィリピンに飛ぶ可能性もありますが

数年酷いイベントが続き、特に直近2回は明らかにユーザー数が減りました
流石にイベント開催=ユーザー減を理解したでしょうし、そろそろ減ってはいけない人数に届いてきていると思われます。
次こそは「人が減らないイベント」を実施できるのか、それともこれまで通りを推し通すのか…まあ推し通すのでしょうね。

Pの言った事、書いた事を別の人間が添削して、添削内容を反映する事
作ったイベントや機能を別の人間が添削して、添削内容を反映する事

…たった二つだと思うんですけどねえ。