takeyohのおぼえがき

気になったこと、試したことの記録です。

驚きの手順でアセットコルサ用ドライバモデル作成(独自手法)#3Dモデル

普通に3Dの人モデルを使って、アセットコルサ用のドライバモデルを作成しようとするととても大変です。
ドライバをTポーズやAポーズからシートに座った形に変形させたり、決められたドライバのRig(ボーン(骨)の構造体)に対して、ボディとなるオブジェクトのウェイトペイントしたり。(ウェイトがのっていない頂点があったりするとその場所を探すのも大変…)

ということもあり、極力簡単に作れる方法を模索しました。
ここでの説明は私が自分で作業をするときのためのメモです。一般的にこの通り作ればできるとは限らないことをご容赦ください。

  1. 3Dモデルの準備

一つは、インターネットにアップされている人の3Dモデルを持ってくる方法です。すでにRigが入っているモデルであれば、人3Dモデルの作成自体が省略されます。
ここでは、独自の方法で。
まず、作りたい人のイメージを作ります。私はgeminiで、Tポーズの画像を生成させるskillを作成し、画像生成させています。
作りたいイメージの人の画や写真でもよいですし、文字で「30代の男性、カジュアルな恰好で走り屋っぽい感じ」とかでも作れます。
ただ、Tポーズの画像を生成させるとき、重要なポイントは2つ。
足が閉じた状態(両足が近い)はだめです。肩幅くらいに足を開いているくらいが良いです。
両手の甲が手前(カメラ)側に向いていて、指5本はまっすぐパーの形にすることが重要です。
例として、geminiで生成した画像を貼ります。マイケルナイト、ですね。

画像が作成出来たら、この画像から3Dモデルを生成します。
私は、Tripo AIの無料枠を使っています。
studio.tripo3d.ai

アカウント登録が必要ですが、多少のcreditが与えられており、少しの作業位なら無料でできます。
左のメニューからModelを選択し、先ほどの画像を入れて、AI Modelは一番低いH2.5 - Legacyを選択します。(2026/10/3時点)
これは、このモデルで生成したものしか無料でダウンロード(15回まで)ができないからです。
あとGeometry&TextureでPolycountを好みの値にします。全体のポリゴン数ですね。今回は50000に設定してみました。
そしてGenerateします。30credit消費します。
しばらくするとモデルが画面上に表示されます。ですがテクスチャがめちゃくちゃになっています。
この時、両足がちゃんと離れているか、両手の指がそれぞれ5本ずつあるかをよく確認します。
(ここ重要。これを満たしてないと後が大変)

次に左のメニューからTextureを選択して、Texture Resolutionを設定します。今回は2Kを選びました。2Kと4K見た目があまり変わらないので、より軽量で安い方ということで。
Generate Textureを実行します。10credit消費します。
するとこんな感じになります。

下のExportからモデルをダウンロードします。月あたり15回までしかダウンロードできませんのでご注意を。フォーマットは何でもよいですが、OBJが汎用的かな?

そして、エクスポートしたOBJをblenderでインポートします。
パラメータはそのままでインポートするとこんな感じになると思います。

位置はX=0,Y=0,Z=0,回転はX=90,Y=0,Z=0,スケールはX=1,Y=1,Z=1です。モデル自体はグローバル座標で-Yの方向を向いています。
オブジェクトの名前やマテリアルの名前やテクスチャの設定をわかりやすくなるよう修正します。テクスチャ画像はtextureフォルダを作成してそこへ移動させ、ファイル参照場所を修正します。
今度はこれをエクスポートします。フォーマットはFBX。エンプティとメッシュを選び、スケールは0.01、前方は-Zが前方、アニメーションをベイクのチェックは外してエクスポートします。(ここではexport.fbxという名前にします。)

  1. リグの埋め込み

次に、これをmixamoというサイトでリグを埋め込みます。
www.mixamo.com

