# VRM4U角色 https://hub.vroid.com/en/users/36144806 B站整理 https://www.bilibili.com/video/BV1gR4y1j7sK/?spm_id_from=333.788.recommend_more_video.2&vd_source=d47c0bb42f9c72fd7d74562185cee290 - Alicia Solid:https://hub.vroid.com/en/characters/515144657245174640/models/6438391937465666012 - AvatarSample_F:https://hub.vroid.com/en/characters/6193066630030526355/models/537531113514541613 # VRM4U学习笔记 VRM4U是一个不错的插件,在此记录一下功能与大致实现方式。 快速入门文档:https://ruyo.github.io/VRM4U/01_quick-start/ 功能介绍视频:https://youtu.be/epcQ-uU6tfU 视频中的右上角的自定义编辑器可以通过搜索"WBP_"来找到对应的EditorUtilityWidget,之后在Asset上有右键——点击运行EditorUtilityWidget。 - VRm4U:定义了主要的VrmAssetListObject、VrmMetaObject、VrmLicenseObject、VrmRuntimeSettings以及若干组件与动画节点。 - VRM4UImporter:主要的导入相关逻辑实现:导入流程、导入设定窗口、若干动画节点。 - VRM4ULoader:导入数据转换以及生成逻辑:数据转换与生成Asset相关的类、UVrmLoaderComponent与若干组件实现。 - VRM4UEditor:Sequence编辑器函数EvaluateCurvesFromSequence()实现。 - VRM4UMisc:Log日志类型定义。 PS. - FVRM4UModule模块启动与结束时,会分别注册/卸载 - FVRM4UImporterModule模块启动与结束时,会分别注册/卸载 UVrmAssetListObject、UVrmLicenseObject、UVrmMetaObject自定义Asset类型与FVRMRetargetSrcAnimSequenceCustomization自定义属性编辑器。 - FVRM4ULoaderModule模块启动与结束时,加载/卸载assimp的动态链接库;如果勾选**Drop VRMFile Enable**,则会 ## VRM4U的格式导入功能 值得学习: - Runtime Import功能:在游戏打包后,依然可以通过拖拽文件到游戏窗口的方式来导入VRM文件。 - 导入窗口实现:实现一个导入窗口(SVrmOptionWindow),这样Runtime与Editor导入都可以输入自定义的参数。 待改进: - 没有实现VMD的导入逻辑(虽然实现了BVH格式的导入逻辑) ### 导入功能 VRM4U使用Assimp库来进行格式解析,并且通过修改GLTF来实现VRM格式导入(VRM是基于GLTF开发的)。插件作者也公开了魔改的Assimp代码,当然最好的方式就是下载编译好的库文件与h文件直接引用了。 得益于Assimp,所以也可以导入PMX格式,但需要勾选 Project Setting>Plugin>VRM4U>Allow All AassImp Format的选项,之后就可以导入PMX格式的模型。(开放格式:pmx、obj、fbx、dae、gltf) ![](https://ruyo.github.io/VRM4U/assets/images/small/04i_option.png) 同时可以通过下面的Ext List来添加其他格式的后缀名,来使用VRM4U导入。 主要逻辑位于VRM4UImporter模块的UVRM4UImporterFactory中。 #### FactoryCreateBinary UVrmImportUI用于存储用户设置的导入选项数据。ULoaderBPFunctionLibrary::GetVRMMeta()用来导入VRM的Meta数据。ULoaderBPFunctionLibrary::LoadVRMFileFromMemory()为核心导入逻辑。 导入流程为: 1. 在初始化UVrmImportUI(导入选项对象)后,会调用ULoaderBPFunctionLibrary::GetVRMMeta(),通过Assimp读取VRM文件的Meta数据(缩略图与版权信息)来填充UVrmImportUI。对于PMX格式会有额外的设置。(模型缩放1=>0.1、不合并材质、不合并图元、强制材质双面显示) 2. 取得父窗口,之后创建并添加自定义的SWindow2包裹SVrmOptionWindow来进行导入参数显示,会在用户选择好数据后,进行之后的步骤。 3. 创建TAssetPtr、TArray< TAssetPtr >、TAssetPtr对象。 4. 取得默认加载设置对象UVrmRuntimeSettings,之后会依次尝试载入VrmObjectListBP、VrmAssetListObjectBP、UVrmAssetListObject来初始化上一步说的TAssetPtr。 5. 创建static VRMConverter::Options并使用之前的用户修改过的设置选项进行初始化。 6. 使用上一步取得选项对象,并调用ULoaderBPFunctionLibrary::LoadVRMFileLocal()来导入文件。导入的存放在UVrmAssetListObject mret中。 7. 返回mret->GetOuter(); #### LoadVRMFileFromMemory 1. 根据后缀名设置对应参数 2. 调用Assimp::Importer的ReadFileFromMemory()或者ReadFile()读取文件来获取场景节点aiScene。 3. 创建UVrmAssetListObject* OutVrmAsset(复制InVrmAsset或NewObject) 4. 使用VRMConverter对象,取出VRM的Json与aiScene数据来以此初始化。之后更新OutVrmAsset里的数据(调整材质的AlphaCutoff选项、替换骨骼名称、转换并且生成贴图与材质、转换VRM的Meta数据、转换并且生成模型数据、重命名Meta数据、设置骨骼模型的Rig Pose MorphTarget、转换重定向用的Humanoid、将之前所有数据保存成Asset) #### 运行时导入 主要的逻辑为调用LoadVRMFileAsync()加载文件并且初始化UVRMAssetList,之后再设置SkeletalMesh或者SpawnActor等一系列设置。 使用这个功能前首先得确定 Project Settings->Plugin->VRM4U->Drop VRMFile Enable处于勾选状态才能使用这个功能。 功能演示可以查看参考插件Content的Maps/VRM4U_runtimeload,其功能位于DropActor。其挂载了UVrmDropFilesComponent组件,并在Beginplay绑定UVrmDropFilesComponent组件的OnDrogFile委托。其绑定的LoadVrmFronFilePath事件主要逻辑为:创建VRMAssetList对象,之后调用LoadVRMFileAsync()加载文件。之后给SpawnMToonActor,并给骨骼物体设置动画。(还有一些逻辑在关卡蓝图中) UVrmDropFilesComponent的主要功能 它定义了2个委托,并会在组件注册/卸载时让StaticOnDropFilesDelegate绑定/解绑OnDropFilesDelegate_Handler()。OnDropFilesDelegate_Handler()会调用OnDropFiles.Broadcast(FileName); ```c++ DECLARE_MULTICAST_DELEGATE_OneParam(FStaticOnDropFiles, FString); static FStaticOnDropFiles StaticOnDropFilesDelegate; DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnDropFiles, FString, FileName); UPROPERTY(BlueprintAssignable) FOnDropFiles OnDropFiles; ``` UVrmDropFilesComponent::VRMGetOpenFileName()会在关卡蓝图中被调用,用于调用Winapi的GetOpenFileName()来显示一个打开文件用的窗口,在选取了文件之后会调用DropActor的LoadVrmFronFilePath()。 ##### 运行时拖拽导入 FDropMessageHandler的父类为IWindowsMessageHandler是一种用与处理Windows消息的一种接口类。FDropMessageHandler的主要逻辑为: 1. 取得UVrmDropFilesComponent组件与World指针。 2. 如果世界类型为Game与PIE则调用Winapi的DragAcceptFiles() 3. 调用Winapi的DragQueryFile()查询拖拽入的文件,并将文件地址传**UVrmDropFilesComponent::StaticOnDropFilesDelegate.Broadcast(Filepath);** 在FVRM4ULoaderModule::StartupModule()中执行增加MessageHandler。 ```c++ if (FSlateApplication::IsInitialized()) { static FDropMessageHandler DropMessageHandler;// = FDropMessageHandler(); //FWindowsApplication* WindowsApplication = (FWindowsApplication*)GenericApplication.Get(); TSharedPtr App = FSlateApplication::Get().GetPlatformApplication(); if (App.IsValid()) { auto WindowsApplication = (FWindowsApplication*)(App.Get()); //WindowsApplication->SetMessageHandler(DropMessageHandler); WindowsApplication->AddMessageHandler(DropMessageHandler); } } ``` ## 渲染与材质 值得学习: - 卡通渲染材质(里面有一些faker技巧) - 拍摄模式 - Over Parse,模型压平的二次元模式,视角矫正效果 VRM4U的MToon Lit、MToon Unlit、Subsurface、Subsurface Profile材质类型都是基于MaterialUtil\MToonUtil\M_VrmMToonBaseOpaque,它是作者实现的一个接近UniVRM Shader效果的材质。里面有一些Hack技巧值得学习。上述这几材质类型的区别在于材质实例的属性不同,以MToon Lit与MToon Unlit的区别为例: 1. bUseLight是否勾选 2. ShaderModel不同:Default Lit与Unlit Unlit、PBR基于一个简单材质MaterialUtil\MToonUtil\M_VrmSimple。 ### 轮廓线与投射阴影 使用MToonAttachActor来应用轮廓线和自身阴影(Unlit ShaderModel不会接收其他物体的投影)。自己制作的VRM模型可能会有问题,导致Outline与阴影不能出现,建议使用Vroid官方模型进行测试。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/VRM4U_MToonAttachActor.png) - SceneCaptureComponent2D组件用于渲染Depth到RT上,以此来制作Shadow。勾选WBP_VRMMaterial->Model->MToonAttachActor->Advanced->Debug Shadow Cube后,会在角色正上方显示深度贴图Cube。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/VRM4U_ShowDebugShadowCube.png) 在MF_VrmMToonBase中搜索bUseShadowMap就可以找到所引用的计算函数 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/VRM4U_bUseShadowMap.png) 里面逻辑就是通过Depth贴图计算ShadowMask ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/VRM4U_ShadowMask.png) - UVrmPoseableMeshComponent:用于实现Outline(AOShadow目前没有作用)。主要使用M_VrmNone,一个Masked Unlit材质,通过模型外扩实现Outline效果。 ### 后处理效果 MToonMaterialSystem ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/VRM4U_PostProcessSystem.png) 这些蓝图BP的大致逻辑为,挂载带有PostProcess空间组件的BP,之后往里面添加PostProcess材质。 Content\Util\Actor\Post\sub目录中有 - M_PostBloom - M_ColorGradation - MI_ColorGradation - M_CenterBlur ### 光照工具与PostToon - VRM4U_CameraLight有演示CharacterLightRigActor,方便用户快速摆出主光、轮廓光,其中轮廓光会一直对着摄像机旋转。 VRM4U有关的曝光的参数调节技巧:https://ruyo.github.io/VRM4U/02_envlight/ - PostToonSystem文档:https://ruyo.github.io/VRM4U/02_toon/ 具体可以参考VRM4U_PostToon.umap,设置步骤如下: 1. 在场景中放置一个SkeletalMeshActor。 2. 在场景中放置一个BP_PoseCopyToon,并且设置Target Actor为上一步放置的SkeletalMeshActor,并调整参数。 #### PostToon原理 首先BP_PoseCopyToon挂载了5个组件(隐藏了2个非重要组件),SkeletalMesh为主要渲染,VrmPoseableMesh用于接受光照。 - SkeletalMesh - VrmPoseableMesh - VrmPoseableMesh_translucent 1. 设置TargetMeshForLight(SkeletalMesh或者VrmPoseableMesh) 2. BP_PoseCopyToon会在一开始遍历TargetMeshForLight的Materials,之后根据材质数目给VrmPoseableMesh添加对应数目的MI_BaseLight材质。(M_BaseLight与MToon材质大致一样,都使用MF_VrmMToonBase) 3. 给VrmPoseableMesh_translucent执行上一步类似操作,但添加的材质为MI_PostToon。 4. 如果SkeletalMesh中有使用M_VrmNone材质,那VrmPoseableMesh与VrmPoseableMesh_translucent的对应部分也会被设置成M_VrmNone。 5. 隐藏Debug用的VrmPoseableMesh_translucent。 6. 调用VrmPoseableMesh的VRMSetLightingChannelPrim()。设置了图元的LightingChannel。 7. 调用VrmPoseableMesh_translucent的VRMSetPerBoneMotionBlur()。设置SkinnedMesh->bPerBoneMotionBlur,默认是true。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/VRM4U_ToonPost.gif) ##### M_VrmMToonBaseOpaque、M_BaseLight、M_PostToon比较 - M_BaseLight:有基础灯光计算(NoL)。**实际使用的是MI_BaseLight**所以会有一些参数改变:比如他是一个PBR材质,有调整过BaseColor、Metalic、Roughness。 - M_ToonPost - M_VrmMToonBaseOpaque:实现了TAA透明效果 M_VrmMToonBaseOpaque ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/VRM4U_M_VrmMToonBaseOpaque.png) M_BaseLight:用于渲染光照效果 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/VRM4U_M_BaseLight.png) M_ToonPost:用于取得光照效果并且合成在一起。使用SceneColor节点取得上一个Material渲染的结果作为灯光结果(因为是透明材质,所以是在后面渲染的)。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/VRM4U_M_ToonPost.png) #### 使用Custom Material VRM4U可以使用自定义的材质系统代替MToon材质。 1. 根据M_VrmSimple的格式,创建自己的CustomMaterial。 2. 创建DS_VRMCustom DataAsset并且填入对应的Custom Material Instance(改变Shader Model与Blend Mode)。 3. 在操作面板WBP_VRMMaterial的MaterialSettings上,将材质模型设置成Custom,并且填入上面创建的DS_VRMCustom DataAsset。 ![](https://ruyo.github.io/VRM4U/assets/images/02d_custom1.png) ![](https://ruyo.github.io/VRM4U/assets/images/02d_custom2.png) ### 其他Hack技巧 - Anti-ToneMapping:使用UE自带的函数抵消ToneMapping效果。 - Exposure:使用EyeAdaptation节点控制亮度。 ![image](D:/youdaonote-pull-master/youdaonote/youdaonote-images/8B1F13475DF3420E9F90FD29A1A0D7B4.octet-stream) ### 拍摄模式 1. 使用BP_VrmModelActor。 2. 视线跟踪 /VRM4U/Util/Actor/Misc/LookAtPoint放置TargetActor并设置目标模型。 3. VRM4U的角色相机使用Pawn类实现:提供若干快捷操作方便用户得到最佳的镜头。https://ruyo.github.io/VRM4U/02_shortcut2/ 4. 使用MToonMaterialSystem调整阴影效果。 5. 使用MorphControl控制角色表情(目标设置为BP_VrmModelActor)。 ### Over Parse 文档:https://ruyo.github.io/VRM4U/02_pers/ ![](https://ruyo.github.io/VRM4U/assets/images/small/02p_fix1.png) ![](https://ruyo.github.io/VRM4U/assets/images/small/02p_fix2.png) ![](https://ruyo.github.io/VRM4U/assets/images/small/02p_n2.png) ![](https://ruyo.github.io/VRM4U/assets/images/small/02p_n1.png) ![](https://ruyo.github.io/VRM4U/assets/images/small/02p_n3.png) Actor位于Util\Actor\: - FOVCharacter - FOVCustom FOVCustom使用了VrmCameraCheck组件,并且会在蓝图的Construction Script中绑定SetFovDistance()至CameraMove委托。主要的逻辑位于SetFovDistance()中,主要逻辑Tick()也会使用。 1. 将FOVCustom Attach 到 TargetActor上。 2. 寻找场景中所有MToonMaterialSystem,并设置FovScaleBias、Fov_distance、Fov_scale参数并应用。 FOVCharacter逻辑相似,核心逻辑在CustomEvent_1中,他会绑定给VrmCameraCheck组件的CameraMove委托。主要设置了**材质集**的FOV2Begin、FOV2Pow、FOV2Scale、FOV2ScaleLimit、FOV2FarCenter、FOV2FarPoint、MainCameraPosition、MainCameraDirection。相关逻辑位于材质中。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/VRM4U_FovFix.png) ## 动画 值得学习: - Runtime Retarget功能 - Limited Animation(抽帧动画) - Control Rig与Morph Target控制器 实现动画节点: - VRM4U - AnimNode_VrmCopyHandBone - AnimNode_VrmModifyBoneDynamic - AnimNode_VrmModifyBoneList - AnimNode_VrmModifyHumanoidBone - AnimNode_VrmQuestHandBone - AnimNode_VrmRetargetFromMannequin - AnimNode_VrmSpringBone - AnimNode_VrmVMC - VRM4UImporter - AnimGraphNode_VrmCopyHandBone - AnimGraphNode_VrmModifyBoneDynamic - AnimGraphNode_VrmModifyBoneList - AnimGraphNode_VrmModifyHumanoidBone - AnimGraphNode_VrmQuestHandBone - AnimGraphNode_VrmRetargetFromMannequin - AnimGraphNode_VrmSpringBone - AnimGraphNode_VrmVMC ### BP_VrmPoseCopy 挂载了以下5个组件,有一个子类BP_VrmPoseCopy_PostShadow。 - VrmPoseableMesh - BP_VrmAnimControlComponent - BP_VrmUtilComponent - SkeletalMesh 有关抽帧效果,其关键函数在于BP_VrmAnimControlComponent或者BP_VrmPoseCopy的SetFrameLimite(),函数是一个无线循环函数。 1. 判断是否开启EnableFrameLimit,不开启就结束了 2. SetFrameLimite()中判断当前播放帧数是否达到nextToPlay变量的值,如果没有则等待;有则执行VrmPoseableMesh的VRMCopyPoseAndMorphFromSkeletalComponent() 3. 更新nextToPlay变量并触发OnFrameLimitUpdate委托。 4. 在更新完模型的Transform后,跳回第2步。 **改进思路**:在蓝图中这样实现会有很大的性能问题,使用c++会更好。而且这个逻辑完全可以使用动画蓝图实现,使用PoseCache,之后根据条件,输出更新Pose或是PoseCache。 UVrmPoseableMeshComponent继承自UPoseableMeshComponent。 ```c++ void UVrmPoseableMeshComponent::VRMCopyPoseAndMorphFromSkeletalComponent(USkeletalMeshComponent* InComponentToCopy) { if (InComponentToCopy) { Super::CopyPoseFromSkeletalComponent(InComponentToCopy); MorphTargetWeights = InComponentToCopy->MorphTargetWeights; ActiveMorphTargets = InComponentToCopy->ActiveMorphTargets; } } ``` CopyPoseFromSkeletalComponent()的主要逻辑就是判断骨骼是否一一对应,如果对应则使用移动构造函数对Target与Source骨骼数据进行交换;不对应就遍历复制骨骼数据。 #### Limited Animation 抽帧效果 文档地址:https://ruyo.github.io/VRM4U/05_limitedanim/ 使用步骤 1. 在关卡上放置一个执行通常动画的骨架模型Actor。设置为“始终勾选姿势并刷新骨骼”以将动画移动到屏幕之外。 2. 在关卡中放置一个BP_VrmPoseCopy Actor,并TargetActor设置为上一步中的骨骼模型。打开LimitedAnim,输入你要播放的帧率(12、24等,每秒的帧数)。 #### 运行时重定向 文档:https://ruyo.github.io/VRM4U/03_gray/ 视频(UE5的实时重定向方案):https://www.bilibili.com/video/BV1HZ4y117Yk?spm_id_from=333.999.0.0 视频中的步骤: 1. 给新导入的VRM4U模型添加重定向骨骼链数据。 2. 新建IK Rig Asset并选择IK_Mannequin。(假设使用UE5小蓝人来重定向) 3. 新建IK Retarget Asset,设置Source为IK_Mannequin的Rig,Target为上一步新建的Rig。 4. 修改TPose=>APose。 5. 在角色类中的Mesh下面新建一个SkeletalMesh组件,并且选择新导入的VRM4U模型。创建一个动画蓝图Asset并指定(我感觉并不需要挂载新创建的SkeletalMesh)。 6. 动画蓝图中使用RetargetPoseFromMesh节点。 7. 将角色类中Mesh的VisibilityBasedAnimTickOption属性改为AlwaysTickPose=>AlwaysTickPoseAndRefreshBones。 8. 隐藏新建的SkeletalMesh组件。 VRM4U的实时重定向步骤: 1. 将BP_VrmMannequinRetarget放入场景中,之后设置Targetmannequin。 2. 设置VRM Asset List Override。 3. 最后点击GenerateRegargetPoseCopy即可。 ![](https://ruyo.github.io/VRM4U/assets/images/small/03r_setM1.png) BP_VrmMannequinRetarget使用了动画蓝图ABP_VRoidSimpleMannequinRetarget,里面使用了VrmRetargetFromMannequin节点。大致逻辑就是遍历所有的骨骼(humanoid_bone)之后进行重定向。本质上与UE5的方法一样,但UE5使用最新的骨骼链算法,无论是便捷与效果都更胜一筹。 ## 其他工具与实现 - 面部捕捉 - VirtualMotionCapture(VMC) 身体捕捉 https://ruyo.github.io/VRM4U/08_vmc/ VMC入门资料: 1. UE VR Track介绍(视频中使用了SteamVR控制器手柄):https://www.bilibili.com/video/BV1kS4y167SK?spm_id_from=333.337.search-card.all.click 2. UE VRN4U VMC功能讲解:https://www.bilibili.com/video/BV1ub4y1Y74K?spm_id_from=333.337.search-card.all.click 3. 捕捉数据软件介绍(Up推荐VseeFace,免费、效果好):https://www.bilibili.com/video/BV1DK411u75k?spm_id_from=333.999.0.0 4. Vseeface和OBS的设置:https://www.bilibili.com/video/BV16K4y1H7Cb?spm_id_from=333.999.0.0 5. VSeeFace配合LeapMotion:https://www.bilibili.com/video/BV1KA41137os?spm_id_from=333.337.search-card.all.click 6. 全身动作捕捉软件ThreeDPoseTracker:https://www.bilibili.com/video/BV1vy4y157An?spm_id_from=333.999.0.0 ## 其他模块文件 - VRM4U - VrmUtil:导入选项、GetXXX工具函数、骨骼转换映射表 - VrmUtilImage:图片处理函数 - VRM4UImporter - VRM4UDetailCustomize:针对FVRMRetargetSrcAnimSequence的自定义编辑器 - VrmAssetListThumbnailRenderer:Asset缩略图渲染控制 Util中的工具 Actor - latest:作者研发用的文件夹,里面的东西会引起打包出问题,建议在打包的时候删掉。 # VRM4U 功能列表翻译 - Asset输出支持日语名称 - 显示许可证与文件的Meta信息 - bvh 支持 ## 骨骼动画 - MorphControlActor。支持VRoid模型的Morph Target,并且名称与原始数据相同 - 视线跟随Actor - 增加动画节点:VRMSpringBone - 默认重定向是 A-pose。启用以更改为常规 T 姿势作为选项 - 增加套用ALS功能(添加IKBone,复制VirtualBone,创建骨骼名称为UE4 Mannequin) - 可以从其他骨骼Asset上复制Socket - 实现了 WindActor - LiveLink 面部捕捉支持 - 角色相机添加了呼吸选项、更改角色相机的焦点位置功能。 - 对应ControlRig不能很好应用的模型(PMX中骨骼层次不同的模型,使用半标准骨骼的模型) - 添加了一个工具来控制Sequence中的面部动画 ## MToon材质 默认材质设置为 Unlit,除此之外还是先PBR与SSS模式。 - 实现 MPC 材质集来调整材质参数 - 自己实现ShaderMap以实现Unlit材质模型的投射阴影;可以设置第二个阴影颜色;修复可能无法绘制阴影的问题(没有MaterialSystem可以正常绘制阴影) - EyeAdaptation (对轮廓线部分使用了特殊的眼部自适应调整) - 实现 MatCap 上反射阴影 - RimLight - UV Scroll - 启用生成 AO 阴影模型 - MToonMaterialSystem 添加了 SSGI 切换选项 - 启用以引用 LightRig 中的 DirectionalLightComponent(支持 SunSkyActor)。通过定向光到 Light Rig 的俯仰角添加了亮度校正选项。 - 添加了一个参数来更改 FilmicTonemapper 逆变换的强度。从 MToonMaterialSystem 更改。 - PostShadow 新增卡通功能 - 注)M MoonLit 会根据场景稍微变暗。我决定不参考 SkyLight 来减少负载。要回到过去,请从材质中打开 bUseSkyLightDirect。 - Rim light 和 matcap 不再受正常校正的影响 ## VR相关 - 在AnimBP中增加MotionController 和 Leap Motion 跟踪 ## 官方上的支持功能 您可以导入 VRM 文件 - 动画片 - 您可以轻松地重新定位。生成 A-pose / T-pose 和 BoneMap。 - 面部动画(Morphtarget / BlendShapeGroup)可用。 - 您可以为摆动骨骼选择 VRMSpringBone 或 PhysicsAsset。 - 有一个通用的控制装置和一个用于操作的 UMG。 - 您可以从外部应用程序接收动作捕捉数据。它支持 VMC 协议。 - 您可以在运行时从 UEMannequin 重定向到 VRM 模型。 - UE5:可以自动生成 IKRetargeter 资产。您可以从 Epic Skeleton 简化重定向过程。 - 材料 - 再现 M Moon 的素材。阴影颜色规格、轮廓颜色/粗细调整、MatCap 等都适用。 - 您可以根据 PBR 背景切换和调整绘图模式。 - 现有的后置滤镜和光线追踪可以同时使用。 - 移动的 - 配合BoneMap缩减功能,不用担心骨骼数量即可显示。 - 您可以切换绘图质量。它支持低规格。 - 虚拟现实/增强现实 - 绘图同时支持 Forward / Deferred。 - 由于它是由简单的函数组成的,所以它不会崩溃。 - 运行时负载 - 任何用户的 VRM 文件都可以从打包的 EXE 文件中读取。 - 动画可以在运行时重新定位。 - UE兼容性好 - 导入后,它将是一个标准的骨架网格体资源。 - 对应的UE版本是4.20~4.27,5.0(截至2022/04)很容易支持最新版本。 - 依次支持VRM1.0β - VRM1.0数据在一定程度上可以导入。 - 您可以保留本地轴或在导入时选择它。 - 对应M Moon的新功能。 - 实验实现