2025年10月31日金曜日

イベント終了?のおしらせ

はい、今回も11時から22時の11時間メンテで実装…と言っていたものの、早々に23:30、26:30と伸びていき…実装は29:40でした。
いや、翌日の5:40。
…こんなの待った自分も大概です。ちなみに36回イベントやって、予告開始時間の延長は34回目だったと思いますが、もう数えるのも面倒です。

とりあえずこんな感じの舐めプ艦隊で攻略してました。案外陸上が弱いのと欧州艦の補正が強いので改になっていない艦でも戦えるのですが…

盛大に誤札
…おいおい、これから日本に戻ってどう戦うんだよ?
ちなみにコレ、バシー(2−2)用の艦隊です。普段は海防艦2隻を混ぜた資源を拾って最短ルートを回る構成なのですが、わざと寄り道をして南瓜合成用の艦を稼ぐ艦隊にしていたのが仇になりました。
あきらめてE1は贅沢な戦いを…と、思ったのですが補正がないので存外弱い。
改めてイベントは補正ゲーだと思いましたね。

最終的にはこんな形でE1-1のギミックは解けたのですが…これから初の中ボス戦です。

バグがあるとか
天霧に対地装備を持たせて敵に対峙すると、自身を含めて僚艦の対地装備持ちも行動不能になるバグが発覚。
…実機デバッグしてないってレベルじゃないですね。
しかも生実況やった所で映像が流れたそうですから流石に隠しようがありません。
できるならサイレント修正ですが…どこかのタイミングでゲームを止めてのメンテが入りそうですね。
※11/1追記 本当にゲームを止めてのメンテを行うそうです。2時間との事ですが…また延期するんじゃないですかね。
※11/4追記 本当にメンテ開始1日前にメンテ時間を1時間延長する旨を通知…いや、多分3時間じゃ終わらないと思うのですが。

2025年10月25日土曜日

弱り目に祟り目

そろそろ就活しなくてはと、まずは以前購入した中古ノートにオフィス2024をインストールしようとしたのですが…なんと通電しない。
ACアダプタを刺しても接続ランプが着かないこの故障のパターンは…アンプ回路の断線。
これは復活しませんね。一応ACアダプタの方も調べましたが本当にダメでした。

で、しょうがないとりあえずオフィスはメインのデスクトップにインストールするか…で良いのですが。

ふと、パソコン処分どうしようかな?と思いまして
調べたら市と提携して無料回収している業者がありまして、更に段ボールに詰めれば多数でも持っていってくれるとの事。ならば大量に詰めてしまおうという事で、ここ十年のノート、タブレットPCの供養を始めたいと思います。

動かなくなったもの
動かなくなった理由は前述の通り。買って2か月弱…なにもできなかったですね。内蔵されていた SSD が回収できたのが唯一の救いですがそれでも1.4万円が吹っ飛んだ事に。

たしか3か月ほどで壊れたと記憶していますが…その間にいくつかのアドオン開発に成功していましたし、非常に安かったので普通に元はとれてましたね。


半年ほどで接触不良が頻発するようなり、そのままご臨終。実は LinuxMint との相性がよくインストールすると直ぐ動くようになるという良い機体でしたが…
これを製造していた Chuwi がまあ仕事が雑なんですよね…。インストール実験では役にたったものの、上記の MacAir もどきよりも実用しなかった記憶が有ります。

久々に通電しようとしとしたら動かなったシロモノ。用途は dGPU ありノートパソコンの設定術を学ぶ事だったので、ちゃんと目的は果たせましたが…。
コレ、実はタブレットと合体しているキーボード部分が壊れたのですが…この機種は特殊な構造をしていまして、タブレット部とキーボード部にそれぞれバッテリーを積んでいる上で、キーボード部には dGPU も積んでいます。
その関係でキーボードに通電していないとタブレット部とキーボード部を分離できません。
分離できていれば6世代 Core i7 タブレットとして使用するという未来もあったかもしれませんが、それでも仮にバッテリーが壊れた場合が厄介です。
通常のタブレットやノートPCはカバーがネジと爪で留められており、専用工具を隙間に入れてこじれば開けられるのですが、Surface シリーズは熱圧着シールで封印されているためカバーを外すのが並な難易度ではありません。
遠からずゴミになる事が解っていたので今回棄てる事にしました。
※最近アキバで Surface の中古品が大量に出回っているのもこういった事情があるんですよね。

  • ARROES Tab Q506
これは買った時の記事が無いですね…何時買ったのか覚えていません。
イオシス名物の ARROES Tab の B 級品。…覚えているだけでイオシスのアロタブは4回買っているのですが…これは速攻でバッテリーが妊娠したものの、交換する方がお金がかかる為に放置していたシロモノ。
いまさら ATOM X5 ってのも(実は 2C/2T の Celeron より早いのですが)あと、32ビットOSしか載らず、Debian Manjaro 両 Linux もサポートを辞めた現在使い道がなくなりました。

新進の中国の会社が世に送り出した当時唯一の AMD CPU を積んだタブレット…この会社の社長さんが中国の海で変死して最後の製品になるというある意味ドラマチックな一品でした。
当時のタブレットとしてはグラフィック能力が強かった事と AMD 製 CPU だけあって Linux と相性が良かった(当時はAtom全盛でしたが、Windows8 は無料提供する代わりに efi を 32Bit に制限するという規制を行っていた為、Intel Atom 系は Linux と相性が良く無かった)のでかなり期待したのですが…たしか半年程度でこわれたハズ。