これもアカウント登録が必要ですが、すべて無料で利用できます。
ログインしたら右のUPLOADCHARACTERから先ほどエクスポートしたexport.fbxを選択して読み込ませ、あごや手首、肘、膝、股の位置を指定すると、自動的にリグが埋め込まれます。
埋め込みが終わったらアニメーションは設定せず、そのままDOWNLOADします。FBXでT-poseを選択する、でOKです。(ここではrigged.fbxという名前にします。)

  1. DRIVER:DRIVERリグへのリプレイス

ダウンロードが終わったら作業フォルダにrigged.fbxを持ってきます。
合わせて、下記ファイルを用意します。
takumi - 頂点グループ入れ替えお試し.blend - Google ドライブ
このblenderファイルは、純正のドライバモデルのリグをTポーズに変形させたものです。

このファイルを作業フォルダにコピーして開き、新しいコレクションを追加してそこに、上記のrigged.fbxをインポートします。スケールは100、前方は-Zが前方でOKです。
するとインポートされたモデルがこんな風に反対方向を向いてます。

インポートされたアーマチュアを回転Z=180にして、グローバル座標Y方向に向けます。

こうすることで、ドライバのトランスフォームにて回転がX=90,Y=0,Z=180となるはずです。(ドライバのモデルの回転はこの状態であることが必要)

ここから、まずmixamoでリギングされたボーンを操作して、ドライバのボーンの位置に合わせていきます。
ボーンではなく、armature自体でスケール変更した場合は、ctrl+aで、適用メニューを表示し、「スケール」を選択して、スケールX,Y,Zを1になるようにします。
最初にスケールを上げて背の高さ、体の大きさをおよそ合わせたのち、起点となる尾てい骨当たりのの骨の位置を合わせます。
そのあとは、足、背中、腕、手、指、首あたりのボーンを操作(回転や拡大縮小、移動など)して、ドライバのボーンに合わせていきます。

位置合わせが終わったら、モデルに適用されているアーマチュアを適用して、mixamoで埋め込んだリグから独立させます。

独立させると、mixamoのリグを動かしても、モデルが動かなくなります。

そしたら、モデルをDRIVER:DRIVERのあるコレクションに移動させ(mキーで移動可)、mixamoのアーマチュアは削除します。
この時点で、ドライバのモデルを選択し、回転がX=90,Y=0,Z=180になっているかを確認します。
(注書き)
通常ならこうなっているはずですが、異なる場合は、回転をX=90,Y=0,Z=180に設定したのち、編集モードでモデルが元の位置に戻るように調整します。
モデルの名前をDRIVER:suitに変更します。

そしたら、モデルを選択してから、ctlキーを押しながら、DRIVER:DRIVERを選択し、ctrl+pでペアレント対象メニューを出して、アーマチュア変形の「空のグループで」を選択します。

すると、ドライバモデルとDRIVER:DRIVERのリグがつながります。がモデルのウェイトペイントをしていないので、リグを動かしてもモデルは動きません。

そのため、ここからウェイトペイントモードを使ってボーンごとにモデルにペイントする作業をするわけですが、これが猛烈手間と時間がかかってしまいます。
そこで、教えていただいた技で克服します。
このモデルの頂点グループには、mixamoのリグようにペイントされた頂点グループと、上記でDRIVER:DRIVER用の頂点グループ(まだウェイトが設定されていない)が混在している状態です。そこで、新しく追加されたDRIVER:DRIVER用の頂点グループを一度すべて削除し、mixamo用の頂点グループのグループ名をDRIVER:DRIVERに合うようにリネームする、という技です。これは気づきませんでした…。
細かい作業がいくつか含まれるため、この処理を自動で行うblender用pythonスクリプトをgeminiで生成、ダウンロードしたblenderのscriptingの中に入っています。
頂点グループのリプレイスを選択して、右向き三角のボタンで実行します。結果はコンソールログに出力されます。すべて正常に処理が終了すると、ウェイトペイントの設定が入れ替えられ、DRIVER:DRIVERのリグを動かすと、ドライバのモデルも一緒に動くようになります。

最後に、頭の分離です。
今、ドライバモデルはDRIVER:suitという一つのオブジェクトになっていると思いますが、ここから頭に該当する頂点を選択します。

