fix book
@ -9,25 +9,38 @@
|
||||
* [game animation sample](gasp/README.md)
|
||||
* [キャラクターを追加する](gasp/01_character.md)
|
||||
* [飛びつける高さを増やす](gasp/02_jump.md)
|
||||
* [キャラクターの見た目を変える](gasp/03_vrm.md)
|
||||
* [キャラクターを作る](gasp/03_vrm.md)
|
||||
* [モーションキャプチャで動かす](gasp/04_vmc.md)
|
||||
* [揺れものを設定する](gasp/05_kawaii.md)
|
||||
* [カメラワークの設定する](gasp/06_camera.md)
|
||||
* [アニメーションを作成する](gasp/07_anim.md)
|
||||
* [アニメーションを変更する](gasp/11_run.md)
|
||||
* [niagaraでダメージを出す](gasp/08_niagara.md)
|
||||
* [椅子に座る](gasp/09_chair.md)
|
||||
* [階段に登る](gasp/10_stairs.md)
|
||||
* [武器を装備する](gasp/12_weapon.md)
|
||||
* [control rig sample](crs/README.md)
|
||||
* [CRでキャラクターを動かす](crs/01_character.md)
|
||||
* [ボスを作る](crs/02_boss.md)
|
||||
* [ボスのジャンプ攻撃を作る](crs/03_jump.md)
|
||||
* [city sample](city/README.md)
|
||||
* [惑星形式のmapを作る](city/01_remove.md)
|
||||
* [橋を作る](city/02_bridge.md)
|
||||
* [建造物を作る](city/03_house.md)
|
||||
* [家を作る](city/03_house.md)
|
||||
* [BGMを作る](city/04_bgm.md)
|
||||
* [ブラウザを作る](city/05_browser.md)
|
||||
* [gameplay camera](camera/README.md)
|
||||
* [もっと近づける](camera/01_close.md)
|
||||
* [json blueprint utilities](json/README.md)
|
||||
* [apiから情報を取得する](json/01_varest.md)
|
||||
* [pixel streaming](pixel/README.md)
|
||||
* [基本事項](pixel/01_server.md)
|
||||
* [vrm4u](vrm4u/README.md)
|
||||
* [キャラクターを作る](vrm4u/01_make.md)
|
||||
* [指の角度を調整する](vrm4u/02_yubi.md)
|
||||
* [前髪の角度を調整する](vrm4u/03_hair.md)
|
||||
* [アウトラインを追加する](vrm4u/04_outline.md)
|
||||
* [トーンを変える](vrm4u/05_toon.md)
|
||||
* [有料アセット](plan/README.md)
|
||||
* [superhero fligth animations](plan/01_flying.md)
|
||||
* [ultra dynamic sky](plan/02_uds.md)
|
||||
@ -35,9 +48,16 @@
|
||||
* [nice interaction system](plan/04_item.md)
|
||||
* [replicated interaction kit vol 3](plan/05_chair.md)
|
||||
* [dragon ik plugin](plan/06_dragonik.md)
|
||||
* [worldscape plugin](plan/07_wsp.md)
|
||||
* [unity](unity/README.md)
|
||||
* [animation clipをueで使う](unity/01_fbx.md)
|
||||
* [blender](blender/README.md)
|
||||
* [モデルをカスタマイズする](blender/01_model.md)
|
||||
* [素体を作る](blender/01_model.md)
|
||||
* [衣装を着せる](blender/02_costume.md)
|
||||
* [vrmで統合する](blender/03_vrm.md)
|
||||
* [web](web/README.md)
|
||||
* [glbをwebに表示する](web/01_three.md)
|
||||
* [vrmをwebに表示する](web/02_three-vrm.md)
|
||||
* [issue](issue/README.md)
|
||||
* [ue](issue/ue/README.md)
|
||||
* [error II-E1001](issue/ue/ue_01.md)
|
||||
@ -54,4 +74,13 @@
|
||||
* [playerが地面に埋まってしまう](issue/city/city_04.md)
|
||||
* [他のmapとの統合](issue/city/city_05.md)
|
||||
* [BGMを変更する](issue/city/city_06.md)
|
||||
* [表示されなくなったサイト](issue/city/city_07.md)
|
||||
* [blender](issue/blender/README.md)
|
||||
* [衣装の背後に黒いチラつきが発生する](issue/blender/blender_01.md)
|
||||
* [ueで読み込むと一部のmaterialが正しく表示されない](issue/blender/blender_02.md)
|
||||
* [髪の毛が頭に追従しなくなる事がある](issue/blender/blender_03.md)
|
||||
* [vrm4u](issue/vrm4u/README.md)
|
||||
* [customで衣装の半分が灰色になる](issue/vrm4u/vrm4u_01.md)
|
||||
* [youtube](youtube/README.md)
|
||||
* [自己紹介](youtube/01_ep.md)
|
||||
* [end](end/README.md)
|
||||
|
@ -1,22 +1,47 @@
|
||||
# モデルをカスタマイズする
|
||||
# 素体を作る
|
||||
|
||||
素体を作ります。色々と探したのですが、なかなか納得するものが見つかりません。できる限り現実に近いものを目指します。
|
||||
素体を作ります。できる限り現実に近い再現を目指します。これを`gender system`と呼び、わかりやすくいうとキャラクターの性器システムです。
|
||||
|
||||
今回は、Aモデル(vrm)とBモデル(部位)の統合をblenderで行います。統合したものをvrmにexportして、ueでimportします。Bモデルにはシェイプキーを設定しているので、ueではモーフターゲットとして動かせるようにします。
|
||||
|
||||
blenderのexportやueのimportは注意が必要です。`VRM MToon`, `ペアレントで[Body]頂点`, `UVMap`, `シェイプキーをSKkeeperで上書き`が必要でした。
|
||||
ueで動かすにはmaterialに`VRM MToon`を使うこと、`UVMap`の名前に設定すること、`vrm0`を使うこと、データ転送で`頂点`を設定することが大切です。今回使用する[addon](/blender/)は、vrmをimport, exportするaddonだけです。
|
||||
|
||||
使用する[addon](/blender/)を確認してください。
|
||||
## vroidの設定
|
||||
|
||||
1. まずBモデルをblenderで読み込み、いらないものを削除します。vrmを読み込むaddonが必要です。
|
||||
2. materialに`VRM MToon`を設定します。ueでimportする際にcrashします。
|
||||
3. dataのUVマップに`UVMap_xxx`となっているときは名前を`UVMap`にします。色がおかしくなります。
|
||||
4. 編集モードでBモデルを膨らませます。これは頂点を選択して[G]を押します。
|
||||
5. addonの`SKkeeper`を使い、オブジェクトメニューからapply modifyを選択します。追加モデルのmirrorやkeyをまとめます。これをしないとvrmにexportできません。
|
||||
6. 次にAモデルの編集です。いくつかの面を削除してBモデルをくっつけても違和感ないようにします。
|
||||
7. トランスフォームのペアレントで`[Body]頂点`を選択します。G, [y, z, r]などを駆使して位置調整してください。
|
||||
素体はvroidをベースにします。つけている衣装を全部はずします。そして、パンツなどもテクスチャを削除しておくと素体の完成です。
|
||||
|
||||
ペアレントは正しく設定されるときもあればズレることもあります。同じファイルをvrmにexportしても結果がその都度異なります。また、モーフターゲットが正しく反映されないこともあります。
|
||||
## materialの設定
|
||||
|
||||
私は`[Armatrue]ボーン(hip)`につけることで設定しました。しかし、ueで読み込んだとき少し下に表示されるので、これ自体をずらした位置で調整し、ueで確認する必要がありました。
|
||||
vrmをblenderで読み込みます。
|
||||
|
||||
1. Bモデルのmaterialに`VRM MToon`を設定します。ueでimportする際にcrashします。
|
||||
2. dataのUVマップに`UVMap_xxx`となっているときは名前を`UVMap`にします。色がおかしくなります。
|
||||
|
||||
## 基本的な編集(移動、削除、位置)
|
||||
|
||||
1. Bモデルを正しい位置にセットします。[G], [Z], [R]
|
||||
2. Aモデルを適切に切り取ります。[面を選択], [細分化], [四角形に], [面を削除]
|
||||
3. シェイプキーを動かしても問題ないかの確認します。
|
||||
|
||||

|
||||
|
||||
## bodyに追従させる
|
||||
|
||||
このままではBモデルは体に追従しません。追従させるには頂点をアーマチュア(armature)に追加します。
|
||||
|
||||
1. Bモデルのモディファイアから[データ転送], [Body(J_Bip_C_Hips)], [頂点], [頂点グループ]を選択し、[データレイヤーを生成], [適用]します。
|
||||
2. Bモデルのモディファイアでアーマチュアで[Armature]を追加します。
|
||||
3. 女性の場合はボーン(足)を調整します。なお、少し浮くようになってしまうため全体を-Zします。[G], [X], [R]
|
||||
|
||||
> シェイプキーをueでも有効にするには、vrm0を使います。また、編集しているときにobjectを分離した場合は元の構成に再統合してください。
|
||||
|
||||