生涯2台目2in1ノート。PentinumM という骨董品級の CPU で頑張り続けた機体。最後はうっかり鞄からアスファルトに落として大破、なんかかわいそうな事をしたなあと今でも思います。何度もバッテリーを交換して使いました、もちろん元はとれてます。


多分動くもの

確か同じものを2台買いました。これもイオシスのアロタブです。やっぱり32ビットOSしかインストールできない為、使い道がなくなり撃沈。
もともと、64ビットがインストールできないという噂を聞いて無理やりインストールする方法を模索して遊ぶ為に購入した代物です。
当然ダメだったのですが…まあ遊べたという事ですかね。

気の遠くなるような Windows10 インストールをやった記憶しかない。一応動いたのですが全く実用的では無い速度で使用をあきらめて7年放置してました。これのページ、なぜか閲覧数が多かったんですよね。誰かの役に立ったから良かった…と思う事にします。

私の初めての 2in1 マシンであり、長らく実験母艦でした。3.5インチベイへのアクセスが良く、SSD の初期化をライブ USB を使って行う時にも重宝した他、格安 2.5 インチ SSD をそのまま入れ替えて複数の Linux をレビューする事もやってました。
キーボードの性能も良くモデリングに長らく使用していました。現状ではパッドのクリック部分等の樹脂部分が経年劣化で溶けてしまっており使用が辛い状況です。
たしか3回程バッテリーを買い替えながら使っていましたがとうとうリタイアと相成りました。もちろん元は獲れてます。

現役でした。メール受け専用機としていましたが見ての通りの有様です。役目を Core i7 3770 を載せた Esprimo にバトンタッチしてリタイアです。
まあ7年間もメール受けをやっていたので十分だと思います。

虎の皮
死して遺すというアレです。

  • EliteBook 2760p のパーツ
インテル製 WAN と 8GB DDR3 メモリ。恐らくこの第二世代 Core i5 マシンに最大限積める物を選んだと思います。このパーツが他で役に立つ事はもう無いとは思いますが。

  • LIFEBOOK P3210 のパーツ
DDR の 1GB メモリはともかく左の SSD は超レアパーツです。そもそも PATA の SSD がレアなのですが、それが1.8インチとなれば普通にはお目にかかれない一品です。私もどこでコレを購入したのか全く覚えて居ません。たしか初期状態では1.8インチの HDD だったハズなのですが。


という訳で散々な厄年に対して厄払いを兼ねての大掃除でした。
私の厄年もあと1.5カ月。コレで厄が払えていると良いのですが。







2025年10月24日金曜日

あらら25回目のランカー入り

 ひさびさにクオータリー落ちしたっぽいです。
たしか3800位は取っていたハズですが…クオータリークエとEOは獲れたもののその後は仕事が忙しくて手が回っていなかったので、戦果が最終的にいくつだったか覚えていない。
まあ仕方ないかぁ…とは思ったんですが、今回は報酬が当たりらしいんですよね…今年はとことんツいてないデス。

ランカー入りしてました(25回目)

以前2群入りした時も、報酬2個が手に入った後、数時間後に3個目の報酬が入る事はあったのですが、他の人の報酬が入ったのが前日の22時だったのに対して私は翌日の3時過ぎだったのですが、どうしてこんなにラグがあるんですかね?手動で報酬を配っているのでしょうか?せっかく良い装備を配ったのにコレでは…

以前の基地航空隊の墳式機もそうでしたが、半径4に攻撃をするんですかね?それとも延伸必須なんでしょうかね?

モデリング再開

先日出来上がったプログラムのおかげでリギングの方向性が大きく変わりました。
筋肉のパンプアップ制御をボーンでやらないことになりまして、それは良いことなんですが…。Blender2.8 の時代から作っていたモデルに継ぎ足そうかと考えていたのですが方向性が変わるためバッサリ新造する方向に。
工程としては…

  • アタリ(面を張らないモデル)を作る
バランスを見るため。又、私は二次元絵はポンチ絵程度で下絵を描けないのでその代わり。

  • 簡易骨格と簡易モデリング
骨格は関節位置の確認用。簡易モデリング…といってもこれはほぼ本番。

  • リギング
簡易モデルを使って曲げやひねりの際に極力崩れの出ないようにリギング。
一般的にはこれで体のリギングは終了。

  • 筋肉の付加
簡易モデルの各所を細分化して筋肉を作り込む。
リギングで崩れないように再調整。

  • パンプアップシェイプ作成
…実はこれが一番面倒。元のモデルの頂点数が変わると化けたりするので。
当たり前ですが全身はシームレスに繋がっているので、全身の筋肉を作るより目立つ所だけ作るようなオミットは必要になりそうですが…
多分賽の河原みたいなやり直し作業の嵐になると思われます。

以後、顔、髪、服…と作るのですが、体だけでもこの工数、泣きそうです。

で、アタリを作ってみた

下半身偏向体型なのは以前作った物と同じ。ただ、前回「作り込むほどモデルが細くなる」という傾向だったので、容赦なく太いです。
上半身は視線誘導の意味もあって筋肉の「彫り」を頑張る予定、ですが…
身長2m。8頭身。股下1m。リーチ215cm。足のサイズは28cm。腰回りは…想定してませんが多分140cm行くんじゃないでしょうか?
数値はかなり人外ですが、一応人体の特徴である「身長と大腿骨の長さが比例する」という部分は押さえています。この為比率として太腿に対してひざ下の長さが短くなるためヒールを履かせないとバランスが悪くなります。
同一線上に大腿骨の骨頭、上腕骨の肩、肘、手首の関節、首の付け根の関節を乗せる。
…正直に言えばこのポーズは不自然なんですが、いわゆるT字立ちポーズからじゃないとモデリングがやりにくいし動かし辛いんですよね。