頭のパーツを選択したら、pキーで分離メニューから「選択」を選んで頭部分を分離します。
分離した頭のオブジェクトはDRIVER:GEO_Driver_FACEという名前に変更します。

(予備知識)
assettocorsaのcar modでは、標準ドライバのモデルをベースに設定が行われています。
ドライバ視点(ハンドルが見える視点)になった時、DRIVER:GEO_Driver_FACEというパーツは非表示になるように設定されているcar modがほとんどです。
そのため、ここで作成するモデルの頭パーツにもDRIVER:GEO_Driver_FACEという名前を設定しておくことで、どんな車に乗せたとしても、ドライバモデルが視界を邪魔しないようにすることができます。

ここまで出来たら、エクスポートします。形式はFBX。オブジェクトターゲットは、エンプティ、アーマチュア、メッシュ、その他を選択。スケールは0.01。前方は「Zが前方」、アニメーションをベイクのチェックは外してエクスポートします。ファイル名はドライバ名にしておくのが良いです。

ここまでの作業が順調進んでいれば、ksEditorで最後のエクスポートしたファイルを読み込むと、このように表示されるはずです。

ここでは、ドライバのマテリアル名をbodyと設定していたので、bodyマテリアルが一つだけある状態です。
初回読み込み時は真っ黒になっているかもしれません。Ambient, Diffuse、Specularなどのパラメータ設定と、Normal、Maps、Detailファイルを設定すると明るくなります。
TRIPOで3Dモデル&テクスチャ生成した際に、Diffuse用のファイル以外にNormal用のファイルも生成されるのですが、これを適用するとなぜか変な模様や線が顔や体に入ってしまうので、私はNormalのテクスチャにフラットのテクスチャを設定しています。この辺は好みの問題化もしれないですが。
ちなみに、ドライバでアニメーションしたときに変形するパーツはksSkinnedMeshかksSkinnedMesh_NMDetailのどちらかのシェダーを設定する必要があります。デフォルトでksSkinnedMeshが設定されているので、このまま進めればOKです。
最後に、Save kn5でCarを選択して、kn5に出力すれば完成です。
content/driverフォルダに入れて、好きな車からドライバ設定変更で載せるもよし、特定のcar modのextensionやskinsに入れて、ドライバ変更設定をext_config.iniに設定して特定の車でのみで使えるようにするもよし。好みの方法で利用します。

最後kn5にしたモデルと、車に乗せた状態のスクショを載せます。

ちゃんと指一本一本のリグもウェイト設定されているので、指も動きます。

最後に
先にも書いた通り、汎用的というよりは、私が作業する際に手順を忘れないようにするための覚書要素が強いです。
ポイントポイントで参考になるところがあれば活用していただけると嬉しいです。
個別にお問い合わせいただいてもご回答が難しいことがあることはご容赦ください。

今回は以上です。

Content ManagerのGenerate LODsが復活!

過去に、Content Managerに実装されていたGenerate LODs機能で使われていたSimplygonの無料ライセンスが無くなり、やむなく別ツールで手作りする方法を続けてまいりましたが、Content Managerのv0.8.2869.40268から、改めてGenerate LODs機能が作り直されたとのことです。

しかも、生成するツールをいくつか選べるようになっていますが、デフォルトはMeshOptimizerというオープンソースのライブラリで、すでにContent Managerに同梱されているらしく、インストールも不要です!なんてすばらしいのでしょう。
github.com

実際にMeshOptimizerを使ってLodB~Dを生成してみましたが、以前と変わらず、いい感じにメッシュを削ってくれているのがうれしいです。
一つずつのパーツをどうするかとか、メッシュは統合するのか、独立させる必要があるのかなどを一つ一つ設定するのが面倒なので、手作業で作る場合は外側と内側にだけ分けて、それぞれメッシュを削ってくっつけるという方法ですが、今回のGenerate LODsは大事なパーツと不要なパーツを全体または各Lodで指定してあげると、自動でそれを考慮したモデルを生成してくれるのでよりラクチンです。

