change dir
@ -14,6 +14,9 @@ blenderのexportやueのimportは注意が必要です。`VRM MToon`, `ペアレ
|
||||
4. 編集モードでBモデルを膨らませます。これは頂点を選択して[G]を押します。
|
||||
5. addonの`SKkeeper`を使い、オブジェクトメニューからapply modifyを選択します。追加モデルのmirrorやkeyをまとめます。これをしないとvrmにexportできません。
|
||||
6. 次にAモデルの編集です。いくつかの面を削除してBモデルをくっつけても違和感ないようにします。
|
||||
7. トランスフォームのペアレントで[Body]頂点を選択します。G, [y, z, r]などを駆使して位置調整してください。
|
||||
7. トランスフォームのペアレントで`[Body]頂点`を選択します。G, [y, z, r]などを駆使して位置調整してください。
|
||||
|
||||
ペアレントは正しく設定されるときもあればズレることもあります。同じファイルをvrmにexportしても結果がその都度異なります。また、モーフターゲットが正しく反映されないこともあります。
|
||||
|
||||
私は`[Armatrue]ボーン(hip)`につけることで設定しました。しかし、ueで読み込んだとき少し下に表示されるので、これ自体をずらした位置で調整し、ueで確認する必要がありました。
|
||||
|
||||
ペアレントは正しく設定されるときもあればズレることもあります。モーフターゲットが正しく反映されないこともあります。`[Armatrue]ボーン(hip)`につけることで設定しています。しかし、ueで読み込んだとき少し下に表示されるので、これ自体をずらした場所で調整するしかありませんでした。
|
||||
|
@ -29,7 +29,9 @@ ueを長く使っているとわかることですが、ゲーム制作にはあ
|
||||
|
||||
## unityやblenderも使っている
|
||||
|
||||
vrmでの開発は主に[unity](/unity/)が中心です。`.vrm`の仕様を作っているpixivがunityで読み込むためのpluginを開発しているからです。vrmに対応する様々なツールはunityで作られています。
|
||||
私はキャラクター(character)を`.vrm`で作っています。
|
||||
|
||||
`.vrm`の開発は主に[unity](/unity/)が中心です。`.vrm`の仕様を作っているpixivがunityで読み込むためのpluginを開発しているからです。vrmに対応する様々なツールはunityで作られています。
|
||||
|
||||
もし`.vrm`を扱う場合は、どちらにせよ`unity`を使うことになると思います。私もモデルのカスタマイズなどでunityを使っています。
|
||||
|
||||
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
BIN
img/ai.png
Normal file
After Width: | Height: | Size: 140 KiB |
BIN
img/ai_min.png
Normal file
After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 95 KiB |
Before Width: | Height: | Size: 476 KiB After Width: | Height: | Size: 476 KiB |
BIN
img/ep1.png
Normal file
After Width: | Height: | Size: 866 KiB |
BIN
img/ep2.png
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
img/ep3.png
Normal file
After Width: | Height: | Size: 433 KiB |
BIN
img/ue.mdp
Normal file
BIN
img/ue.png
Normal file
After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 174 KiB |
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 792 KiB After Width: | Height: | Size: 792 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 960 KiB After Width: | Height: | Size: 960 KiB |
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
Before Width: | Height: | Size: 510 KiB After Width: | Height: | Size: 510 KiB |
Before Width: | Height: | Size: 964 KiB After Width: | Height: | Size: 964 KiB |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 427 KiB After Width: | Height: | Size: 427 KiB |
Before Width: | Height: | Size: 372 KiB After Width: | Height: | Size: 372 KiB |
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
Before Width: | Height: | Size: 225 KiB After Width: | Height: | Size: 225 KiB |
Before Width: | Height: | Size: 255 KiB After Width: | Height: | Size: 255 KiB |
Before Width: | Height: | Size: 760 KiB After Width: | Height: | Size: 760 KiB |
Before Width: | Height: | Size: 675 KiB After Width: | Height: | Size: 675 KiB |
Before Width: | Height: | Size: 266 KiB After Width: | Height: | Size: 266 KiB |
@ -1,56 +0,0 @@
|
||||
--- ./VMC4UE/VMC4UE/Source/VMC4UE/Source/VMC4UEBlueprintFunctionLibrary.cpp
|
||||
+++ ./VMC4UEBlueprintFunctionLibrary.cpp
|
||||
@@ -119,27 +119,29 @@ UVMC4UEStreamingSkeletalMeshTransform* UVMC4UEBlueprin
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
-
|
||||
+
|
||||
+ UVMC4UEStreamingSkeletalMeshTransform* StreamingSkeletalMeshTransform = nullptr;
|
||||
+
|
||||
+ // Try to get existing transform
|
||||
{
|
||||
- // Get
|
||||
FRWScopeLock RWScopeLock(OSCManager->RWLock, FRWScopeLockType::SLT_ReadOnly);
|
||||
- auto StreamingSkeletalMeshTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
|
||||
- if (StreamingSkeletalMeshTransform != nullptr)
|
||||
+ auto FoundTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
|
||||
+ if (FoundTransform != nullptr)
|
||||
{
|
||||
- return *StreamingSkeletalMeshTransform;
|
||||
+ return *FoundTransform;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ // Create new transform if not found
|
||||
{
|
||||
- // Create
|
||||
FRWScopeLock RWScopeLock(OSCManager->RWLock, FRWScopeLockType::SLT_Write);
|
||||
- auto StreamingSkeletalMeshTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
|
||||
- if (StreamingSkeletalMeshTransform != nullptr)
|
||||
+ auto FoundTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
|
||||
+ if (FoundTransform != nullptr)
|
||||
{
|
||||
- return *StreamingSkeletalMeshTransform;
|
||||
+ return *FoundTransform;
|
||||
}
|
||||
- UVMC4UEStreamingSkeletalMeshTransform* NewStreamingSkeletalMeshTransform = NewObject<UVMC4UEStreamingSkeletalMeshTransform>();
|
||||
|
||||
- //FRWScopeLock RWScopeLock2(NewStreamingSkeletalMeshTransform->RWLock, FRWScopeLockType::SLT_Write);
|
||||
+ UVMC4UEStreamingSkeletalMeshTransform* NewStreamingSkeletalMeshTransform = NewObject<UVMC4UEStreamingSkeletalMeshTransform>();
|
||||
OSCManager->StreamingSkeletalMeshTransformMap.Emplace(Port, NewStreamingSkeletalMeshTransform);
|
||||
|
||||
// Bind Port
|
||||
@@ -149,9 +151,10 @@ UVMC4UEStreamingSkeletalMeshTransform* UVMC4UEBlueprin
|
||||
|
||||
OSCManager->OscReceivers.Emplace(OscReceiver);
|
||||
|
||||
- return NewStreamingSkeletalMeshTransform;
|
||||
+ StreamingSkeletalMeshTransform = NewStreamingSkeletalMeshTransform;
|
||||
}
|
||||
- return nullptr;
|
||||
+
|
||||
+ return StreamingSkeletalMeshTransform;
|
||||
}
|
||||
|
||||
void UVMC4UEBlueprintFunctionLibrary::RefreshConnection(float Seconds)
|
@ -1,25 +0,0 @@
|
||||
--- ./VMC4UE/Source/VMC4UEEd/Source/VMC4UEBoneMappingAssetFactory.cpp
|
||||
+++ ./VMC4UEBoneMappingAssetFactory.cpp
|
||||
@@ -5,6 +5,8 @@
|
||||
#include "../../VMC4UE/Include/VMC4UEStreamingData.h"
|
||||
#include "Dom/JsonObject.h"
|
||||
#include "JsonObjectConverter.h"
|
||||
+#include "UObject/ConstructorHelpers.h"
|
||||
+#include "UObject/UObjectGlobals.h"
|
||||
|
||||
UVMC4UEBoneMappingAssetFactory::UVMC4UEBoneMappingAssetFactory(const FObjectInitializer &ObjectInitializer)
|
||||
: Super(ObjectInitializer)
|
||||
@@ -26,11 +28,12 @@
|
||||
return UVMC4UEVRMMapping::StaticClass();
|
||||
}
|
||||
|
||||
+
|
||||
UObject *UVMC4UEBoneMappingAssetFactory::FactoryCreateText(UClass *InClass, UObject *InParent, FName InName, EObjectFlags Flags, UObject *Context, const TCHAR *Type, const TCHAR *&Buffer, const TCHAR *BuferEnd, FFeedbackContext *Warn)
|
||||
{
|
||||
FString TextData = FString(Buffer);
|
||||
|
||||
- UVMC4UEVRMMapping *NewAsset = CastChecked<UVMC4UEVRMMapping>(StaticConstructObject_Internal(InClass, InParent, InName, Flags));
|
||||
+ UVMC4UEVRMMapping* NewAsset = NewObject<UVMC4UEVRMMapping>(InParent, InClass, InName, Flags);
|
||||
if (!IsValid(NewAsset))
|
||||
{
|
||||
return nullptr;
|
@ -1,23 +0,0 @@
|
||||
vmc4ue patch rebuild for `ue5.4`
|
||||
|
||||
- https://github.com/HAL9HARUKU/VMC4UE
|
||||
- https://github.com/HAL9HARUKU/ueOSC
|
||||
- https://github.com/HAL9HARUKU/VRMMapExporter
|
||||
- https://github.com/vrm-c/UniVRM
|
||||
|
||||
[unity](https://unity.com/)で`VRMMapExporter`から`$model.vrmmap`を作る。ABPで読み込む。
|
||||
|
||||
`VMC4UE`は`$project.sln`を生成して`visual studio solution`でrebuildする。
|
||||
|
||||
ただし、この方法で表情を動かすことはできない。
|
||||
|
||||
```sh
|
||||
$ git clone https://github.com/HAL9HARUKU/VMC4UE
|
||||
$ cd VMC4UE
|
||||
$ git reset --hard b5a6cf96e5928551d8e3e20b74705e3e8f22a1df
|
||||
$ cd ..
|
||||
|
||||
# example
|
||||
$ patch -u ./VMC4UE/VMC4UE/Source/VMC4UE/Source/VMC4UEBlueprintFunctionLibrary.cpp < VMC4UEBlueprintFunctionLibrary.cpp.patch
|
||||
$ patch -u ./VMC4UE/VMC4UE/Source/VMC4UEEd/Source/VMC4UEBoneMappingAssetFactory.cpp < VMC4UEBoneMappingAssetFactory.cpp.patch
|
||||
```
|
83
readme.md
@ -5,87 +5,4 @@
|
||||
|
||||
see [ue.json](https://git.syui.ai/ai/ue/src/branch/main/ue.json)
|
||||
|
||||
## log
|
||||
|
||||
|version|commit|
|
||||
|---|---|
|
||||
|v0.1 β|world create|
|
||||
|v0.2 β|support web|
|
||||
|v0.3 β|support vmc|
|
||||
|v0.4 β|support at|
|
||||
|v0.5 β|support battle|
|
||||
|
||||
## at
|
||||
|
||||
the player data is stored in the pds.
|
||||
|
||||
```sh
|
||||
├── [yui.syui.ai]
|
||||
│ ├── ai.syui.game.user
|
||||
│ │ ├── lv
|
||||
│ │ ├── hp
|
||||
│ │ └── coin
|
||||
│ └── ai.syui.game.login
|
||||
│ ├── login <bool>
|
||||
│ ├── updatedAt
|
||||
│ └── username
|
||||
└─── [user.bsky.social]
|
||||
└── ai.syui.game
|
||||
├── account <at://yui.syui.ai...>
|
||||
└── createdAt
|
||||
```
|
||||
|
||||
```sh
|
||||
# https://git.syui.ai/ai/at/src/branch/main/lexicons/ai/syui/game
|
||||
$ ./at.zsh u at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game.user/syui
|
||||
{
|
||||
"uri": "at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game.user/syui",
|
||||
"cid": "bafyreigijd4vonyzgjkzotrbtq5j5gyoecokoij3u7jw4sqnx6wkh7attq",
|
||||
"value": {
|
||||
"did": "did:plc:uqzpqmrjnptsxezjx4xuh2mn",
|
||||
"$type": "ai.syui.game.user",
|
||||
"aiten": 0,
|
||||
"limit": false,
|
||||
"login": false,
|
||||
"gender": "male",
|
||||
"handle": "syui.ai",
|
||||
"character": {
|
||||
"ai": {
|
||||
"hp": 9,
|
||||
"lv": 1,
|
||||
"exp": 0,
|
||||
"img": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4hqjfn7m6n5hno3doamuhgef/bafkreie34pjuc6coenzcdwrgrh4fbacq7bkhsz263g5vpbsqxwaz37kkwy@jpeg",
|
||||
"mode": 0,
|
||||
"rank": 0,
|
||||
"group": "origin",
|
||||
"attach": 0,
|
||||
"season": 0,
|
||||
"critical": 1,
|
||||
"critical_d": 0,
|
||||
"attach_post": 14102
|
||||
}
|
||||
},
|
||||
"createdAt": "2024-11-29T21:34:27.833Z",
|
||||
"updatedAt": "2024年12月8日 11:25:17 GMT"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## service
|
||||
|
||||
|title|url|
|
||||
|---|---|
|
||||
|game|https://ue.syui.ai|
|
||||
|live|https://live.syui.ai|
|
||||
|chat|https://o.syui.ai|
|
||||
|
||||
## support
|
||||
|
||||
`windows 64bit`
|
||||
|
||||
|title|spec|
|
||||
|---|---|
|
||||
|cpu|AMD Ryzen 7 5700X|
|
||||
|memory|32GB / DDR4-3200 DIMM (PC4-25600)|
|
||||
|gpu|GeForce RTX 4060Ti 8GB|
|
||||
|storage|1TB M.2 NVMe SSD|
|
||||
|
BIN
verse/img/ep.mdp
BIN
verse/img/ep.png
Before Width: | Height: | Size: 433 KiB |
Before Width: | Height: | Size: 709 KiB |
Before Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 1.2 MiB |
Before Width: | Height: | Size: 432 KiB |
Before Width: | Height: | Size: 145 KiB |
Before Width: | Height: | Size: 252 KiB |
Before Width: | Height: | Size: 327 KiB |
Before Width: | Height: | Size: 202 KiB |
BIN
verse/img/ue.mdp
BIN
verse/img/ue.png
Before Width: | Height: | Size: 561 KiB |
BIN
verse/img/wa.png
Before Width: | Height: | Size: 140 KiB |
Before Width: | Height: | Size: 133 KiB |
@ -1,16 +0,0 @@
|
||||
# syui・ai
|
||||
|
||||
(シュイ・アイ)
|
||||
|
||||
THE FUZZY ONE
|
||||
|
||||
|title|body|
|
||||
|---|---|
|
||||
|nickname|syai|
|
||||
|age|∞|
|
||||
|height|123cm|
|
||||
|birthday|1/23|
|
||||
|lang|ja & en|
|
||||
|text|「hello ai !」 一つの言葉しか覚えられない。自分やリスナーのことをアイと呼ぶ。世界を作るのが趣味。普段は地球を歩き回っている。|
|
||||
|en|"Hello Ai!" I can only remember one word. I call myself and my listeners Ai. My hobby is creating worlds. I usually walk around the Earth.|
|
||||
|
@ -1,54 +0,0 @@
|
||||
# Unreal Engine 5.4 | 初めてのゲーム制作、世界を作る
|
||||
|
||||
## vrm4u
|
||||
|
||||
キャラクターを表示しよう。
|
||||
|
||||
## game animation sample
|
||||
|
||||
今後はこの形式が基本になりそう。
|
||||
|
||||
## city sample
|
||||
|
||||
最初に難易度と負荷を高くする。
|
||||
|
||||
## sky atmoshpere + volumetric cloud
|
||||
|
||||
`dynamic volumetric sky -> ultra dynamic sky`
|
||||
|
||||
## whisper + chatgpt + elevenlabs
|
||||
|
||||
- whisper : RuntimeSpeechRecognizer
|
||||
|
||||
```sh
|
||||
# perplexity.ai
|
||||
$ curl https://api.openai.com/v1/chat/completions \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer YOUR_API_KEY" \
|
||||
-d '{
|
||||
"model": "gpt-4o-mini",
|
||||
"messages": [{"role": "user", "content": "Your question here"}],
|
||||
"temperature": 0.7
|
||||
}'
|
||||
```
|
||||
|
||||
```sh
|
||||
# perplexity.ai
|
||||
$ curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/VOICE_ID" \
|
||||
-H "xi-api-key: YOUR_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"text": "Hello world!",
|
||||
"model_id": "eleven_monolingual_v1",
|
||||
"voice_settings": {
|
||||
"stability": 0.5,
|
||||
"similarity_boost": 0.5
|
||||
}
|
||||
}' \
|
||||
--output output.mp3
|
||||
```
|
||||
|
||||
## ue vs unity
|
||||
|
||||
ueは手順通りやっても動くことは稀。つまり、動かない。そのため情報も少ない。unityがおすすめ。
|
||||
|
@ -1,26 +0,0 @@
|
||||
# aiverse
|
||||
|
||||
aiverse project.
|
||||
|
||||
- https://youtube.com/@syai
|
||||
|
||||
## AI
|
||||
|
||||
```json
|
||||
{
|
||||
"music": "https://suno.com/@syui",
|
||||
"anime": "https://domoai.app",
|
||||
"3d": "https://tripo3d.ai"
|
||||
}
|
||||
```
|
||||
|
||||
## ref
|
||||
|
||||
- [octoverse](https://octoverse.github.com/)
|
||||
- [hololive](https://hololive.hololivepro.com/talents?gp=myth)
|
||||
|
||||
##
|
||||
|
||||
character, lyrics, composition, illustrations, game production, modeling, etc.
|
||||
|
||||
© syui
|