腕の長さは問題無さそう。


足は骨盤の関係もあって開きすぎているのでX脚気味に調整。本当はここまで骨盤が大きければ肘も猿腕気味にした方が良いのですが、最終目標を「格闘アクション」としているので出来る限りまっすぐな体にしたい(そうしないと動きを作る時に大変そう)。

最近生き急いでる感がありますが
まあ、就職もせにゃいけませんし。ともあれ、今年の1月に書きそびれた目標を今更書くのですが「人体モデリングの本格再開」なのですよ。
人体モデルの作成は2016年あたりからやっているライフワークだったのですが度々年単位の中断を挟んでいました。なんなら私がモデリングを始めたのは前世紀の六角大王であり、六角大王スーパーでモデリングしていた際には生涯で最初で最後のオフ会参加をしていたりします。

人体モデリングはモデリングは当然の事、人体に対する美術解剖の知識と Blender ならアドオンを開発する知識があれば尚良い等、総合力が必要になる「ライフワーク」として挑みがいのある課題です。
※しかも挑むだけならタダだし

それをなぜ今年?と言えば「年齢が48だから」だったりします
14歳の時に親にお金を貰ってMSX2を買いまして、アレはプログラムができないとほぼただの箱(ロムカセット等で遊ぶことはできますがそれだとファミコンの下位互換になってしまう)なのでプログラムを覚えました。当時はMSX-FANの読者で偶に投稿なんかもしてまして(補欠採用しかされませんでしたね…)。
当時でも時代遅れのZ80マシンでしたから、当然処理が遅い訳で1年後にはコーラルの SimpleASM 買ってマシン語叩いてました。
※結構な値段がする上で、ソフトベンダーTAKERUで購入(昔懐かしいファミコンのディスクシステム販売みたいな物)だった為、マニュアルは申し込んで郵送してもらう必要がありました。
…あれがMSX-FANのおまけになった時は泣いたものです。

その後19歳でゲーム業界に入り、いろいろあって31歳でプログラマーを引退した訳です。
つまり、一つの技術体系に一定の区切りをつけるのに17年かかりました。

今から17年後は65歳であり、現状でも相当衰えている頭がかろうじて思考能力を保っている限界と思われます(というか生きているかも怪しい)。なんだかんだと中断を続ける時間的余裕がもうなく、今始めないと後悔して死ぬ事になりそうという事で若干掛かり気味になっています。

今年はとんだ厄年になりまして
本来「それどころじゃない」という所なんですが、やはりワークよりライフなんですよ。
生きれないから死ぬと言うならそれまでの事、自分の命を自分の為に使えるという事こそ独り身最大の贅沢だと思います。

2025年10月22日水曜日

LMDE7 β版 がリリースされまして

これの元である Debian13 も Mate 版をこっそり試したりはしていたのですが、やっぱり Debian は合わないなあという事で断念していたのですが、LMDE7 β版が出たので再トライ。たしかコレまでのβ版はそのままアップデートしていれば正式版になったハズなので、このまま入れても問題無いだろう…と。

まず問題になったのはどのマシンに入れるのか?
つい先日 Windows10 のサポートが切れた LenovoYoga310 …と思ったのですが、中に入っているデータのバックアップと Celeron 3050 という非力過ぎるマシンでは有意義な結果は出ないだろうとの事で断念。
じゃあ intel N100 辺りのミニPCを中古で買うかとアキバに行ったのですが良いマシンが見つからず…ふと気づいたのですが…だいぶ前に買って CPU を i7 3770 知る人ぞ知るサンディーおじさんの至宝 コレ第三世代だから Ivy でしたね)に換装した富士通 Esprimo が放置されてたなと。

性能を調べると N100 とほぼ互角。Core i7 の 4C/8T が Atom の末裔の 4C/4T に追いつかれるとか凄い時代になったもんだと思うべきか。2011 2012リリースの CPU が未だに現役で使える事を驚くべきか。

タッチドライバ問題
さておき、このデスクトップ、実は骨董品(18年前に購入したと思われる)の15インチ感圧式LCDに繋がってまして。
普通にインストールしたら、タッチセンサが誤動作していました。これは毎回起こる事で、キャリブレーションを治す…
というか、設定を書いた 99-calibration.conf を /etc/X11/xorg.conf.d/ に放り込めば良い。

…で、xinput_calibrator をかけたら…出力の書式が間違ってる。
コレ、5年以上前からある問題で、xinput-calibrator のインストールをやり直すのですが…
出力されたものがこちら
これをそのまま使うと、今度はタッチパネルは動くがマウスが暴走する。

原因は見慣れないコイツ。

これを古い記述法に描き直すとちゃんと動く。
…うーん、次期 Mint 大丈夫だろうか?

Linux と言えば
自称独裁者のリーナスおじさんが又キレたってニュースがちょっと前に出てました。正直、いつもの事…なのですが。
このおじさんを怒らせた「糞コード」。実はAIで書かれたコードらしく、「そんなんいらんやろ」というリンクがアホほど貼られていた為に怒ったとか。
…コードをAIに書かせるのも限度はあると思いますが、成果物のレビューすらできない人間がOSを開発しているとか流石に世も末で、おじさんが怒るのも当たり前だと思います。