ただ昔のGenerate LODsの時と同じで、特に灯火類のマテリアルとメッシュの設定には注意したほうがよいです。
LodAを生成する際に、ロービーム、ハイビーム、フォグ、ポジションライト、ウィンカー、ブレーキライト、リバースライトなど遠くからも認識できるライト類は、それぞれ独立したメッシュとマテリアルで構成しておいたほうがよいです。たとえばこれらのライトをLightという一つのマテリアルで設定してしまうと、自動生成したときに、灯火類のオブジェクトが勝手に統合され、lodが切り替わった際に、灯火がおかしなことになります。(ブレーキライトがヘッドライトの色になったりとか。)

私の場合は、念のためLodAでのメッシュとマテリアルを別々設定した上で、Generate LODsの設定では、MERGE EXCEPTIONSで、LODB~Dの既存の設定に、

headLight*
highBeam*
fogLight*
positionLight*
brakeLight*
blinker*
reverseLight*

の7行を追加しています。
こうすることで、lod-Dにおいても、灯火類のメッシュがきちんと残り、離れても光っている状態を保つことができます。
まぁ、lodDだと2km以上離れているので、灯火類が付かなくてもいいという人もいるかもしれないですが。SRP湾岸線の直線箇所とかだと、意外と2km先の車見えたりするので、私はlodDも光るようにしておくことをおススメします。

2026/7/5 追記
LodAで、タイヤとリムしかなかったので、HUB_XXを作らず直接WHEEL_XXのみを作成してLodAとしたkn5に対して、上記のLod自動生成を実行すると、生成ができないという事象がありました。
HUB_XXを追加で作成し、その下にWHEEL_XXを移動させることで、lodの生成をすることができました。絶対にHUB_XXが必要なのかどうかは不明ですが、覚書として残しておきます。

パドルシフトアニメーションが動かない!

パドルシフトの車で、ドライバのパドルシフトアニメーションを作りました。
左手(ダウン)がshift_dw.ksanim、右手(アップ)がshift_up.ksanimという名前のファイルで作成し、car modのanimationsフォルダの中にコピーします。

ですが、なぜかアニメーションが動かない!
思い当たるところをいくつか変更して試したところ、原因が分かったので覚書で残しておきます。

ポイントは一つ。

dataフォルダ内のdriver3d.iniファイルを開き、SHIFT_ANIMATIONセクションのINVERT_SHIFTING_HANDSを0に設定する

以上です。

右ハンドルのHシフトパターンの車とかを作っていると、この値を1に設定することで、左手のシフトアニメーションが再現されますが、これが1のままだと、パドルシフトアニメーションが認識できないんですね。う~ん。

CHASE CAMERA時に音が出ない(今回はドアの開閉音)

ドアのアニメーションが設定されていると、ゲーム開始時にドアが開いた状態になっていて、スタートするとドアが閉まって、ガチャという閉まる音がすると思います。
この音を別に切り出して、bankファイル化し、ゲームが始まった後もドアを開閉すると開閉音が出るようにすることがあります。(気まぐれ)
luaで実装しています。luaからksanimを読み込んで、サウンドイベントとして音を出します。
ただ、今回気づいたのは、CHASE CAMERA(車の後ろからの視点)にすると音が出ないということです。それ以外の視点は音が出ます。
これは、fmodの設定が必要でした。
CHASE CAMERAモードでも音を出したい場合は、対象の音源のMaster設定でStealingを「Virtualize」に設定すると解決できました。
今回は、ドア開閉用のbankファイルを作成していますが、イベントを選択し、Masterの欄をクリックすると、下にマスター用の設定画面が出ます。
その一番右側、緑色で丸を付けた部分です。

この設定をしてから、bankファイルを生成すると、CHASE CAMERA視点でも音が出るようになりました。

あー、昔作った車はこれに対応してないなぁ。でも直すの面倒だから、そのままにします。w

fmodでのリバーブ設定(この記事は不確実かもしれません)

bankファイルを自作したcar modでSRPのトンネルに入るとリバーブの効果で、スピーカーやヘッドフォンが壊れるのでは?というくらいの爆音になる症状に困っていました。
最初はCSPの設定の問題かとも思っていましたが、もしかしてfmod側の問題かもしれない?と思って調べてみました。