|
||||
|
||||
## gender systemについて
|
||||
|
||||
例外ない限りキャラクターにはgender systemが搭載されます。アイは原作で性別がないので、例外的にgender systemから除外されています。
|
||||
|
||||
最初に実装するキャラは、仮名で`アダブ(男性)`, `イブチェ(女性)`になります。
|
||||
|
||||
[issue: ueで読み込むと一部のmaterialが正しく表示されない](/issue/blender/blender_02.html)
|
||||
|
||||
|
11
book/blender/02_costume.md
Normal file
@ -0,0 +1,11 @@
|
||||
# 衣装を着せる
|
||||
|
||||
衣装は体に追従しません。これを追従するようにします。
|
||||
|
||||
1. 衣装を選択した状態で、モディファイア -> データ転送、頂点を選択し、頂点グループにチェックを入れる。
|
||||
2. データレイヤーのボタンを押して頂点を生成。
|
||||
3. 最後にモディファイアのデータ転送を適用。
|
||||
|
||||
## 衣装を着せるaddon
|
||||
|
||||
blenderに[kiseru](https://pielotopica.booth.pm/items/4854979)をインストールします。
|
49
book/blender/03_vrm.md
Normal file
@ -0,0 +1,49 @@
|
||||
# vrmで統合する
|
||||
|
||||
`.vrm`を読み込んで、別の`.vrm`に統合する方法を紹介します。最終的にはueでも動くようにします。
|
||||
|
||||
編集しているうちにblenderのシェイプキーがueのモーフターゲットにexportできなくなったり、髪の毛のウェイトが消えていたりといったトラブルが多発します。
|
||||
|
||||
blenderのvrmはspring boneを設定して髪の毛を動かしています。これはboneに付いているcolliderと連動しています。
|
||||
|
||||
髪の毛はboneとも連動していて、armature(bone)を統合したあとにheadとheadをつなげなければなりません。
|
||||
|
||||
統合するobjectの動きを本体に追従したい場合は頂点とアーマチュアを正しく設定しなければなりません。データ転送を活用します。
|
||||
|
||||
髪の毛が動かない場合、物理シュミレーションが設定されているか確認してください。ueの`kawaiiphysics`でも設定できます。私はueのほうで設定しています。また、髪の毛のウェイトが剥がされていないか確認してください。データ転送後は髪の毛にウェイトが付いているか確認しましょう。
|
||||
|
||||
シェイプキー(モーフターゲット)が消えてしまうのは`vrm1`に起因します。blenderで編集する場合は`vrm0`をベースにしてください。また、シェイプキーは元のobject名に再統合しなければ消えてしまいます。
|
||||
|
||||
1. vrm0をベースにしているか。
|
||||
2. objectを元の状態に再統合できているか。
|
||||
3. 髪の毛にウェイトはあるか。
|
||||
4. 髪の毛に物理シュミレーションはあるか。
|
||||
|
||||
## 具体的な手順
|
||||
|
||||
hair(髪の毛)とbody(体)で分けられたvrmを読み込むこととします。これを統合します。
|
||||
|
||||
1. まず、boneの統合を行います。boneはarmatureというようです。不要なboneを削除します。そして、完成版となるarmatureを最後に選択して統合します。
|
||||
2. 次に必要なboneをつなぎます。boneを編集モードで編集し、`J_Bip_C_Head` -> `head`を選択し、右クリックで親を`オフセット維持`で設定します。
|
||||
3. 次にhairを選択し、モディファイアからデータ転送を行います。ソースに`body`, 頂点グループに`J_Bip_C_Head`を選択します。ここが特に重要です。そして、頂点データにチェックを入れ、頂点グループを選択します。最後にデータレイヤーを生成し、適用します。これでhairとbodyがつながった状態になりました。bodyが主体になります。
|
||||
|
||||
ウェイトがhair(J_Bip_C_Head)に設定されていることを確認してください。今後、hairのobjectをいじると削除される可能性があります。
|
||||
|
||||
## ueで物理シュミレーションを設定する
|
||||
|
||||
1. 次にueでhairを動くようにします。ueでvrmを読み込んで、`ABP_Post_${name}`を編集します。`kawaiiphysics`でRoot Boneに`J_Sec_Hair_1_xx`を1-12まで入れて、Capsule Limitsに`chest`, `hip`などを設定します。私は`chest`の値を大きめにして対処しました。
|
||||
2. 次に、服が体に入りこまないようにしなければなりません。これも先ほどと同じように設定します。
|
||||
3. 設定後は`ABP_Post_${name}`をコピーしておきましょう。このファイルは新しくvrmを読み込むと上書きされるため、最新版を読み込んだあと再設定しやすいように。
|
||||
|
||||
blenderから読み込んだmodelを動かしてみた。
|
||||
|
||||

|
||||
|
||||
## blendshapeとvmc
|
||||
|
||||
vmcは`.vrm`をblenderで開いたときblendshape(ブレンドシェイプ)が設定されていれば大抵動くと思います。
|
||||
|
||||
ただし、blenderで編集した際に使えなくなってしまう可能性が高いです。例えば、objectを分離した場合がそうです。最初の構成にobjectを統合すると動くようになります。
|
||||
|
||||
[issue: 髪の毛が頭に追従しなくなる事がある](/issue/blender/blender_03.html)
|
||||
|
@ -1,9 +1,32 @@
|
||||
# blender
|
||||
|
||||
[blender](https://blender.org/)でモデルを編集して、ueで読み込みます。
|
||||
[blender](https://projects.blender.org/blender/blender)でモデルを編集して、ueで読み込みます。
|
||||
|
||||
- version: `4.5`
|
||||
|
||||
```sh
|
||||
# https://developer.blender.org/docs/handbook/building_blender/windows/
|
||||
$ git clone https://projects.blender.org/blender/blender.git
|
||||
$ cd blender
|
||||
$ make update
|
||||
$ make
|
||||
```
|
||||
|
||||
## addon
|
||||
|
||||
|addon|body|
|
||||
|---|---|
|
||||
|https://github.com/saturday06/VRM-Addon-for-Blender|vrmを読み込む|
|
||||
|https://github.com/smokejohn/SKkeeper|modifireをobjectに反映|
|
||||
|
||||
## その他のaddon
|
||||
|
||||
結局、vrmを読み込むもの以外は使いませんでした。気になったaddonを載せておきます。
|
||||
|
||||
|addon|body|
|
||||
|---|---|
|
||||
|https://github.com/smokejohn/SKkeeper|modifireをobjectに反映|
|
||||
|https://github.com/12funkeys/rigid_bodys_gen|rigを付ける|
|
||||
|https://github.com/shteeve3d/blender-wiggle-2|rigを付ける|
|
||||
|https://pielotopica.booth.pm/items/4854979|衣装を着せる|
|
||||
|
||||
なお、pythonを実行するのは危険も伴いますので、blender addonの実行(インストール)は最低限にしてましょう。
|
||||
|
7
book/camera/01_close.md
Normal file
@ -0,0 +1,7 @@
|
||||
# もっと近づける
|
||||
|
||||
GASPにはマウスのDown/Upのキーでカメラ操作が設定されているので、それを改造します。今回は`Style:Close`でもっと近づけるようにします。
|
||||
|
||||
例えば、`GamePlay Camera`から`Get Initial Variable Table`を`Set Camera Rig Parameters`につなげます。そして、`Close_Strafe`を選択し、`/Content/Blueprints/Camera/CameraAsset_SandboxCharacter`にある`Close_Strafe`のOffsetを公開します。公開するにはnodeを伸ばして変数を作ればokです。
|
||||
|
||||
これで`/Content/Blueprints/CBP_SandboxCharacter`から値をいれることができます。ピンを分割して、x軸に`-70.0`を入れます。
|
5
book/camera/README.md
Normal file
@ -0,0 +1,5 @@
|
||||
# gameplay camera
|
||||
|
||||
[gameplay camera](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/gameplay-camera-system)
|
||||
|
||||
キャラクターブループリント(Character BP)とカメラブループリント(Camera BP)の分離(共通化)を図ります。
|
@ -14,20 +14,12 @@ city sampleの海には境界があってcollisionが設定されています。
|
||||
|
||||
## ultra dynamic skyで天候と惑星を作る
|
||||
|
||||
[ultra dynamic sky](https://docs.google.com/document/d/1xAr0Hd3mY7Mp0g0waKLUvJaddUPaVxEeRoEEFXctCE0/)
|
||||
|
||||
1. `/Content/UltraDynamicSky/Blueprints/Ultra_Dynamic_Sky`を開きます。
|
||||
2. そこに地球と月と太陽のBPを入れます。各自が用意してください。なお、地球は`SkyAtmosphere`の下に置いてください。
|
||||
> 名前は 地球(BP_Earth), 月(BP_Moon), 太陽(BP_Sun) としておきます。
|
||||
3. `BP_Earth`は詳細から`transform-location-z:-636000000`, `transform-scale:6360000`にします。
|
||||
4. `Sky_Sphere_Mesh`の`transform-scale:50000`にします。
|
||||
5. 関数の`Current Star Color(pure)`にて高度を取得できるため、各componentの表示と非表示(visibility)を切り替えます。
|
||||
|
||||
<iframe src="https://blueprintue.com/render/k3xgicx_/1" scrolling="no" allowfullscreen style="width:100%;height:400px"></iframe>
|
||||
|
||||
- `BP_Earth`: `transform-location-z:-636000000`, `transform-scale:6360000`
|
||||
- `Sky_Sphere_Mesh`: `transform-scale:50000`
|
||||
[こちら](/plan/02_uds.html)
|
||||
|
||||
## ocean wavesで惑星の海を作る
|
||||
|
||||
[こちら](/plan/03_ocean.html)
|
||||
|
||||
## worldscape pluginを使う
|
||||
|
||||
[こちら](/plan/07_wsp.html)
|
||||
|
@ -1,4 +1,4 @@
|
||||
# 建造物を作る
|
||||
# 家を作る
|
||||
|
||||
1. [twinmotion](https://www.twinmotion.com/)をinstallして、建造物を作ります。template(テンプレート)を編集しても構いません。
|
||||
2. できたらexportしてueの$projectを選択します。`$project/${name}_Assets`が作成されます。`datasmith`の置き場所は変更しても構いません。
|
||||
|
27
book/city/05_browser.md
Normal file
@ -0,0 +1,27 @@
|
||||
# ブラウザを作る
|
||||
|
||||
1. pluginで`web browser`を有効にします。
|
||||
2. 下記のような緑背景のmaterialを作成します。
|
||||
> [https://blueprintue.com/blueprint/-49_059w/](https://blueprintue.com/blueprint/-49_059w/)
|
||||
3. web browserを使ったwidgetを作成します。
|
||||
4. BP_browserに追加したwidget componentで呼び出します。collisionでcontrolします。
|
||||
> [https://blueprintue.com/blueprint/uubw_6ay/](https://blueprintue.com/blueprint/uubw_6ay/)
|
||||
4. displayにくっつければ見栄えも良くなります。
|
||||
> https://www.unrealengine.com/marketplace/ja/product/twinmotion-high-tech-pack-1
|
||||
|
||||

|
||||
|
||||
画像はNASAの[solar system](https://eyes.nasa.gov/apps/solar-system/#/home)にアクセスしたときのもの。
|
||||
|
||||
- https://eyes.nasa.gov/apps/asteroids/#/planets/earth
|
||||
|
||||
## issue: 表示されなくなったサイト
|
||||
|
||||
[こちら](/issue/city/city_07.html)を見てください。
|
||||
|
||||
## webでUIやシステムを作る
|
||||
|
||||
これを利用すると、webで動くUIやシステムを作成し、ゲームに取り入れることができます。
|
||||
|
||||
しかし、運用は大変だと思います。
|
||||
|
BIN
book/cover.jpg
Before Width: | Height: | Size: 250 KiB After Width: | Height: | Size: 240 KiB |
8
book/crs/03_jump.md
Normal file
@ -0,0 +1,8 @@
|
||||
# ボスのジャンプ攻撃を作る
|
||||
|
||||
1. control rig(CR_Mech)をlevelに配置し、シーケンサからrigを動かしながらanimを作ります。時間ごとにboneの例えば、`base_ctrl`を動かして、`+`を押していきます。
|
||||
2. 作ろ終わったらsk meshである`CR_Mech`を右クリックで`アニメーションシーケンスをベイク`します。
|
||||
3. 保存されたanim sequenceを開いて通知などを追加します。攻撃時のみcollisionを有効にする必要があるからです。
|
||||
4. 通知から受け取る情報でcollisonをenable/disableにします。
|
||||
|
||||
<iframe width="100%" height="415" src="https://www.youtube.com/embed/gk28r9cm5eQ?mute=1&rel=0&showinfo=0&controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
@ -26,6 +26,7 @@
|
||||
|[varest](https://github.com/ufna/VaRest)|20240828|curlのようなもの。supportが終了しているのでbuildが必要|
|
||||
|[tatools](https://www.fab.com/ja/listings/a5d3b60d-b886-4564-bf6d-15d46a8d27fe)|20241206|animを作る|
|
||||
|[ui navigation 3.0](https://www.fab.com/ja/listings/a91f6e67-5c2d-46ef-926d-00a35525579c)|20250126|スタート画面を作る|
|
||||
|[dlss](https://developer.nvidia.com/rtx/dlss/get-started#ue-version)|20250301|nvidiaの描写速度|
|
||||
|
||||
## その他のasset
|
||||
|
||||
@ -33,10 +34,12 @@
|
||||
|
||||
|name|body|
|
||||
|---|---|
|
||||
|[GASP-ALS](https://github.com/PolygonHive/GASP-ALS)|GASPの改造版|
|
||||
|[twinmotion-high-tech-pack-1](https://www.unrealengine.com/marketplace/ja/product/twinmotion-high-tech-pack-1)|家電製品|
|
||||
|[automotive bridge scene](https://www.fab.com/ja/listings/a472df9d-9179-4743-8d41-335f9ef55546)|道路や橋|
|
||||
|[animal variety pack](https://www.fab.com/ja/listings/2dd7964c-a601-4264-a53d-465dcae1644c)|有名な動物モデル|
|
||||
|[quadruped fantasy creatures](https://www.fab.com/ja/listings/52d686b6-1180-4f26-901f-ce3c69a14767)|有名な幻獣モデル|
|
||||
|[ueplugin-accessvariablebyname](https://github.com/colory-games/UEPlugin-AccessVariableByName)|名前を取得するplugin|
|
||||
|[GASP-ALS](https://github.com/PolygonHive/GASP-ALS)|GASPの改造版|
|
||||
|
||||
## 有料のasset
|
||||
|
||||
|
@ -1 +0,0 @@
|
||||
|
@ -30,7 +30,7 @@ ueを長く使っているとわかることですが、ゲーム制作にはあ
|
||||
|
||||
「ueはバグが多く基本的に壊れている」このことを最初に理解しておかないと「おかしいなあ」と時間を無駄にしてしまいます。また、保存せず長時間コードを書き続けるのは危険です。クラッシュ(crash)すると消えてしまいます。プロジェクト(project)そのものが壊れることもよくあります。注意しましょう。
|
||||
|
||||
そして、バグにぶつかっても情報がほとんどありません。自己解決するしかないのです。情報量に関してはunityと比べ明確な差があります。
|
||||
そして、バグにぶつかっても情報がほとんどなく、自己解決するしかありません。情報量は非常に少ないと言えます。
|
||||
|
||||
- グラフィックがきれい
|
||||
- バグが多い
|
||||
@ -38,18 +38,23 @@ ueを長く使っているとわかることですが、ゲーム制作にはあ
|
||||
|
||||
## unityやblenderも使っている
|
||||
|
||||
私はキャラクター(character)を`.vrm`で作っています。
|
||||
私はキャラクター(character)を[vroid](https://vroid.com/studio)で作っています。
|
||||
|
||||
`.vrm`の開発は主に[unity](/unity/)が中心です。`.vrm`の仕様を作っているpixivがunityで読み込むためのpluginを開発しているからです。そのためかvrmに対応する多くのツールはunity専用です。
|
||||
そして、`.vrm`の開発は主に[unity](/unity/)が中心です。なぜなら`.vrm`の仕様を作っているpixivがunityで読み込むための[plugin](https://github.com/vrm-c/UniVRM)を開発しているからです。そのためかvrmに対応する多くのツールはunity専用です。
|
||||
|
||||
もし`.vrm`を扱う場合は、どちらにせよ`unity`を使うことになると思います。私もモデルのカスタマイズなどでunityを使っています。
|
||||
|
||||
モデルのカスタマイズには[blender](/blender)というものもあって、`blender`も使用しています。
|
||||
また、モデリングには[blender](/blender)を使用しています。
|
||||
|
||||
つまり、本当にueでゲームを制作すべきかはよく考えなければいけません。ゲーム開発は使用するものが少ないほど安定します。
|
||||
つまり、本当にueでゲームを制作すべきかはよく考えなければいけません。ゲーム開発は使用するツールが少ないほど安定します。
|
||||
|
||||
結局、unityやblenderを使うことになるなら、unityで開発するのがオススメです。情報量、安定性、ツールの豊富さなどからそう判断します。
|
||||
|
||||
```diff
|
||||
+ [vroid] --> [vrm] --> [blender] --> [unity]
|
||||
- [vroid] --> [vrm] --> [blender] --> [unity] --> [ue]
|
||||
```
|
||||
|
||||
## ueを使う理由
|
||||
|
||||
私がueを使う理由は、最初にゲーム開発を始めたとき使ったものがueだったからです。その時の感動は忘れません。
|
||||
@ -83,8 +88,8 @@ ueを長く使っているとわかることですが、ゲーム制作にはあ
|
||||
|application|app|アプリ、ソフトウェア(software)のこと|
|
||||
|library|lib|ライブラリ、softwareを構築するための部品|
|
||||
|package|pkg|パッケージ、appだったり、libだったり色々。基本的にpkg managerでinstallできるものを指す|
|
||||
|update|up|アップデート、5.5の`x.5`の部分を言う ex: 5.4 -> 5.5|
|
||||
|upgrade||アップグレード、5.5の`5.x`の部分を言う ex: 4.0 -> 5.0|
|
||||
|update|up|アップデート、5.5.3の`x.x.3`の部分を言う ex: 5.5.2 -> 5.5.3|
|
||||
|upgrade||アップグレード、5.5の`x.5`の部分を言う ex: 5.4 -> 5.5|
|
||||
|asset||アセット、ueでは購入できるlibやexampleを指す|
|
||||
|plugin|plug|プラグイン、エンジンに直接入れる追加機能。新たなblueprintなどを使えるようになる|
|
||||
|crash||クラッシュ、アプリやosが落ちること|
|
||||
@ -93,5 +98,6 @@ ueを長く使っているとわかることですが、ゲーム制作にはあ
|
||||
|project||プロジェクト、ueでは主に新しいゲームを作った時のフォルダ一式|
|
||||
|blueprint|bp|ブループリント、ueのノードベースで書く形式。anim blueprintはabp、character blueprintはcbpと略される事が多く、ファイル名は`BP_XXX`, `ABP_XXX`, `CBP_XXX`となる。基本大文字が使われる|
|
||||
|variable|var|変数、一時的な値の保存場所|
|
||||
|support||サポート|
|
||||
|
||||
基本的に英語で書けるものは英語で書きます。ueのmenuは英語にするのがおすすめです。様々な単語に慣れておきましょう。
|
||||
|
@ -20,6 +20,15 @@ ue5でゲームを作成するまでの過程をまとめます。
|
||||
|
||||
ただし、ストレージの読み書き速度は重要です。ueやprojectを入れるストレージには注意してください。
|
||||
|
||||
## 便利なサイト
|
||||
|
||||
|name|body|
|
||||
|---|---|
|
||||
|[dev.epicgames.com](https://dev.epicgames.com/community/)|開発者コミュニティ|
|
||||
|[perplexity.ai](https://www.perplexity.ai/)|検索エンジン|
|
||||
|[suno.com](https://suno.com/)|作曲|
|
||||
|[vroid.com](https://vroid.com/studio/)|3Dモデル|
|
||||
|
||||
## 使用するタグ
|
||||
|
||||
### youtube
|
||||
|
@ -1,110 +1,4 @@
|
||||
# キャラクターの見た目を変える
|
||||
# キャラクターを作る
|
||||
|
||||
キャラクターの見た目を変えるには`.vrm`を使うと便利です。これは`pixiv`が作っている規格です。
|
||||
[こちら](/vrm4u/01_make.html)のページで解説します。
|
||||
|
||||
ueで読み込むには`vrm4u`というpluginを使用します。
|
||||
|
||||
<iframe width="100%" height="415" src="https://www.youtube.com/embed/0Ig_-JSRV0M?si=Kz_jCbYTHr_OzPpP&start=0&end=23&mute=1&rel=0&showinfo=0&controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
|
||||
## vrm4u
|
||||
|
||||
1. [vrm4u](https://github.com/ruyo/VRM4U/releases)をダウンロード(download)して、`$project/Plugins`に入れる。
|
||||
> $project/Plugins/VRM4U/VRM4U.uplugin
|
||||
2. editorのファイルエクスプローラーでモデルファイルの`.vrm`をD&Dします。色々と聞かれますが適当にokや選択します。配色タイプが聞かれます。例えば、`$project/Content/Characters`に`model`フォルダを作り`model.vrm`をimport(インポート)した場合で解説します。
|
||||
> $project/Content/Characters/$model
|
||||
|
||||
モデル(model)は[こちら](https://hub.vroid.com/users/36144806)からdownloadすることができます。私は、`vrm 1.0`を使用ていますが、`vrm 0.0`のほうが安定しています。
|
||||
|
||||
重要なファイルは`$project/Content/Characters/$model/SK_$model`, `ABP_Post_$model`, `RTG_UEFN_$model`になります。
|
||||
|
||||
https://vrm.dev/vrm1/
|
||||
|
||||
## 指の角度を調整する
|
||||
|
||||
これは`RTG_UEFN_$model`で調整します。各指にある線を選択して値を変更します。
|
||||
|
||||
- `回転アルファ:0.5`
|
||||
|
||||
## 前髪の角度を調整する
|
||||
|
||||
これは`/Content/Character/$model/VM_${model}_VrmMeta`で調整します。具体的には以下のような値にすればいいでしょう。
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"bone Name": "J_Sec_Hair1_03",
|
||||
"Hit Radius": 0
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair2_03",
|
||||
"Hit Radius": 0.01
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair3_03",
|
||||
"Hit Radius": 0.01
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"bone Name": "J_Sec_Hair1_04",
|
||||
"Hit Radius": 0
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair2_04",
|
||||
"Hit Radius": 0.01
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair3_04",
|
||||
"Hit Radius": 0.01
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"bone Name": "J_Sec_Hair1_05",
|
||||
"Hit Radius": 0
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair2_05",
|
||||
"Hit Radius": 0.01
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair3_05",
|
||||
"Hit Radius": 0.01
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
飛行時に髪が爆散する問題は以下です。
|
||||
|
||||
```json
|
||||
{
|
||||
"bone Name": "J_Sec_Hair2_03",
|
||||
"Hit Radius": 0.0
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair1_09",
|
||||
"Hit Radius": 0.01
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair1_10",
|
||||
"Hit Radius": 0.01
|
||||
}
|
||||
```
|
||||
|
||||
## アウトラインを追加する
|
||||
|
||||
アウトライン(outline)
|
||||
|
||||
1. `/Content/Blueprints/RetargetedCharacters/CBP_SandboxCharacter_$model`を作成します。前と同じ要領で新しいキャラクターを追加し、GASPで使えるようにします。
|
||||
2. componentで`BP_VrmOutlineComponent`を追加します。
|
||||
|
||||
## 見た目をきれいにする
|
||||
|
||||
これには様々なやり方が存在します。調べた限りではちゃんと機能するやり方がわからないように感じます。
|
||||
|
||||
私はcomponentの`VrmPoseableMesh`を追加して、そこに配色タイプの`custom`を当てることで調整しています。ベースは配色タイプの`unlit`を使用します。もし`unlit`で`.vrm`をimportしていない場合は再度importしてください。
|
||||
|
||||
1. アセットブラウザで`All/Plugins/`を見えるようにします(プラグインコンテンツを表示)。
|
||||
2. `/All/Plugins/VRM4U/Util/Actor/PostShadow/BP_PoseCopyToon`と`/All/Content/Blueprints/Characters/${name}/SK_${name}`をmapに配置します。そして、`BP_PoseCopyToon`に`SK_${name}`を選択します。
|
||||
3. `/All/Plugins/VRM4U/Util/Actor/PostShadow/MI_PostToon`が更新されているので`/All/Plugins/VRM4U/ImportData/DS_VRMCustom`を開いて、全部をMI_PostToonにする
|
||||
4. `.vrm`を`custom`で読み込む。そして、`/All/Content/Blueprints/CBP_SandboxCharater`のcomponentで`Vrm Poseable Mesh`を追加して、`custom/SK_${name}`を選択します。
|
||||
|
@ -20,3 +20,8 @@ control rigからも作成できます。しかし、購入したものを使う
|
||||
|
||||
https://github.com/threepeatgames/ThreepeatAnimTools
|
||||
|
||||
|
||||
## unityから持ってくる
|
||||
|
||||
[こちら](/unity/01_fbx.html)を参考にしてください。
|
||||
|
||||
|
35
book/gasp/11_run.md
Normal file
@ -0,0 +1,35 @@
|
||||
# アニメーションを変更する
|
||||
|
||||
今回はダッシュ(sprint)で一定のスピード(speed)に達すると`kawaii_run`と名付けたアラレちゃん走りに切り替わるようにします。
|
||||
|
||||
<iframe width="100%" height="415" src="https://www.youtube.com/embed/HaykQT5vBNY?mute=1&rel=0&showinfo=0&controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
|
||||
1. ABP_SandboxCharacterのAnimGraphを開きます。`cached pose`を作って処理を分割します。
|
||||
2. cached poseを呼び出して`Layered blend per bone`のbaseにつなぎます。重要なのはLayered blendの詳細で`spine_03`のボーンを入れること。
|
||||
3. blendにアニメシーケンスをつなぎます。私は`unity -> .vrma -> vrm4u`で作成したものを使いました。
|
||||
4. blend weightsの値をconfigから持ってきます。これで`CBP_SandboxCharacter`から制御できます。ダッシュが一定速度に達すれば1、それ以外は0にします。
|
||||
|
||||

|
||||
|
||||
<iframe src="https://blueprintue.com/render/9jgpq1oj/1" scrolling="no" allowfullscreen style="width:100%;height:400px"></iframe>
|
||||
|
||||
## アニメシーケンスを作る
|
||||
|
||||
- https://booth.pm/ja/items/2845548
|
||||
|
||||
これをunityを使って[変換](/unity/01_fbx.html)して使いました。
|
||||
|
||||
## リターゲットによる調整
|
||||
|
||||
`kawaii_run`は走っているときに両足を中央に持っていくのが正しいですが、このままでは足が開いてしまいます。
|
||||
|
||||
これを調整するにはリターゲットのposeを変更します。使用している`RTG_UEFN_$model`を開いて、`Running Retarget`から`Editing Retarget Pose`にします。両足を回転さればokです。一方はプラス、もう一方はマイナスの値です。
|
||||
|
||||
- left: 0.0, -2.0, 20.0
|
||||
- right: 0.0, 2.0, -20.0
|
||||
|
||||
## GASPでアニメーションを変更するには
|
||||
|
||||
`CHT_AnimationsForStateMachine`でそれぞれの項目のanimを変更すればいいのだろうかと思いましたが、走るanimに関しては、複雑すぎる上に全方位のものを用意する必要があります。
|
||||
|
||||
したがって、`ABP_SandboxCharacter`のblendを活用しながら適用しました。
|
33
book/gasp/12_weapon.md
Normal file
@ -0,0 +1,33 @@
|
||||
# 武器を装備する
|
||||
|
||||
武器を手に持つ動作を追加します。
|
||||
|
||||
<iframe width="100%" height="415" src="https://www.youtube.com/embed/VronsCH11oo?mute=1&rel=0&showinfo=0&controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
|
||||
1. SKで`装備する箇所`と`手に持つ箇所`のソケットを追加します。
|
||||
2. そこに武器のasset(mesh)を追加し、previewします。ここでは剣(sword)を使います。
|
||||
3. animを作ります。例えば、装備場所から手に持つ動作の中で剣が重なり合うようにします。
|
||||
4. 重なる場所には通知で`DrawnWeapon`, `RestWeapon`を作ります。
|
||||
5. それをCBP_SandboxCharacterのIAに設定します。`BP_WeaponSword`を作って武器のmeshを入れます。
|
||||
|
||||
## 他のキャラクターでズレてしまう
|
||||
|
||||
これはManny用のboneに設定されていますので、他のキャラではズレてしまいます。
|
||||
|
||||
対処法を考えます。
|
||||
|
||||
1. まず同じ名前のソケットをSKのboneに追加します。そして、位置を調整します。
|
||||
2. event begin playでキャラのmeshを`Character_Mesh`の変数に入れます。それをparentに使います。
|
||||
|
||||
<iframe src="https://blueprintue.com/render/ml3h546e/1" scrolling="no" allowfullscreen style="width:100%;height:400px"></iframe>
|
||||
|
||||
## niagaraがズレてしまう
|
||||
|
||||
animにniagaraを設定している場合もズレてしまいます。これは解決法がありません。
|
||||
|
||||
slash(スラッシュ)などは面倒くさいのでそのまま当てていますが、大きくなりすぎています。
|
||||
|
||||
他のniagaraは、`BP_WeaponSword`に入れて、都度使用するときに呼び出すようにしています。
|
||||
|
||||
面倒ですが体型に合わせたboneを作り、そこにniagaraを付けるといいかもしれませんが、良い解決策は見つかっていません。
|
||||
|
BIN
book/img/0007.png
Normal file
After Width: | Height: | Size: 1.4 MiB |
BIN
book/img/0008.png
Normal file
After Width: | Height: | Size: 1.5 MiB |
BIN
book/img/0009.png
Normal file
After Width: | Height: | Size: 2.0 MiB |
BIN
book/img/0010.png
Normal file
After Width: | Height: | Size: 2.2 MiB |
BIN
book/img/0011.png
Normal file
After Width: | Height: | Size: 1.8 MiB |
BIN
book/img/0012.png
Normal file
After Width: | Height: | Size: 749 KiB |
BIN
book/img/0013.png
Normal file
After Width: | Height: | Size: 380 KiB |
BIN
book/img/0014.png
Normal file
After Width: | Height: | Size: 1.1 MiB |
BIN
book/img/0015.png
Normal file
After Width: | Height: | Size: 144 KiB |
@ -15,3 +15,8 @@
|
||||
* [playerが地面に埋まってしまう](issue/city/city_04.md)
|
||||
* [他のmapとの統合](issue/city/city_05.md)
|
||||
* [BGMを変更する](issue/city/city_06.md)
|
||||
* [blender](issue/blender/README.md)
|
||||
* [衣装の背後に黒いチラつきが発生する](issue/blender/blender_01.md)
|
||||
* [vrm4u](issue/vrm4u/README.md)
|
||||
* [customで衣装の半分が灰色になる](issue/vrm4u/vrm4u_01.md)
|
||||
|
||||
|
3
book/issue/blender/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# blender
|
||||
|
||||
https://projects.blender.org/blender/blender/issues
|
6
book/issue/blender/blender_01.md
Normal file
@ -0,0 +1,6 @@
|
||||
# 衣装の背後に黒いチラつきが発生する
|
||||
|
||||
ueで読み込むと衣装の背後に黒いチラつきが発生する問題は、vrm-outlineが原因です。
|
||||
|
||||
これはblenderの問題ではありませんが、勘違いしやすいので、ここに掲載します。
|
||||
|
7
book/issue/blender/blender_02.md
Normal file
@ -0,0 +1,7 @@
|
||||
# ueで読み込むと一部のmaterialが正しく表示されない
|
||||
|
||||
この現象はblenderで作った`.vrm`をvrm4uで読み込み、一旦、ueを終了するとその後、materialがおかしくなります。
|
||||
|
||||
しかし、`vrm1`の出力は正常なので、それを読み込んで生成されたmaterialを`SK_${name}`にセットしています。
|
||||
|
||||
|
8
book/issue/blender/blender_03.md
Normal file
@ -0,0 +1,8 @@
|
||||
# 髪の毛が頭に追従しなくなる事がある
|
||||
|
||||
激しく動いたときなど、髪の毛と頭が分離してしまうことがありますが、これはウェイトが正しく塗られていないことが原因です。
|
||||
|
||||
armature(bone)を統合したとき、`head`,`neck`, `J_Bip_C_Head`, `J_Bip_C_Neck`に混在してウェイトが塗られていることがあります。
|
||||
|
||||
例えば、赤く塗るのは`J_Bip_C_Head`だけにしましょう。`耳`と`後頭部の内部(髪色部分)`が重要です。
|
||||
|
32
book/issue/city/city_07.md
Normal file
@ -0,0 +1,32 @@
|
||||
# 表示されなくなったサイト
|
||||
|
||||
昔は表示され操作もできたいくつかのサイトがweb browser pluginで操作も表示もされない現象が発生しています。ずっと待機中になります。
|
||||
|
||||
- https://web.syu.is/profile/ai.syu.is
|
||||
- https://eyes.nasa.gov/apps/solar-system
|
||||
|
||||
一つは自分が管理しているサイトですが、cloudflareを使用しています。おそらく、cloudflareのセキュリティが動作しているのだと思います。web browserのbrowser versionが低いことも要因の一つかもしれません。
|
||||
|
||||
```json
|
||||
{
|
||||
"time": "2024-10-20T08:00:00.00Z",
|
||||
"id": "1",
|
||||
"remote_ip": "ipv6",
|
||||
"host": "web.syu.is",
|
||||
"method": "GET",
|
||||
"uri": "/",
|
||||
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ++UE5+Release-5.4-CL Chrome/90.0.4430.212 Safari/537.36",
|
||||
"status": 200,
|
||||
"error": "",
|
||||
"latency": 0,
|
||||
"latency_human": "1.0ms",
|
||||
"bytes_in": 0,
|
||||
"bytes_out": 0
|
||||
}
|
||||
```
|
||||
|
||||
## 今のところうまく表示されているサイト
|
||||
|
||||
なぜか`solar-system`と同じものを使用している`asteroids`は表示されます。そのうち制限されるかもしれませんが。それともサイトの作りでしょうか。
|
||||
|
||||
- https://eyes.nasa.gov/apps/asteroids/#/planets/earth
|
@ -1,7 +1,15 @@
|
||||
## error II-E1001
|
||||
# error II-E1001
|
||||
|
||||
`Epic Games Launcher`に非常によく出るerrorです。
|
||||
|
||||
新しいassetをインストールする際に出ます。
|
||||
|
||||
時間を待てば解消されることがあります。例えば、ゲームエンジンを読み込める段階で解消されます。
|
||||
|
||||
それでも解消されない場合は、以下の方法を試してみてください。
|
||||
|
||||
## 概要
|
||||
|
||||
エラーコード「II-E1001」は、主にEpic Games LauncherまたはUnreal Engineでのプロジェクト作成やコンテンツダウンロード時に発生する問題です。このエラーの原因と解決策を以下にまとめます。`Epic Games Launcher`を再インストールすることでしか治らないこともあります。
|
||||
|
||||
1. キャッシュの破損
|
||||
@ -11,7 +19,7 @@
|
||||
3. 外部ストレージの使用
|
||||
> ライブラリが外部ハードドライブ上にある場合、ランチャーが正しく認識できないことがあります7。
|
||||
|
||||
### 解決策
|
||||
## 解決策
|
||||
|
||||
1. Vault Cacheフォルダを確認・削除
|
||||
> Epic Games Launcherの「設定」からVault Cacheの場所を確認します。
|
||||
|
3
book/issue/vrm4u/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# vrm4u
|
||||
|
||||
https://github.com/ruyo/VRM4U/issues
|
8
book/issue/vrm4u/vrm4u_01.md
Normal file
@ -0,0 +1,8 @@
|
||||
# customで衣装の半分が灰色になる
|
||||
|
||||
普段の衣装ではライトの加減で服に変な影がうっすら浮き上がる問題がありました。
|
||||
|
||||
これを解消するために`type:custom(MI_PostToon)`を当てましたが、customにすると衣装の半分が灰色になる問題が出ました。
|
||||
|
||||
これを解消するためにはcustomの`/custom/SK_${model}`に設定されているmaterialを編集し、`MI_PostToon`から`/Plugins/VRM4UContents/MaterialUtil/UE5/Material/MI_VrmMToonOptUnlitOpaque`に切り替えると解消されました。
|
||||
|
@ -17,3 +17,16 @@ GASと連携するには飛行モードを有効にするときだけABPを切
|
||||
|SprintArm|Target Arm Length|最大でどれだけカメラを離すか|
|
||||
|SprintArm|Camera Lag Speed|ターゲットに到達する速度。大きいほど遅くなる|
|
||||
|SprintArm|Camera Lag Max Distance|遅れを取る最大距離|
|
||||
|
||||
## アニメーションの変更
|
||||
|
||||
これはBPで変更できるものもあれば、ABPで変更しなければいけないものもあります。
|
||||
|
||||
例えば、idleのanimを変更します。
|
||||
|
||||
1. `/Content/SuperheroFlight/Characters/Mannequins/Animations/ABP_Player_UE5`を開いて、AnimGraphのHoverFlightIdleを見ます。
|
||||
2. そこにSequence Playerがありますが、`A_Flight_Idle_A`を変更します。
|
||||
3. 私はMagicalAnimSet(有料)を使いました。`/Content/MagicalAnimSet/Animations/locomotion/Inplace/run_f_loop`を右クリックして、アニメリターゲットで`Content/SuperheroFlight/Characters/Mannequins/Meshes/SKM_Quinn`をターゲットに参照します。superheroで動くanimの`run_f_loop`が作成されます。
|
||||
4. `HoverFlightIdle`のところで`A_Flight_Idle_A -> run_f_loop`と入れ替えます。
|
||||
|
||||
この要領でanimを変更していきます。
|
||||
|
@ -7,11 +7,50 @@ blueprintなどでも`uds`と略されます。
|
||||
1. `/Content/UltraDynamicSky/Blueprints/Ultra_Dynamic_Sky`, `Ultra_Dynamic_Weather`をlevelに置きます。
|
||||
2. `Ultra_Dynamic_Weather(Self)`の詳細から`Random Weather Variation:Hourly`にします。これで天候がすぐに変わります。
|
||||
|
||||
## planet systemを作る
|
||||
|
||||
地上から宇宙にシームレスに移動できるmapを作ります。といっても様々な問題があり、完全には難しいです。一応、[WorldScape Plugin](https://www.fab.com/listings/0ef85bf8-a0be-4b74-87f8-b66bb44d6ae2)というものがあります。
|
||||
|
||||
1. `/Content/UltraDynamicSky/Blueprints/Ultra_Dynamic_Sky`を開きます。
|
||||
2. そこに地球と月と太陽のBPを入れます。各自が用意してください。なお、地球は`SkyAtmosphere`の下に置いてください。
|
||||
> 名前は 地球(BP_Earth), 月(BP_Moon), 太陽(BP_Sun) としておきます。
|
||||
3. `BP_Earth`は詳細から`transform-location-z:-636000000`, `transform-scale:6360000`にします。
|
||||
4. `Sky_Sphere_Mesh`の`transform-scale:50000`にします。
|
||||
5. 関数の`Current Star Color(pure)`にて高度を取得できるため、各componentの表示と非表示(visibility)を切り替えます。
|
||||
|
||||
<iframe src="https://blueprintue.com/render/k3xgicx_/1" scrolling="no" allowfullscreen style="width:100%;height:400px"></iframe>
|
||||
|
||||
- `BP_Earth`: `transform-location-z:-636000000`, `transform-scale:6370000`
|
||||
- `Sky_Sphere_Mesh`: `transform-scale:50000`
|
||||
|
||||
## issue: mapのcollisionがおかしくなる
|
||||
|
||||
これはearthを`SkyAtmosphere`の下に置くと発生します。親子関係を解除しましょう。
|
||||
|
||||
## issue: earthの下に黒丸(影)がある
|
||||
|
||||
earthのscaleを636から637に変更することで解消できます。
|
||||
|
||||
earthを下に見ると、黒い丸が映り込みます。これは、udsをupdateすると発生し始めました。
|
||||
|
||||
また、`Captured Scene Sky Lightの`Real Time Capture`をdisableにすると雲も影も無くなります。したがって、条件でon/offを切り変える方法で緩和できます。この方法は使用しなくても良いです。
|
||||
|
||||
> リアルタイムキャプチャが有効なスカイライトがシーンにあります。少なくともskyatmosphereコンポーネント、volumetriccloudコンポーネント、またはisksyとしてマテリアルタグが付いたメッシュが必要です。これらがない場合は黒になります。
|
||||
|
||||
## issue: 地平線を消す
|
||||
|
||||
これは`Fog Max Opacity:0.0`にします。
|
||||
|
||||
## issue: 透明な地上が目立つ
|
||||
|
||||
Fogを消すと透明な地上が目立つようになります。特に目立つのは夜ですね。
|
||||
|
||||
これは`SkyAtmosphere`の色合いで調整しましょう。
|
||||
|
||||
## 雪を積もらせる
|
||||
|
||||
1. landscapeにあるmaterialを編集します。
|
||||
2. ultra dynamic weatherと検索して追加します。
|
||||
3. base color, normalなどのpinがあればつなげます。
|
||||
|
||||
|
||||
<iframe width="100%" height="415" src="https://www.youtube.com/embed/ENMuqbNSLTs?start=912&&rel=0&showinfo=0&controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
|
@ -19,3 +19,10 @@
|
||||
> WaterVolume: 空間にロードされていないアクタを参照しています。
|
||||
|
||||
これは`BP_EarthSizedOcean`, `BP_EarthSizedSphericalMesh`の詳細から`is spatially loaded`のチェックを外します。
|
||||
|
||||
## ocean wavesが遅い理由
|
||||
|
||||
これは`/Content/OceanWaves/Blueprints/BP_SphericalMesh`の`CreateMeshAsyncIteration`にある`Set Timer for Next Tick by Event`が原因です。
|
||||
|
||||
しかし、取り除くと海が消えます。ロードを待つほかありません。
|
||||
|
||||
|
11
book/plan/07_wsp.md
Normal file
@ -0,0 +1,11 @@
|
||||
# worldscape plugin
|
||||
|
||||
[worldscape plugin](https://www.fab.com/listings/0ef85bf8-a0be-4b74-87f8-b66bb44d6ae2)
|
||||
|
||||
本格的な惑星を構築できます。
|
||||
|
||||
現在、ue5.5をsupportしていませんので、まだ使用できていません。購入者は[discord](https://discord.gg/JD8jvKpmkh)でベータ版の提供を受けることが可能です。
|
||||
|
||||
## city sampleや他のmapと統合できるのか
|
||||
|
||||
わかりません。
|
@ -8,12 +8,13 @@
|
||||
|[logicdriver](https://www.fab.com/ja/listings/a3e2fc1f-2aaa-49a1-bc26-4d5d38f7d82f)|<span style="color:red">3</span>|20241212|ロジックのシステム|[docs](https://logicdriver.com/docs/pages/prochangelog/)|
|
||||
|[dragon ik plugin](https://www.fab.com/ja/listings/d3f8d256-d8d9-4d27-91c1-c61e55e984a6)|<span style="color:red">3</span>|20250122|animをターゲットに追従|[docs](https://dragonik.eternalmonke.com/)|
|
||||
|[superhero flight animations](https://www.fab.com/ja/listings/41185c19-5191-4153-8293-8cc9901efa95)|2|20241217|空を飛ぶシステム||
|
||||
|[clazy runner action pack](https://www.fab.com/ja/listings/3f4f4475-c9d1-46e8-992c-4a8f3aff58ed)|2|20240518|ダッシュのシステム||
|
||||
|[rts camera system](https://www.fab.com/ja/listings/d063c9c9-6df3-4eeb-b7f3-797b5507379e)|2|20231123|カメラシステム|[docs](https://docs.google.com/document/d/e/2PACX-1vQevvLmKDkw0Z6okftdwGCTTLYOYFO-71mvyV6co4wN8oMuJFJDQAGXCx4CckKcpd-FQEUz5i8QHeQS/pub)|
|
||||
|[clazy runner action pack](https://www.fab.com/ja/listings/3f4f4475-c9d1-46e8-992c-4a8f3aff58ed)|1|20240518|ダッシュのシステム||
|
||||
|[rts camera system](https://www.fab.com/ja/listings/d063c9c9-6df3-4eeb-b7f3-797b5507379e)|1|20231123|カメラシステム|[docs](https://docs.google.com/document/d/e/2PACX-1vQevvLmKDkw0Z6okftdwGCTTLYOYFO-71mvyV6co4wN8oMuJFJDQAGXCx4CckKcpd-FQEUz5i8QHeQS/pub)|
|
||||
|[space frontier stations & ships](https://www.fab.com/listings/79323b40-dc56-43bf-8aea-b13800266329)|1|20241114|宇宙船のシステム|[docs](https://docs.google.com/document/d/1p5MY13cpTlVtqP7sCQpAoE_k5VHklmndZ4cHeBy105Y/)|
|
||||
|[replicated interaction kit vol 3](https://www.fab.com/ja/listings/3ce13688-fd10-462f-b90d-964c85a090ad)|1|20241115|椅子に座るシステム||
|
||||
|[ocean waves](https://www.fab.com/ja/listings/bfb5c9f8-4e57-4cbe-8273-c88540965412)|1|20241217|惑星の海を作る|[docs](https://www.youtube.com/playlist?list=PLvRH9sjZUdXfuLpvStHfpKyESQoOq28R7)|
|
||||
|[overlay outline material](https://www.fab.com/ja/listings/5d42ff7a-6198-4443-b1a1-eb60348407fe)|1|20241124|アウトラインのエフェクト||
|
||||
|[worldscape plugin](https://www.fab.com/listings/0ef85bf8-a0be-4b74-87f8-b66bb44d6ae2)|1|5.4|惑星を構築するplugin|[docs](https://iolacorp-1.gitbook.io/worldscape-plugin)|
|
||||
|
||||
`rank`は更新頻度(追加)や価格から判断されます。`3`のassetがオススメです。
|
||||
|
||||
@ -31,9 +32,7 @@ mapを見ていると買いたくなるのはわかります。しかし、map
|
||||
|
||||
- 高いassetを購入しない
|
||||
|
||||
高いものには良いものもあります。が、良くないもの、使えないものもたくさんあります。最初は手を出すべきではありません。安くて良いassetがたくさんあります。高いものより結局そっちを使うことになることのほうが多い。
|
||||
|
||||
ある程度わかってきたら購入するのはいいかもしれません。その際は独自性を見るようにします。
|
||||
高いものには良いものもあります。が、良くないもの、使えないものもたくさんあります。最初は手を出すべきではありません。安くて良いassetがたくさんあります。高いものより結局そっちを使うことになることのほうが多いです。ある程度わかってきたら購入するのはいいかもしれません。その際は独自性を見るようにしています。
|
||||
|
||||
- 長らく更新されているassetを購入する
|
||||
|
||||
@ -45,5 +44,11 @@ assetを購入する際は必ず作者を確認してください。他にどの
|
||||
|
||||
- 機能をまとめる
|
||||
|
||||
使うassetは少なければ少ないほど良いです。依存関係は少なくしましょう。`epic games`が提供するdefault(デフォルト)のものだけで作るのが一番ですが、それだけでは時間がかかったり、クオリティが低かったりします。そんなとき有料assetに頼ることになります。しかし、「使うassetを少なく」は有効です。シンプルな設定で使えるもの、たくさんの機能をまとめて使えるものがオススメです。
|
||||
使うassetは少なければ少ないほど良いです。依存関係は少なくしましょう。`epic games`が提供するdefault(デフォルト)のものだけで作るのが一番ですが、それだけでは時間がかかったり、クオリティが低かったりします。そんなとき有料assetに頼ることになります。しかし、「使うassetを少なくする」のは有効です。シンプルな設定で使えるもの、たくさんの機能をまとめて使えるものがオススメです。
|
||||
|
||||
## 検討中
|
||||
|
||||
|name|latest|body|docs|
|
||||
|---|---|---|---|
|
||||
|[mocap tools](https://www.fab.com/ja/listings/7608fd4d-4c2c-40be-9a06-274e6f7ef6cc)|5.4|root motionの修正|[docs](https://docs.google.com/document/d/1OVx8H7VGQ1_XdaPFxRNlVYDktbdolx7KWTXBbxJLyac/)|
|
||||
|
||||
|
25
book/unity/01_fbx.md
Normal file
@ -0,0 +1,25 @@
|
||||
# animation clipをueで使う
|
||||
|
||||
## fbxでexportする
|
||||
|
||||
unityのmotionはanimation clipといいます。fbxでexportするには`fbx`, `recorder`を使います。
|
||||
|
||||
1. `.vrm`を読み込みます。vrmを読み込むpackage(plugin/addon)を追加してください。
|
||||
2. Sceneにmodel(object)をD&Dします。
|
||||
3. animation clipをmodelにD&Dします。すると、Animatorが追加されます。具体的には`Entry -> Animation Clip`になります。再生するとmotionが再生されます。
|
||||
4. package-managerの`unity registry`でfbxとrecorderを検索し、packageをinstallします。
|
||||
5. `Window -> General -> Recorder -> Recorder Window -> Add: FBX`を追加します。
|
||||
6. GameObjectの欄にmodelをD&Dします。そして、Start Recordingを実行します。止めると`.fbx`が保存されます。
|
||||
|
||||
## vrmaでexportする
|
||||
|
||||
ueでfbxをimportしてもリターゲットが設定されていません。これは非常に面倒です。したがって、`.vrma`でexportして、ue(vrm4u)で読み込む方法があります。
|
||||
|
||||
今回は、原神やProject Mugenなどに出てくる通称、アラレちゃん走りを作ってみます。
|
||||
|
||||
https://booth.pm/ja/items/2845548
|
||||
|
||||
1. unityの[AnimationClipToVrmaSample](https://github.com/malaybaku/AnimationClipToVrmaSample)を使って`.vrma`にexportする。
|
||||
2. `${model}/RTG_UEFN_${animation_clip}`を開く。この際、`ルートボーンに垂直オフセットを適用`します。
|
||||
3. そこでグローバル設定にて`ルートを有効化`のチェックを外します。そして、animをexportします。
|
||||
|
@ -2,6 +2,12 @@
|
||||
|
||||
[unity](https://unity.com/ja)
|
||||
|
||||
|plugin|body|
|
||||
unityを開いて、package-managerを起動し、名前で検索してください。
|
||||
|
||||
|package|body|
|
||||
|---|---|
|
||||
|https://github.com/vrm-c/UniVRM|vrmを読み込む|
|
||||
|https://github.com/malaybaku/AnimationClipToVrmaSample|animation clipをvrmaにexportする|
|
||||
|fbx|fbxをimport/exportする|
|
||||
|recorder|animation clipをexportする|
|
||||
|
||||
|
18
book/vrm4u/01_make.md
Normal file
@ -0,0 +1,18 @@
|
||||
# キャラクターを作る
|
||||
|
||||
ueで読み込むには`vrm4u`というpluginを使用します。
|
||||
|
||||
<iframe width="100%" height="415" src="https://www.youtube.com/embed/0Ig_-JSRV0M?si=Kz_jCbYTHr_OzPpP&start=0&end=23&mute=1&rel=0&showinfo=0&controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
|
||||
1. [vrm4u](https://github.com/ruyo/VRM4U/releases)をダウンロード(download)して、`$project/Plugins`に入れる。
|
||||
> $project/Plugins/VRM4U/VRM4U.uplugin
|
||||
2. editorのファイルエクスプローラーでモデルファイルの`.vrm`をD&Dします。色々と聞かれますが適当にokや選択します。配色タイプが聞かれます。例えば、`$project/Content/Characters`に`model`フォルダを作り`model.vrm`をimport(インポート)した場合で解説します。
|
||||
> $project/Content/Characters/$model
|
||||
|
||||
モデル(model)は[こちら](https://hub.vroid.com/users/36144806)からdownloadすることができます。私は、`vrm 1.0`を使用ていますが、`vrm 0.0`のほうが安定しています。
|
||||
|
||||
重要なファイルは`$project/Content/Characters/$model/SK_$model`, `ABP_Post_$model`, `RTG_UEFN_$model`になります。
|
||||
|
||||
https://vrm.dev/vrm1/
|
||||
|
||||
|
6
book/vrm4u/02_yubi.md
Normal file
@ -0,0 +1,6 @@
|
||||
# 指の角度を調整する
|
||||
|
||||
`RTG_UEFN_$model`で調整します。各指にある線を選択して値を変更します。
|
||||
|
||||
- `回転アルファ:0.5`
|
||||
|
69
book/vrm4u/03_hair.md
Normal file
@ -0,0 +1,69 @@
|
||||
# 前髪の角度を調整する
|
||||
|
||||
前髪が少し浮き上がっていたので、角度を調整する方法を紹介します。
|
||||
|
||||
これは`/Content/Character/$model/VM_${model}_VrmMeta`で調整します。具体的には以下のような値にすればいいでしょう。
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"bone Name": "J_Sec_Hair1_03",
|
||||
"Hit Radius": 0
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair2_03",
|
||||
"Hit Radius": 0.01
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair3_03",
|
||||
"Hit Radius": 0.01
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"bone Name": "J_Sec_Hair1_04",
|
||||
"Hit Radius": 0
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair2_04",
|
||||
"Hit Radius": 0.01
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair3_04",
|
||||
"Hit Radius": 0.01
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"bone Name": "J_Sec_Hair1_05",
|
||||
"Hit Radius": 0
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair2_05",
|
||||
"Hit Radius": 0.01
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair3_05",
|
||||
"Hit Radius": 0.01
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
飛行時に髪が爆散する問題は以下です。
|
||||
|
||||
```json
|
||||
{
|
||||
"bone Name": "J_Sec_Hair2_03",
|
||||
"Hit Radius": 0.0
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair1_09",
|
||||
"Hit Radius": 0.01
|
||||
},
|
||||
{
|
||||
"bone Name": "J_Sec_Hair1_10",
|
||||
"Hit Radius": 0.01
|
||||
}
|
||||
```
|
||||
|
||||
|
8
book/vrm4u/04_outline.md
Normal file
@ -0,0 +1,8 @@
|
||||
# アウトラインを追加する
|
||||
|
||||
アウトライン(outline)
|
||||
|
||||
1. `/Content/Blueprints/RetargetedCharacters/CBP_SandboxCharacter_$model`を作成します。前と同じ要領で新しいキャラクターを追加し、GASPで使えるようにします。
|
||||
2. componentで`BP_VrmOutlineComponent`を追加します。
|
||||
|
||||
|
10
book/vrm4u/05_toon.md
Normal file
@ -0,0 +1,10 @@
|
||||
# トーンを変える
|
||||
|
||||
これには様々なやり方が存在します。
|
||||
|
||||
私はcomponentの`VrmPoseableMesh`を追加して、そこに配色タイプの`custom`を当てることで調整しています。ベースは配色タイプの`unlit`を使用します。もし`unlit`で`.vrm`をimportしていない場合は再度importしてください。
|
||||
|
||||
1. アセットブラウザで`All/Plugins/`を見えるようにします(プラグインコンテンツを表示)。
|
||||
2. `/All/Plugins/VRM4U/Util/Actor/PostShadow/BP_PoseCopyToon`と`/All/Content/Blueprints/Characters/${name}/SK_${name}`をmapに配置します。そして、`BP_PoseCopyToon`に`SK_${name}`を選択します。
|
||||
3. `/All/Plugins/VRM4U/Util/Actor/PostShadow/MI_PostToon`が更新されているので`/All/Plugins/VRM4U/ImportData/DS_VRMCustom`を開いて、全部をMI_PostToonにする
|
||||
4. `.vrm`を`custom`で読み込む。そして、`/All/Content/Blueprints/CBP_SandboxCharater`のcomponentで`Vrm Poseable Mesh`を追加して、`custom/SK_${name}`を選択します。
|
6
book/vrm4u/README.md
Normal file
@ -0,0 +1,6 @@
|
||||
# vrm4u
|
||||
|
||||
[vrm4u](https://github.com/ruyo/VRM4U)の使い方を紹介します。
|
||||
|
||||
`vrm4u`は`.vrm`をimportするためのpluginです。`.vrm`は[vroid](https://vroid.com/)などから作成します。
|
||||
|
213
book/web/01_three.md
Normal file
@ -0,0 +1,213 @@
|
||||
# three.js
|
||||
|
||||
reactの`tsx`で書きます。
|
||||
|
||||
```sh
|
||||
$ npx create-react-app galaxy --template typescript
|
||||
```
|
||||
|
||||
これで準備はできましたが、設定ファイルを見てみます。
|
||||
|
||||
> tsconfig.json
|
||||
|
||||
```json
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"lib": [
|
||||
"dom",
|
||||
"dom.iterable",
|
||||
"esnext"
|
||||
],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"esModuleInterop": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"strict": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "node",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"noEmit": true,
|
||||
"jsx": "react-jsx"
|
||||
},
|
||||
"include": [
|
||||
"src"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
`es5`, `react-jsx`を使っているようです。
|
||||
|
||||
buildなどはwebpackではなく`react-scripts`ですね。
|
||||
|
||||
> package.json
|
||||
|
||||
```json
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
"build": "react-scripts build",
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject"
|
||||
}
|
||||
```
|
||||
|
||||
> src/App.tsx
|
||||
|
||||
```ts
|
||||
import React from 'react';
|
||||
import './App.css';
|
||||
import { ThreeFiberGalaxy } from './pages/galaxy';
|
||||
|
||||
function App() {
|
||||
return <ThreeFiberGalaxy />
|
||||
}
|
||||
|
||||
export default App;
|
||||
```
|
||||
|
||||
> src/pages/galaxy.tsx
|
||||
|
||||
```ts
|
||||
// https://gist.github.com/artokun/fb7f0c68a01ba5d9813abb3ccce254c4
|
||||
|
||||
import * as THREE from 'three'
|
||||
import { Points, useGLTF } from '@react-three/drei'
|
||||
import { GLTF } from 'three-stdlib'
|
||||
import { useFrame, Canvas } from '@react-three/fiber'
|
||||
import { useMemo, useRef } from 'react'
|
||||
import { EffectComposer, SelectiveBloom } from '@react-three/postprocessing'
|
||||
|
||||
type GLTFResult = GLTF & {
|
||||
nodes: {
|
||||
Object_2: THREE.Mesh
|
||||
}
|
||||
materials: {
|
||||
['Scene_-_Root']: THREE.PointsMaterial
|
||||
}
|
||||
}
|
||||
|
||||
export function Galaxy(props: JSX.IntrinsicElements['group']) {
|
||||
const ref = useRef<THREE.Group>(null!)
|
||||
const galaxyCenterLightRef = useRef<THREE.PointLight>(null!)
|
||||
const { nodes } = useGLTF('./models/galaxy.glb') as GLTFResult
|
||||
const [positions, colors] = useMemo(() => {
|
||||
nodes.Object_2.geometry.center()
|
||||
const positions = new Float32Array(
|
||||
nodes.Object_2.geometry.attributes.position.array.buffer
|
||||
)
|
||||
const colors = new Float32Array(positions.length)
|
||||
|
||||
const getDistanceToCenter = (x: number, y: number, z: number) =>
|
||||
Math.sqrt(x * x + y * y + z * z)
|
||||
|
||||
// make colors closer to 0,0,0 be more reddish and colors further away be more blueish
|
||||
const color = new THREE.Color()
|
||||
for (let i = 0; i < positions.length; i += 3) {
|
||||
const x = positions[i]
|
||||
const y = positions[i + 1]
|
||||
const z = positions[i + 2]
|
||||
const distanceToCenter = getDistanceToCenter(x, y, z)
|
||||
const normalizedDistanceToCenter = distanceToCenter / 100
|
||||
|
||||
// make colors closer to 0,0,0 be more reddish and colors further away be more blueish (do not use hsl)
|
||||
// color.setHSL(
|
||||
// (0.15 * (0.21 + Math.cos(distanceToCenter * 0.02))) / 2,
|
||||
// 0.75,
|
||||
// 0.6
|
||||
// )
|
||||
color.setRGB(
|
||||
Math.cos(normalizedDistanceToCenter),
|
||||
THREE.MathUtils.randFloat(0, 0.8),
|
||||
Math.sin(normalizedDistanceToCenter)
|
||||
)
|
||||
color.toArray(colors, i)
|
||||
}
|
||||
|
||||
return [positions, colors]
|
||||
}, [nodes])
|
||||
//const starTexture = useLoader(THREE.TextureLoader, '/star.png')
|
||||
|
||||
// slowly rotate the galaxy
|
||||
useFrame(({ clock }) => {
|
||||
ref.current.rotation.z = clock.getElapsedTime() / 5
|
||||
// zoom in and out
|
||||
// ref.current.scale.setScalar(Math.sin(clock.getElapsedTime() / 2) + 1.5)
|
||||
})
|
||||
|
||||
// make particles glow
|
||||
|
||||
return (
|
||||
<group {...props} dispose={null} ref={ref}>
|
||||
<pointLight
|
||||
position={[0, 0, 0]}
|
||||
ref={galaxyCenterLightRef}
|
||||
intensity={0.5}
|
||||
/>
|
||||
<Points scale={0.05} positions={positions} colors={colors}>
|
||||
<pointsMaterial
|
||||
//map={starTexture}
|
||||
transparent
|
||||
depthWrite={false}
|
||||
vertexColors
|
||||
opacity={0.4}
|
||||
depthTest
|
||||
size={0.01}
|
||||
/>
|
||||
</Points>
|
||||
<EffectComposer autoClear={false}>
|
||||
<SelectiveBloom
|
||||
intensity={2}
|
||||
luminanceThreshold={0.001}
|
||||
luminanceSmoothing={0.225}
|
||||
lights={[galaxyCenterLightRef]}
|
||||
/>
|
||||
</EffectComposer>
|
||||
</group>
|
||||
)
|
||||
}
|
||||
|
||||
useGLTF.preload('./models/galaxy.glb')
|
||||
```
|
||||
|
||||
`App.tsx`で読み込むため以下を追記します。
|
||||
|
||||
> src/pages/galaxy.tsx
|
||||
|
||||
```ts
|
||||
export const ThreeFiberGalaxy = () => {
|
||||
return (
|
||||
<Canvas>
|
||||
<ambientLight />
|
||||
<pointLight position={[10, 10, 10]} />
|
||||
<Galaxy position={[0, 0, 0]} />
|
||||
</Canvas>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
`.glb`は[こちら](https://sketchfab.com/3d-models/need-some-space-d6521362b37b48e3a82bce4911409303)からダウンロードして、`public/models/galaxy.glb`に置いてください。
|
||||
|
||||
```sh
|
||||
$ npm run start
|
||||
```
|
||||
|
||||
controlを追加します。
|
||||
|
||||
```sh
|
||||
import { Points, useGLTF, OrbitControls } from '@react-three/drei'
|
||||
|
||||
export const ThreeFiberGalaxy = () => {
|
||||
return (
|
||||
<Canvas>
|
||||
<OrbitControls />
|
||||
<ambientLight />
|
||||
<pointLight position={[10, 10, 10]} />
|
||||
<Galaxy position={[0, 0, 0]} />
|
||||
</Canvas>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
212
book/web/02_three-vrm.md
Normal file
@ -0,0 +1,212 @@
|
||||
# three-vrm
|
||||
|
||||
今回は`react-three-fiber`と`three-vrm-animation`を使います。
|
||||
|
||||
react-three-fiberはsceneなどを自動でやってくれて、コードもシンプルになります。
|
||||
|
||||
> `react-three-fiber`で書く場合に`.vrma`の動きがおかしくなりました。私の環境では`unity + vrm 1.0`でexportしたものを使うと正常に動きました。
|
||||
|
||||
```sh
|
||||
$ npx create-react-app vrm-model --template typescript
|
||||
$ npm i
|
||||
$ npm run start
|
||||
```
|
||||
|
||||
> src/pages/vrm-model.tsx
|
||||
|
||||
```ts
|
||||
import * as THREE from 'three'
|
||||
import React, { useState, useEffect, useRef } from 'react';
|
||||
import { OrbitControls } from '@react-three/drei'
|
||||
import { useFrame, Canvas } from '@react-three/fiber';
|
||||
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
|
||||
import { VRM, VRMUtils, VRMLoaderPlugin } from '@pixiv/three-vrm';
|
||||
import { VRMAnimationLoaderPlugin, VRMAnimation, createVRMAnimationClip } from "@pixiv/three-vrm-animation";
|
||||
|
||||
interface ModelProps {
|
||||
url: string
|
||||
url_anim: string
|
||||
}
|
||||
|
||||
const VRMModel: React.FC<ModelProps> = ({ url, url_anim }) => {
|
||||
|
||||
const [vrm, setVrm] = useState<VRM | null>(null);
|
||||
const mixerRef = useRef<THREE.AnimationMixer | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
const loader = new GLTFLoader();
|
||||
loader.register((parser) => new VRMLoaderPlugin(parser));
|
||||
loader.register((parser) => new VRMAnimationLoaderPlugin(parser));
|
||||
loader.load(url, (gltf) => {
|
||||
const vrmModel = gltf.userData.vrm as VRM;
|
||||
VRMUtils.removeUnnecessaryJoints(vrmModel.scene);
|
||||
setVrm(vrmModel);
|
||||
const mixer = new THREE.AnimationMixer(vrmModel.scene);
|
||||
mixerRef.current = mixer;
|
||||
loader.load(url_anim, (animGltf) => {
|
||||
const vrmAnimations = animGltf.userData.vrmAnimations as VRMAnimation[];
|
||||
if (vrmAnimations && vrmAnimations.length > 0) {
|
||||
const clip = createVRMAnimationClip(vrmAnimations[0], vrmModel);
|
||||
mixer.clipAction(clip).play();
|
||||
}
|
||||
});
|
||||
});
|
||||
}, [url, url_anim]);
|
||||
|
||||
useFrame((state, delta) => {
|
||||
if (mixerRef.current) mixerRef.current.update(delta);
|
||||
if (vrm) vrm.update(delta);
|
||||
});
|
||||
|
||||
return vrm ? <primitive object={vrm.scene} /> : null;
|
||||
};
|
||||
|
||||
export const VRMModelCanvas = () => {
|
||||
return (
|
||||
<div style={{ height: '100vh', width: '100vw' }}>
|
||||
|
||||
<Canvas
|
||||
shadows
|
||||
gl={{
|
||||
//toneMapping: THREE.ACESFilmicToneMapping,
|
||||
//toneMapping: THREE.ReinhardToneMapping,
|
||||
toneMapping: THREE.NeutralToneMapping,
|
||||
toneMappingExposure: 1.5,
|
||||
alpha: true,
|
||||
powerPreference: "high-performance",
|
||||
antialias: true,
|
||||
//stencil: false,
|
||||
//depth: false
|
||||
}}
|
||||
camera={{ position: [1, 1, 1] }}>
|
||||
|
||||
<directionalLight
|
||||
color="white"
|
||||
castShadow
|
||||
position={[0, 10, 0]}
|
||||
intensity={1.5}
|
||||
shadow-mapSize={[1024, 1024]}/>
|
||||
|
||||
<OrbitControls />
|
||||
<ambientLight intensity={1} />
|
||||
<pointLight position={[10, 10, 10]} />
|
||||
|
||||
<VRMModel url="./models/default.vrm" url_anim="./models/default.vrma" />
|
||||
|
||||
</Canvas>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
export default VRMModelCanvas;
|
||||
```
|
||||
|
||||
重要な箇所は以下のポイントです。
|
||||
|
||||
```html
|
||||
<VRMModel url="./models/default.vrm" url_anim="./models/default.vrma" />
|
||||
```
|
||||
|
||||
ファイルはこの場所から読み込みますので、ダウンロードする場合は[.vrm](https://vroid.pixiv.help/hc/ja/articles/31627266179865-%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84), [.vrma](https://booth.pm/ja/items/5512385)をここに置きます。
|
||||
|
||||
> src/App.tsx
|
||||
|
||||
```ts
|
||||
import React from 'react'
|
||||
import VRMModelCanvas from './pages/vrm_model'
|
||||
|
||||
const App = () => {
|
||||
return (
|
||||
<VRMModelCanvas/>
|
||||
)
|
||||
}
|
||||
|
||||
export default App;
|
||||
```
|
||||
|
||||
> package.json
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "vrm-model",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@pixiv/three-vrm": "^3.0.0",
|
||||
"@pixiv/three-vrm-animation": "^3.0.0",
|
||||
"@react-three/drei": "^9.109.2",
|
||||
"@react-three/fiber": "^8.16.8",
|
||||
"@react-three/postprocessing": "^2.16.2",
|
||||
"@testing-library/jest-dom": "^5.17.0",
|
||||
"@testing-library/react": "^13.4.0",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
"@types/jest": "^27.5.2",
|
||||
"@types/node": "^16.18.104",
|
||||
"@types/react": "^18.3.3",
|
||||
"@types/react-dom": "^18.3.0",
|
||||
"@types/three": "^0.167.1",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-scripts": "5.0.1",
|
||||
"three": "^0.167.1",
|
||||
"three-stdlib": "^2.30.5",
|
||||
"typescript": "^4.9.5",
|
||||
"web-vitals": "^2.1.4"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
"build": "react-scripts build",
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"react-app",
|
||||
"react-app/jest"
|
||||
]
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
> tsconfig.json
|
||||
|
||||
```json
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"lib": [
|
||||
"dom",
|
||||
"dom.iterable",
|
||||
"esnext"
|
||||
],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"esModuleInterop": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"strict": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "node",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"noEmit": true,
|
||||
"jsx": "react-jsx"
|
||||
},
|
||||
"include": [
|
||||
"src"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
13
book/web/README.md
Normal file
@ -0,0 +1,13 @@
|
||||
# web
|
||||
|
||||
webで動くゲームを開発する技術を紹介します。
|
||||
|
||||
3Dモデルには様々な形式があります。ここでは`.glb`, `.vrm`を扱います。
|
||||
|
||||
これらをwebに表示することができます。例えば、[tyrano builder](https://b.tyrano.jp/)と組み合わせノベルゲームを作成できます。
|
||||
|
||||
|url|body|
|
||||
|---|---|
|
||||
|https://github.com/mrdoob/three.js/|3Dモデルをwebに表示|
|
||||
|https://github.com/pixiv/three-vrm/|vrmをthree.jsで扱う|
|
||||
|
81
book/youtube/01_ep.md
Normal file
@ -0,0 +1,81 @@
|
||||
# 自己紹介
|
||||
|
||||
自己紹介では、自分の紹介と、何をやっているか、何をやっていきたいかを明確にします。
|
||||
|
||||
長くてはいけません。できれば1行で動画の枠に収まるよう短くします。配色も考えておきます。
|
||||
|
||||
## 名前
|
||||
|
||||
`syui`という名前で活動していること。youtubeチャンネルが`syai`となっている理由。`syui`という名前は既に他の人が使っており、選択できなかった。なので、使用するキャラクターの`ai`を合体させた名前。または`syui.ai`というドメインの略。
|
||||
|
||||
## ゲーム開発
|
||||
|
||||
目指すゲームは、現実をゲームに反映すること。
|
||||
|
||||
最初に取り掛かったのはゲーム作りそのものではなく、現実をゲームに反映するためのアカウントシステムを考えることだった。
|
||||
|
||||
## なぜアカウントが重要
|
||||
|
||||
現在のゲームは、ゲーム性よりも、より個人に近いアカウントのほうが重要になると考えているから。
|
||||
|
||||
どれほどすごいゲーム、面白いゲームでも、その記録が残らないのは悲しい。
|
||||
|
||||
ゲーム作りで最も重要、最初に始めるべきことはなんだろう。
|
||||
|
||||
私は記録(を残す)システムを作ることだと思った。
|
||||
|
||||
より現実の個人に近いアカウントにゲームプレイの内容が反映される方法を考え、実装することにした。
|
||||
|
||||
## 記録装置を作ったあとは
|
||||
|
||||
記録するシステム、つまりアカウントシステムを作ったあとは、特徴のあるゲームを作ろうと思った。
|
||||
|
||||
特徴のあるゲームとは「このゲームは何なのか、他のゲームとの違いは」を一言で表すことができる。
|
||||
|
||||
例えば、立ち絵一つで表現できればそれで合格だと思っている。ゼルダや原神、ゲームのパッケージを見れば作品のことがひと目で分かる。
|
||||
|
||||
既存のゲームをそのまま真似してそっくりなものを作っても意味がない。
|
||||
|
||||
誰にでも好きなものはあるはずで、原点がある。それは普遍的、自然的なもの。そういったものの組み合わせ。
|
||||
|
||||
私の場合は`宇宙`だった。宇宙とアイ、一枚の青写真を描いた。
|
||||
|
||||
## 宇宙とアイ
|
||||
|
||||
このゲームは現実の反映を目指している。だからマップを作る際もこのことを意識して作ることになる。
|
||||
|
||||
しかし、ゲームは基本的に平面で作られていて、それはどこまで行っても地平線が広がっているだけの世界。月や太陽があっても背面の絵を動かしているだけだったりする。
|
||||
|
||||
この常識を作り変え、現実に合わせた形にする。空の上を高く高く飛んでいくと、そこには大気圏が広がり、それを抜けると宇宙に出られる。そこには実際に行ける月があり、太陽がある。全てはつながっていて、そこに行くことができる世界を目指します。これを`planet system`と呼んでいる。
|
||||
|
||||
ゲームプレイ中に行けないような場所、見えないようなところもちゃんと作る。そのような思いで開発に取り組む。
|
||||
|
||||
## 体験はどこに
|
||||
|
||||
体験はどこに帰属し、どこにあるのだろう。
|
||||
|
||||
私は、プレイヤーが持つ唯一性だと思う。だから、このゲームでは、プレイヤーはゲーム内で唯一性を持つようにしたいと考えている。
|
||||
|
||||
しかし、これは難しい。よって、現実的に可能な範囲で、プレイヤーがゲーム内で唯一性を持てるようにすること。現実世界とゲームを強く結びつけることを目指していきたい。
|
||||
|
||||
例えば、ゲーム内キャラクター追加に関するルールがある。vtuberのような個人モデルを持つ者が申請でき、申請が通ると新たなキャラクターが追加される。キャラクターは原則通りの1攻撃、1スキル、1バーストというステータスを持つ。ただし、本人にしか使えないユニークスキルがあり、それは一人のプレイヤーにしか使えない。
|
||||
|
||||
## システム
|
||||
|
||||
現在作っているシステムを紹介。システム名は今後変更されるかもしれない。
|
||||
|
||||
- `at system`: atproto(atmosphere)を採用するアカウントシステム
|
||||
- `yui system`: プレイヤーの唯一性を担保するためのシステム
|
||||
- `ai system`: キャラクターの属性に関するシステム。キャラクターは1つの属性を持つ。原子、陽子、中性子など。
|
||||
- `planet system`: 宇宙の物理方式(マップ)を目指すシステム
|
||||
|
||||
## 物語
|
||||
|
||||
物語はこの世界で最も小さい物質の探求から始まる。
|
||||
|
||||
量子というものがある。観測すると結果が変わるらしい。でもじつは違う。結果が変わるのは物質が当たるからだ。物質が当たると結果が変わるのは当然のこと。物質を小さくしていくと、それは意識の領域に到達する。それは物質でもあり、意識でもあった。特に違いはない。そして、これ以上分割できない最小単位、この世界で最も小さい物質を「存在の意識」という。つまり、物質は意識が集まってできている。これをアイと名付けよう。
|
||||
|
||||
キャラクターの属性について
|
||||
|
||||
各属性は1つの次属性と関連反応を起こし、ダメージ倍率が変換します。属性には原子核、陽子、電子、中性子、アクシオン、クォークなどがあります。
|
||||
|
27
book/youtube/README.md
Normal file
@ -0,0 +1,27 @@
|
||||
# youtube
|
||||
|
||||
youtubeに投稿するとしたら、どのような内容がいいのかを考え、その下書きを投稿することにします。
|
||||
|
||||
1. 成功より失敗を見せる
|
||||
2. 完成より進捗を見せる
|
||||
3. 文字と配色
|
||||
4. 投稿の継続
|
||||
|
||||
## 成功より失敗を見せる
|
||||
|
||||
正確に言うと配信者が行う配信内容は、成功したことより、失敗したことを見せるほうが重要だと感じます。
|
||||
|
||||
そして、ただ失敗を見せるのではなく、見せ方も大切です。
|
||||
|
||||
つまり、失敗したことを笑い話に変え話すこと、そういった演出が視聴者が面白いと思うポイントだと感じます。
|
||||
|
||||
実際の例でいうと、unrealengineの解説動画を検索すると、より多く再生された動画が表示されます。そして、ただ解説しているだけ、成功した実装を見せるだけの動画よりも、うまくいかなかったゲーム開発のシーンを面白おかしく見せているだけの動画のほうが、より多く再生されているようです。また、私が視聴して面白いと思う動画もこのタイプになります。
|
||||
|
||||
## 完成より進捗を見せる
|
||||
|
||||
視聴者といっしょにゴールに向かっている感じがいいと思いました。
|
||||
|
||||
配信者の技術が完成されたあと、それを教えるという方向性の動画よりも、配信者はまだまだ成長過程で、その成長する姿を見てもらう、視聴者とともに成長していく、という方向性の動画のほうが面白いと感じます。
|
||||
|
||||
その他重要な要素として、`文字と配色`や`投稿の継続`が挙げられます。
|
||||
|
2
ue.json
@ -414,7 +414,7 @@
|
||||
"body": {
|
||||
"text": "There is something called a quantum. It is said that when it is observed, the results change. But in fact, that is not the case. The reason the results change is because matter hits it. It is natural that things move when matter hits them, so it is only natural that the results change. When you make things smaller, you reach the realm of consciousness. You can call it matter or consciousness. There is no particular difference. And the smallest unit that cannot be divided any further, the smallest matter, is called 'consciousness of existence.' Matter is also made up of a collection of consciousnesses. Let's call this the eye. The story begins with 'the quest for the smallest matter.'",
|
||||
"lang": {
|
||||
"ja": "量子というものがある。観測すると結果が変わるらしい。でもじつは違う。結果が変わるのは物質が当たるからだ。物質が当たるとものが動くのは当たり前で、結果が変わるのは当然のこと。ものを小さくしていくと、それは意識の領域に到達する。それを物質と言ってもいいし、意識と言ってもいい。特に違いはない。そして、これ以上分割できない最小単位、最小の物質を「存在の意識」という。物質も意識が集まってできている。これをアイと名付けよう。物語は「最も小さな物質の探求」から始まる"
|
||||
"ja": "量子というものがある。観測すると結果が変わるらしい。でもじつは違う。結果が変わるのは物質が当たるからだ。物質が当たると結果が変わるのは当然のこと。物質を小さくしていくと、それは意識の領域に到達する。それは物質でもあり、意識でもあった。特に違いはない。そして、これ以上分割できない最小単位、この世界で最も小さい物質を「存在の意識」という。つまり、物質は意識が集まってできている。これをアイと名付けよう。物語は「最も小さな物質の探求」から始まる"
|
||||
}
|
||||
}
|
||||
},
|
||||
|