2029年に「コンピュータが人間の知性を追い越す」≒シンギュラリティが起こると予測されていますが、人類の知性が退化して後押ししているのだとしたら未来は暗いと思わざるをえません。

2025年10月16日木曜日

一応、今週のウィークリーと全EOの攻略はやりましたが

…セキュア化ですか。今年中にやるぞーと言ったのは1月だったのですが…
で、メンテ明けで南瓜クエストの後段、今月中にイベント前段実装。
来月にイベント後段実装と同時に秋刀魚クエストの実装…だそうです。

無理

※11/10追記
予想通り、11/9日曜日11:00実装~から始まって、20時、22:45、26:45…最終的に10日の9時へ延期。
22時間遅れて、秋刀魚衣装に変えたらキャラの表示位置がズレるというしょうもないバグが散見されるというありさま。
実装前に仮サーバーで環境作ってテストしないのでしょうかね?
全キャラ1隻ずつ入った仮データ用意して、秘書艦に設定→表示を1隻10秒くらいのペースでやっても1時間あれば終わりそうですが。ログインして直ぐに発覚するバグがあるのは流石にお粗末ですね。無論、直に発覚しないバグもあるのでしょうけどね。

セキュア化実装と同時に開発会社が丸ごと入れ替わりでもしない限りこんな密度の実装はできません。以前、次期イベントはずれこんで10月中旬と予想していましたが、それすら下回ってこのありさまです。
セキュア実装で不具合が起こって→再メンテ、11月にイベント開始が関の山、本当にやるなら12月まで秋刀魚を獲っていると思われます。
…というか、次期イベント今年中に終わりますかね?

直近ではネガティブな情報が多い
まず後ろ盾になっていたKADOKAWAが離れてしまいました。
コンプティークから放逐された際に作った機関紙も終了、発行していた会社?も解散となっています。
実質最新情報を流していたカレー屋も閉店。
既に内部で動いているOS(商業用のwin7)も限界のアーケードが実質終息すると発表(カード用の素材の問題もあるとか)。こっちは来年で10年目なのでアーケード的には大往生だと思いますが。
ゲームイベントは150日に1回くらい(前回は200日以上間が開いてました)なのに、年間二桁くらいやっているオフイベの方もあまりに無茶苦茶やっているので苦情がきたようです。
※榛名バンジーとかやってた頃は笑って見てましたが、流石にオフイベの予定発表が1週間以内とか論外じゃないですかね。

…正直な話、C2の次期ゲームの開発が順調だったらお金をかけてセキュア化などせずに次期ゲームに誘導だけ行ってサービスを終了させたと思います。

ユーザーの作ったツールに配慮するとか言っていますが
エコシステム…ですか。以前はツールは禁止するとか言っていた気がしますが、多すぎるマスクデータや煩雑すぎる操作等本体の不完全さを補完する物が多いですからね。
いい加減本体を治せと思います。個人的にはクエストに不満点が多いです。

明示されていないのに第一艦隊で行わないと失敗になるクエスト
1個ずつ廃棄しないとならないウィークリー「資源の再利用」
補給行動1回ずつをカウントするデイリー「艦隊酒保祭り!」
「旗艦+随伴」クエストと「旗艦+2番艦」随伴クエストの混在
工廠クエストの「廃棄」と「準備」

などなど、クエストを作った作業者がちゃんと共通のルールを作らずに煩雑に増やした結果だとは思いますが、高リスクなクエストをやらせるくせに成功条件の説明が解り辛いんですよね。特に最近二桁のアイテムを要求する事が多い工廠クエストなんて誤って「廃棄」するととんでもない事になりますし。
※そもそも攻略するクエストをマニュアル選択させるネットゲーなんて13年前にプレーしていたPSO2くらいしか聞いた事がないような
あとは…既に絶滅種ですがビギナーには判り辛い勝利条件とかですね。演習とかでもよくありますが、表示上では耐久1でも小数点以下で撃沈判定になっていなかったので敗北とか、12年経っても改善されていません。

外部ツールやサイトがあると攻略が有利になる…では無くて、外部ツールやサイトが無いとゲームとして成立しない体制が変わっていません。※私はツールを使っていませんが
…外部サイトを一切見ずに遠征を成功させるのは相当な苦行ですし、マップの分岐条件を自力で見つけるのはほぼ不可能でしょう。少なくともイベントマップの分岐条件をイベント期間中に発見できるユーザーは千人に一人位でしょう(もっともリアルユーザー総数が10万人切ってそうなので全員が数万人に一人なんですが)。

そもそも、ゲーム内にメンテナンス期日が表示されない
20年前のゲームでもやっているような「ゲーム内での告知機能」がありません。そもそも今回のアップデートは予告の時点で18年の第一期終了に次ぐ長時間メンテですが画面外に表示されたのは前日。
ゲーム公式発表の運営電文では発表すらされていません。

2年以上前にウェブブラウザから危険なサイトとして弾かれてしまい、やっと対応に動いた(成功した訳では無い)だけ。
ゲームだけで完結する形には最期までならないであろう事は想像に難くないですが、せめてこれ以上晩節を汚すような真似はして欲しくないですね。

2025年10月14日火曜日

シェイプキーとアーマチュアを関連付けて筋肉を表現してみたい3

なんと、一応動作する所までできました。
という訳で、いきなりソースコード