fmodでエンジン音(中、外両方)のそれぞれのMasterを選択し、左の3D Pannerを右クリックするとメニューがでるので、FMDO Reverbをクリックします。

すると、右側にReverbという欄が出てきます。

ここで各設定を下記の様に変更しました。

この状態でbankファイルを生成し、ゲームで使って見たところ、リバーブはかかりますが爆音にはならなくなりました。
このfmodの設定が適切なのかの検証はできていません。なのでこの設定は不確実です。
ただ、fmodのリバーブ機能とCSPのリバーブ機能が両方機能する結果が爆音につながっているのは確かです。
asettocorsaのcar mod用bank作成限定の話ではありますが、fmod側でのリバーブ機能は最低限にしておくのがよさそうです。

路面の反射がおかしいときの回避方法(根本的ではないかも)

アセットコルサでなぜか2輪車を作ったりしているわけですが、その場合、4輪の制御システムをごまかしながら2輪車っぽい動きを再現しているわけです。
そのため、HUB_XX, SUSP_XX, WHEEL_XXなどのノードの下にタイヤなどのオブジェクト(メッシュ)を入れずに作ったりします。
(ノードは作ってあるのですが、その中にメッシュが一つもない)
この時、trackにもよるのですが、昼は問題なくても、夜になった時、路面や周りの物体が全く反射せず、ヘッドライトで前を照らしているはずなのに、まったく明るくならない症状が出ることがあります。
SRPだとこんな感じです。

白線は見えるのですが、路面は真っ黒です。

先に、回避方法を適用した後を紹介すると、こうなります。

これが普通ですよね。ヘッドライトもちゃんと照らしています。

で、回避方法です。
HUB_XX、SUSP_XX、WHEEL_XXのノードの構成はこうなっていると思います。

普通、車を作るときは、ここにタイヤやホイール、ブレーキディスクやキャリパーなんかのオブジェクトを入れると思いますが、この例では、bikeというノードの中にすべてのオブジェクトが入っていて、これらのノードの下には一つもオブジェクトがありません。
この状態でkn5を作ってしまうと、先ほどの様に反射が正常に動かないことがあるようです。

そこで、適当に(ここでは、WHEEL_LRの下)、ダミーのオブジェクトを作成します。

ここにあるオブジェクトはタイヤの回転と一緒に回るものですので、大きいと目立ちます(邪魔)。
また負荷を極小化するには、なるべく面数の少ないオブジェクトがよいかと。
そこで、今回はWHEEL_LRのエンプティの位置に正方形のオブジェクトを追加し、名前をdummyTyreとか適当につけています。
マテリアルは、そのcar modで使われているマテリアルから適当なものを割り当てます。

で、この正方形を編集モードにして、限りなく小さく(見えないくらい)します。

この絵はまだ小さな正方形が見えますが、もっともっと見えないくらいまで小さくしてください。

小さくしたら、正方形(dummyTyre)のスケール(X,Y,Z)は1.000になっているか確認してくださいね。

オブジェクトモードのまま小さくするとスケールの値が変わってしまいます。(なので編集モードにしてから縮小する)

あとは、いつも通りfbxでエクスポートして、ksEditorでkn5を作成すればOKです。


これだけです。

オフラインtrack day(走行会)モードで、AI車両が止まる場合の対処

今回もメモだけ。
オフラインのtrack day(走行会)モードで、ランダムなのですがAI車両が道の真ん中で止まっていて困ることがあります。
特にAIの車両数を増やしたりすると顕著になります。

根本的な解決か変わりませんが、スムーズに流れるようになったので、設定部分をメモします。
これを書いている時点で使用しているCSPは0.2.8preview1です。

CSP設定のNEW AI BEHAVIORから、AI flood(works in Track Day mode):の欄を探し、
Behavior variation:の選択肢を「Never」にする。

です。
あらゆるパターンでこれが有効なのかは検証できていませんが、もし同じような症状の方が入ればお試しください。

/* -----codeの行番号----- */