import bpy
import math

class B2S_data:
    def __init__(self):
        self.bone : bpy_types.PoseBone = None
        self.length = 0.0

        # direct full
        self.shape_df : bpy.types.ShapeKey = None
        # direct 1/2
        self.shape_dh : bpy.types.ShapeKey = None
        # direct 1/3
        self.shape_dt : bpy.types.ShapeKey = None
        # direct 1/4
        self.shape_dq : bpy.types.ShapeKey = None

        # inverse full
        self.shape_if : bpy.types.ShapeKey = None
        # inverse 1/2
        self.shape_ih : bpy.types.ShapeKey = None
        # inverse 1/3
        self.shape_it : bpy.types.ShapeKey = None
        # inverse 1/4
        self.shape_iq : bpy.types.ShapeKey = None

# Shape Prefix
preShape = ("b2sdf","b2sdh","b2sdt","b2sdq","b2sif","b2sih","b2sit","b2siq")

while bpy.context.mode == 'OBJECT':
    
    scene = bpy.context.scene
    
    frame_backup = scene.frame_current
    frame_start  = scene.frame_start
    frame_end    = scene.frame_end
    frame_step   = scene.frame_step

    for obj in bpy.context.selected_objects:
        if obj.type != 'MESH':
            continue

        # find allocation bone
        arm = obj.find_armature()
        if not arm:
            continue
        
        shape_keys = bpy.data.meshes[obj.name].shape_keys
        if not shape_keys:
            continue
        
        # make work table

        listB2S = []
        
        for bone in arm.pose.bones:
            if bone.name[:3] != "b2s":
                continue
            
            mydata = B2S_data()
            bFindShape = False

            mydata.bone = bone
            mydata.length = arm.data.bones[bone.name].length

            # find shapes
            for i in range(0,8,1):
                nameShape = preShape[i]+bone.name[3:]
                
                if shape_keys.key_blocks.find(nameShape) == -1:
                    continue
                shape = shape_keys.key_blocks[nameShape]

                match i:
                    case 0:
                        mydata.shape_df = shape
                    case 1:
                        mydata.shape_dh = shape
                    case 2:
                        mydata.shape_dt = shape
                    case 3:
                        mydata.shape_dq = shape
                    case 4:
                        mydata.shape_if = shape
                    case 5:
                        mydata.shape_ih = shape
                    case 6:
                        mydata.shape_it = shape
                    case 7:
                        mydata.shape_iq = shape
            
                bFindShape = True
            
            if not bFindShape:
                continue
            listB2S.append(mydata)
            
        # frame loop
        for frInsert in range(frame_start,frame_end+frame_step,frame_step):
            scene.frame_set(frInsert)

            for work in listB2S:
                vec = work.bone.head - work.bone.tail
                
                base_rate = math.sqrt(vec.x*vec.x + vec.y+vec.y + vec.z*vec.z) / work.length
                if base_rate > 1.0:
                    base_rate = 1.0
                
                # insert key
                if work.shape_df:
                    work.shape_df.value = base_rate
                    work.shape_df.keyframe_insert("value",frame=frInsert)
                if work.shape_dh:
                    work.shape_dh.value = base_rate/2.0
                    work.shape_dh.keyframe_insert("value",frame=frInsert)
                if work.shape_dt:
                    work.shape_dt.value = base_rate/3.0
                    work.shape_dt.keyframe_insert("value",frame=frInsert)
                if work.shape_dq:
                    work.shape_dq.value = base_rate/4.0
                    work.shape_dq.keyframe_insert("value",frame=frInsert)
                if work.shape_if:
                    work.shape_if.value = (1.0-base_rate)
                    work.shape_if.keyframe_insert("value",frame=frInsert)
                if work.shape_ih:
                    work.shape_ih.value = (1.0-base_rate)/2.0
                    work.shape_ih.keyframe_insert("value",frame=frInsert)
                if work.shape_it:
                    work.shape_it.value = (1.0-base_rate)/3.0
                    work.shape_it.keyframe_insert("value",frame=frInsert)
                if work.shape_iq:
                    work.shape_iq.value = (1.0-base_rate)/4.0
                    work.shape_iq.keyframe_insert("value",frame=frInsert)
                
        scene.frame_set(frame_backup)
        
    break

コードここまで

…どちらかというと、Python に慣れていないことが露呈しまくっているコードだと思います。そもそも私は現役時代は C++ だったのでここの知識をベースに作成しています。故に差異があるととたんに躓くのですよね。
では、解説…というか、躓いた部分の言い訳を列挙していきます。

class B2S_data:
構造体が無いので class を使うというのは知っていたのですが、メンバーを直接読み書きする形で利用しています。正直行儀が悪いのは解っているのですが、こうでもしないと使えません。
  • 8個の shape を持ったクラスをノードとしたリストを組んでいますが
まず、ボーンとシェイプキーを関連付けるために名前の接頭語(プレフィクス)にルールを設けます。
最初に両者とも最初の3文字を b2s としています。これは from Bone to Shape からとっています。
次に shape の4文字目は d もしくは i これは direct inverse の頭文字で正作用、逆作用を意味します。
筋肉は引っ張る動きしかできないため、たとえば肘を曲げる筋肉があれば、肘を伸ばす筋肉が別途必要になります。
屈筋、伸筋と言いますが、肘ならば上腕二頭筋が屈筋、上腕三頭筋が伸筋になります。
肘を曲げると延びる係数ボーンを観測するなら、屈筋は正作用、伸筋は逆作用(つまり曲げる程しぼむ)すれば良い訳です。
で、shape の5文字目は f h t q となっておりそれぞれ 1/1 1/2 1/3 1/4 の反映率で分けています。
肘のように1方向のみに曲げる関節の方が稀で大抵は筋肉と関節は複雑に関係している場合が多く、例えば背筋をパンプアップさせようとしたら背骨を逸らした上で両腕も後ろに動かす必要があります。
このような場合に、同じ形状のシェイプキーを複数用意し、半分ずつ影響させる…といった動作を想定して作りました。
まとめると、1本のボーンに対して正作用、逆作用のそれぞれ4種の反映率の最大8個のシェイプキーに影響させる為のデータを保存するためのクラスという事になります。

# Shape Prefix
今回始めてタプルを使っていますが、配列っぽく使える define 文程度の認識で使っていますがこれで良かったのでしょうか?

# make work table より前の部分
これは第二回で行っていた処理と同じなので解説は割愛します。

# make work table
先述の B2S_data クラスのリストを作ります。ボーン名に b2s プレフィクスを持つボーン(係数用ボーン)抽出し、発見できたら同プレフィクスを持つシェイプキー(係数に影響されるシェイプキー)を探して登録していきます。
尚、[]がC言語で言う所の配列ではなく、VC++ の CList のようなもの…ということは何年か前にビットマップ表示プログラムを書いた際にハマったので覚えていましたが、未だにこのリストのスライス等の扱いが曖昧です。

今回はじめて match 文を使っていますが、これは Python3 から導入されたそうです。まんまC言語の switch 文と同じ使い方をしていますが、case には条件文をそれぞれ入れられる…のですが、調べてみるとこの条件文の書き方がだいぶ怪しい感じで…次期 Python で又大幅変更があるんじゃないかと危惧するのは私だけでしょうか?
Python の下位互換性を信用できないのは私だけでは無い(2から3への移行のグダグダを知っているので)とは思いますが、今後に不安を感じる文だなと感じました。

# frame loop
各フレームでのボーンの影響度を計算して、各シェイプキーのキーフレームを打っていきます。
尚、シェイプキーを打っている処理そのものは

keyframe_insert("value",frame=frInsert)

なのですが、「Pythonツールチップを表示」機能を使って、シェイプキーのキーフレーム追加部分をマウスオーバーしても「プロパティのアニメーション」と表示されるだけ(ver4.51時点)で Python のコードは表示されず、結構ハマりました。
特に、メンバー変数の value に値を入れた後に、keyframe_insert では "value" と文字列で指定して追加するというやり方は直感で思いつくものでは無いと思います。

プログラムを通して
B2S_data クラスにある shape_xx メンバーを shape[] 等のリスト型にすればソースコードが大分短くなる…というのは重々承知しています。
ただ、こう書かないと意味を忘れた時に困るだろうと思って可読性を優先しました。

係数ボーンの係数は
if base_rate > 1.0:
    base_rate = 1.0
とある通り、1以下(100%以下)に制限されています。又、この係数はスカラ量を元にしていますので、必ず正の値になります。
ボーンが短くなる限界を突き抜けてベクトルが逆(マイナス方向)に動いた場合でもスカラ量を取っているため正の値が増える事になります。


実際に動かしてみる
まず第一回でやっていたなんちゃってデータに対して実行してみます。
すると、当然大量のキーが打たれまして…
こんな感じに。第一回はシェイプキーを開始と終了の線形補完で動かしていたので今回の方がより生物的な動きをしている…のですが正直そんなに変わらないですね。

次に伸筋を作ってみる
伸筋(上腕三頭筋)を作ってみます。
肘の曲げの係数を取るボーンを b2s_hizi
屈筋のシェイプキーを b2sdf_hizi
伸筋のシェイプキーを b2sif_hizi
と命名しています。命名の規約は前述の class B2S_data の解説の通り。
※ところで hizi ってなんだよ、hiji じゃないのかよ、と作ってから気づきました。平たい顔族にローマ字は難しいのです。
で、こちらは単体ではこんな感じに動きます。

いざ実行
とりあえず、正作用、逆作用の同時処理はできているようです。

作ってみた感想
…いやあ、半年かかって出来なかった物が一週間で出来てしまいました。脳が活性化しているって大事なんだなあと思いましたね。
これにて筋肉の造形はシェイプキーに任せる事が可能になりました。
※以前作っていたモデルの背面。肩口に筋肉を表現する為のボーンが密集している。
通常のリギングと筋肉のパンプアップを分けて作る事が出来る上に動作の破綻部分の調整にもシェイプキーを活用できるので相当効率が上がりそうです。
ちなみにはじめて顔以外の全身モデルを作った際は2016年9月から2019年10月までという実に3年もの時間がかかりました。
こういった物を作っておかないと、モデルが出来る前に自分の寿命が終わりかねないのですよねえ。
又、この時期は働きながらモデリングやプログラムができる環境にありましたが、直近2年はそういった環境にありませんでした。
日本のトップすらライフワークバランスを棄てる昨今ですが、ライフに重点を置いた生活がしたいなあとしみじみ感じますね。


2025年10月13日月曜日

親父殿からSOSがありまして

やっぱりお宝だった X390
先日購入したジャンクの X390 を整備した所、バッテリーが1時間程もつことが判りました。で、rufus でインストールメディアを作って windows11 を入れてみた所…
お前、Windows11 PRO やったんやな。
なんと11PROのライセンスが入ってました…。
結局壊れていた所は右側のUSB接続端子だけでしたね。マウス繋げるのが面倒なだけ。

で、昨日親父殿から連絡が入って
windows10 の問題について…と来たので、HAHAHAとっくに11になってるでしょ?と返信したのですが、なんと本当に10のままでした。
というわけで、ジャンク品の再生に使ったインストールUSBメモリと共に緊急帰郷。
最初はマイクロソフトのページから診断ソフトを落としたのですが…
親父殿の X1 Carbon 2016 は CPU が i5 6200U で CPU を理由に要件切りされたのですが…
アレ?足切りラインって2スレッド以下じゃなかったか?と思い、バックアップを取ってクリーンインストールを敢行…
rufus で作るインストールメディアは地味に優秀で余計な機能を削ぎ落してくれます。
で、結局インストールは成功したのですが、驚いたのはそのあと。
親父殿のパソコンはマイクロソフトのアカウントを作っていたのですが、どういう訳かバックアップ機能が生きていて OneDrive へ情報を逃がしていたようです。
インストーラーが、バックアップの力を見てくれとかドヤりだしてビックリしたのですが、実際デスクトップ上やローカル上のファイルと Edge の設定が全て復元されました。
特に親父殿は Edge 上の Web アプリからメールを観ていたのでコレが死ぬと致命的だったのですが復元したのは素直に関心。
私は個人情報をクラウドに置く事はあまりしたくない(じゃあこのブログはなんだと言われそうですが)為、OneDrive を未使用にして極力マイクロソフトのサービスを切っているのですが、親父殿のマシンはバックアップ系だけデフォルトのままにする事にしました。

残念な点も
Edge のショートカットも復元されたのですが、なぜか Google 検索のショートカットが復元されませんでした…おいおい。
あと、インストールされていたソフトも復活するハズですが、おそらくMSストアからインストールしたアプリしか復活しませんね、Office 2010 が削除されてしまいました。

私は失職した事も有り、以前書いた通り Office2024 を買い直しました…3.5万円
ただ親父殿は既に仕事を引退しており、時折送られてくるエクセルを見るだけで、自分でエクセルを使うのは小遣いの管理だけと言っていたので WPS Office を提案。

親父殿曰く「Windowsアップデートしたらオフィスが無くなって1台3.5万のを買えって言われたら、買えない会社が出て来るだろ」

おっしゃる通りで、中小企業は大変な事になってるらしいですね。

無事に済みまして
…こんな事ができるなら、パソコンのサポート関係を仕事にしろよと言われましたが。
この程度で仕事になるなら15年くらい前にパソコン整備士3級をとった際に就業できてるんですよねえ…。今後技術職の仕事を覚えられる気がしませんし、せいぜい出来てキッティングの助手程度、役所関係の非正規とかがあれば御の字ですかねえ。

 

2025年10月11日土曜日

シェイプキーとアーマチュアを関連付けて筋肉を表現してみたい2

退職を伝えた日は仏滅だったのですが、吉日だったそうです。ひと粒万倍日とかだそうで…生涯初めて1年で2回退職しましたが、これは3回目もあるんでしょうか?
その会社の事務の方から電話がかかってきましたがひたすら謝られてしまいました。いや、今どきこんな昭和みたいな会社あるんやなあとは思いましたが、特に謝られるような事は…私と同日に入社1週間で辞めた方とは揉めたんでしょうか?
定期的に人事がえらいことになっているのかもしれません。
又、丁度国税調査をやっていましたが…確かに調査対象の日程は就業してましたが回答する時点では退職しているんですよね…これ、情勢と合わないのでは?

さておき、今日も元気にプログラムです
とりあえず、ボーン名決め打ち(test_bone)で伸縮割合を出すプログラムを書いていきます。最初に考えるべきは、このプラグインの主体ですが、アーマチュアとシェイプキーを割り当てられたメッシュオブジェクトが主体になります。なので、プラグインはオブジェクトモードで起動する事にします。

コード開始

import bpy
import math

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

    scene = bpy.context.scene
    
    frame_backup = scene.frame_current
    frame_start  = scene.frame_start
    frame_end    = scene.frame_end
    frame_step   = scene.frame_step

    for obj in bpy.context.selected_objects:
        if obj.type != 'MESH':
            continue

        # find allocation bone
        arm = obj.find_armature()
        if not arm:
            continue
        
        # find allocation shape
        shape_keys = bpy.data.meshes[obj.name].shape_keys
        if not shape_keys:
            continue

        bone = arm.pose.bones["test_bone"
        length = arm.data.bones["test_bone"].length
        
        # frame loop
        for frame in range(frame_start,frame_end+frame_step,frame_step):
            scene.frame_set(frame)
            
            vec = bone.head - bone.tail
            scalar = math.sqrt(vec.x*vec.x + vec.y+vec.y + vec.z*vec.z)
            print("frame/",frame,":length/",scalar / length)
            
        scene.frame_set(frame_backup)
    break

コードここまで

順を追って解説していきます。
最初は現フレームと開始/終了フレーム等を拾っています。

次に選択されたオブジェクトを拾うループに入ります。
拾ったオブジェクトに対して、メッシュオブジェクトか?アーマチュアが割り当てられているか?シェイプキーが割り当てられているか?
を調べ、該当しなければ処理から除外します。

次にオブジェクトに割り当てられたアーマチュアの中から名前決め打ち(test_bone)でボーンを抜いてきますが…
arm.pose.bones と arm.data.bones の2系統からデータを引いてきています。
pose の方はフレーム変化に伴うボーンの移動等により値が変化しますが、data の方は変化しません。どちらにもボーンの先頭と末尾を示す head tail のメンバーがあるのですが data の方は値が変化せず、結構ハマりました。

# frame loop 以降は各フレームでのボーンの長さを求めて、元々のボーンの長さで割り比率を求めています
ココで解説すべきは…

scalar = math.sqrt(vec.x*vec.x + vec.y+vec.y + vec.z*vec.z)

二乗の和の平方根=スカラ量≒ベクトルの長さ≒ボーンの現在の長さ
いやあ、スカラ量を求める計算なんてゲーム業界辞めてから20年近くやってなかったですね。まあ法線を必要とするプラグイン開発をしょっちゅうやっていたので流石にすぐに出ましたけど、覚えているもんなんですねえ。

で、結果がこんな感じに。
順調に値が変わっているのが見て取れます。次はこれらを使ってシェイプキーを打つプログラムですかね。

2025年10月7日火曜日

再求職?

 はい、私も数えないといい加減解らなくなるのですが8回目の退職です。
先週の金曜日に工場長に休憩室に呼ばれまして、覚えが悪い…と。
まあ、おっしゃる事は全てごもっともなので、週明けの朝にお世話になりました、となりました。1ヶ月半でしたが、なんというか帰宅部が間違って野球部に入ったような場違い感がありましたね。

で、それが就業前の時間でそのまま∪ターンして自宅で着替えて(自転車で駅2つ分ターン)制服をクリーニング屋へ渡して、そのまま職安。手続きが終わって昼食とって、そのままアキバに行ってショップインバースの月曜セール(ノートパソコン割引)を見に行くわけで。
この工場に入って最も良かったことが短期間で行動力と体力を戻せた事…ですが、これ以上このブートキャンプは続けられなかったと思います。
良いタイミングで詰めてくれた工場長には感謝するべきでしょう。

で、表題なのですが職安に行った所、扱いが再求職になってました。
前回の就業保険受給から1年以内だとこうなるそうです。更にいうと受給のうち約2ヶ月分を受給していなかったため、これが受給できるのだとか。…超短期退職だったため相当重いペナルティを覚悟していたのですが、拍子抜けではありました。
今後は気力と体力が落ちないうちに再就職先を見つけなければなりません。

ちなみに
アキバのショップインバースで購入したのはセールと関係ないこちら。
ThinkPadX390 衝動買いでした。
普通に画面は映りますし、SSDは PCIe Gen3 ですし、メモリに至っては16GB入ってました。どの程度保つか判りませんがバッテリでも動作します。
見ての通り外見不良が殆どで7000円。
ちょっと掃除した姿がこの通り。WIN11が載る可能性があるので、ひとまず試していますが顛末はまた後日。
ただ、使い途は無いので甥っ子に渡す予定です。

2025年10月5日日曜日

シェイプキーとアーマチュアを関連付けて筋肉を表現してみたい1

 以前書いていたまた次回と言っていた内容です。

…以前まともに体をモデリングしていたのが21年…当時のバージョンが2.8だったのに、今使っているのが4.51。月日が経つ速度が恐ろしいです。
モデリングでアニメーションをさせる際に必要な物は雑に3種。
ボーンを使ったリギング。テクスチャ切り替え。そしてもう一つがモーフィングです。

…すっかりモーフィングを失念してました。
これまで筋肉の隆起をボーンで制御しようとしていましたが、筋肉を描写する際に筋肉繊維の中心にボーンを置いて拡縮するだけでは流石に限界があります。
で、思いついたのが、筋肉の弛緩と収縮をモーフィング(シェイプキー)で表現すれば良いのでは?という方法。

そんなわけで、このような腕のモデルを作りました。
余談ですがアーマチュアの関連付けの方法を忘れてました。

で、肘の曲がり具合の係数を取るためのボーンを組んでいきます。
ひとまず、関節を挟んだ大元の骨の根本から土台ボーン、そして関節を挟んだ先の骨の先端をトレースさせます。当然指し示す先が、先の骨を通り抜けます。通り抜けるトレースのボーンと曲がった先端との間にストレッチボーンを挟むと…
…曲がりの度合いによって伸びる、曲がり係数を取得する為のボーンができます。

次にこの収縮ボーンに連動して、力こぶの収縮を行わせる…
できてるじゃん?と見えますが、単に腕の動きのボーンと力こぶのシェイプキーを同じタイミングで動かしているだけです。
あくまでシェイプキーはキーフレームモーションなので、アーマチュアの値を直接代入できません。

係数ボーンとシェイプキーをどうやって関連付けるか…
まずは名前を関連付けて、シェイプに対応する名前の係数ボーンの収縮率(現在のY軸の長さ÷デフォルトのY軸の長さ)を各フレーム毎にシェイプキーの値として入れ込めば可能…なハズです。
ただし、全フレーム×全シェイプ分のキーが打たれる事になる為、追加されたシェイプキーを全削除するアドオンも同時に作る必要がありそうですし、関連付けをするまでは最終的にどんな形(筋肉の形状)になっているのか判らないという問題は出そうです。
そもそもがかなりの力技ですが、着実性としてはこれなんですよね、一応もう一つのプランも考えてはいるのですがそっちは上手く行く気がしません。いつか機会があれば書こうかとは思いますが。