Second uv 可以通过editor来生成;

这部分内容都是在staticMeshEditor这个文件夹下面的代码里;

关于UI的相应机制,有个文件UICommandList.cpp例如我点击static mesh editor里面的tool bar 里面的UVbutton,会生成一条command,最终传到UICommandList.cpp文件的ExecuteAction函数里面,这也是一个action,然后这个从command中剖离出来的action会在这个函数里面调用Action->Execute(),Execute函数里面有调用如下“return (MutableUserObject->*MethodPtr)(DELEGATE_PARAM_PASSTHRU_COMMA_PAYLOAD_PASSIN)”,从这个函数来看,每个button都有有一个函数作为回调赋给了命令处理中心;再往下走,下面就调到了UV显示的函数;

即,如果想要自动化生成第二套uv的过程,需要生成一系列的command,进而成为一系列的action被执行;

StaticMeshEditor.cpp中,SetEditorMesh设定当前处理的static mesh,OnChangeMesh函数也有些用处;

IStaticMeshEditor.h文件里面有不少有用的函数,比如GetCurrentUVChannel或者GetNumUVChannels()或者GetStaticMesh();其具体实现是在StaticMeshEditor.cpp文件里面;

点击“Save”按钮,进行保存的时候,调用的函数是AssetEditorToolkit.cpp里面的SaveAsset_Execute();

最终的表现形式应该是,使用Commandlet.cpp这个文件里的一个类,这个类用于处理一个批处理命令,我们的工具应该和这个类结合,同样,类似用到这个文件的功能的还有文件“BatchImportCommandlet.h”,可参照这个工具的写法。

在commandlet中,要求,原生的过程,啥都没有,也就是说,需要做所有package导入的过程(这个之前是否有人已经做过了?),然后逐个拿到uasset,然后再进行转换;

关于commandlet,在文件ContentCommandlets.cpp文件中,有一个函数的实现体如下:

Int32 UListStaticMeshesImportedFromSpeedTreesCommandlet:: Main(const FString & Params);

是UE4的4.2新增的函数,其内部会遍历得到所有的static mesh,存在一个array中,因为package都是固定的地方存放(content文件夹下面),所以不用传入路径参数;其内部也有遍历每一个UStaticMesh* 的操作,这样的每一个UStaticMesh可以传到Static Mesh Editor系统的StaticMeshEditor.h文件里的void SetEditoMesh(UStaticMesh*InStaticMesh)函数里设定当前处理的是哪个static mesh。

比如,要执行一个commandlet,其规则可以见Commandlet.h文件中官方描述的,又如参照BatchImportCommandlet.cpp里面的,例如如果写一个bat文件,这个bat文件需要放在UE4Editor.exe同级目录下,其内容是:UE4Editor.exe CityUE4(这个是uproject名) 类名(这个类名是我们继承自Commandlet的那个子类) [参数]

例如:UE4Editor.exe xxxxUE4(projectName) ListStaticMeshesImportedFromSpeedTreesCommandlet

在UE4里面手工在Static Mesh Editor里面做的话需要步骤为:

  1. Generate Unique UVs面板里选择Layout using 0 channel;
  2. Static Mesh Setting下Light Map Resolution填light map的大小;
  3. Generate Unique UVs 面板下选 Apply,生成了second uv
  4. Static Mesh Setting下Light Map Coordinate Index选择1(刚生成的UV)
  5. 保存

如果已经有第二套UV的话。。。就应该跳过不生成,要指定下第二套UV作为lightmap的uv

貌似只能最多两套uv不能第三套

“Wing”这个static mesh有两套uv,但是,有两套uv的,第二套也没设定为lightmap使用;

有两套的应该都是已经设定使用第二套index为1的是lightmap的uv了,我看的是这样;

Light map的分辨率:

StaticMeshEditorTools.cpp

StaticMesh->LightMapResolution = GroupSettings.GetDefaultLightMapResolution();

StaticMesh.h

Int32 LightMapResolution;

在StaticMeshEditorTools.cpp文件中的OnApply函数内部:

if(bOnlyLayoutUVs)

{

uint32 LightmapResolution = StaticMesh->LightMapResolution ? StaticMesh->LightMapResolution : 256;

bStatus = MeshUtils.LayoutUVs(RawMesh, LightmapResolution, ChosenUVChannel, Error);

}

因此,在调用onapply之前,应该可以直接对StaticMesh->LightMapResolution进行lightmap分辨率的赋值;同样,LightMapCoordinateIndex也能被赋值;

Light map使用uv index:

StaticMesh.h

Int32 LightMapCoordinateIndex;

当前共有几个uv channel,用于判断是否需要生成第二套uv

在文件StaticMeshEditor.cpp文件中GetNumUVChannels(0)用于获取共有几个uv channel,传入的参数是LOD Level,也就是说,生成第二套UV还需要考虑LOD方面的内容!!!不同的lod level可以有不同的uv channel number,可能是较远的就不再用light map,以提升效率;

在Generate Unique UVs面板中,生成second UV的过程中必须选择“Layout using 0 channel”复选框

在代码中就意味着在StaticMeshEditorTools.cpp中进行了如下代码:

void SGenerateUniqueUVs::OnCreationModeChanged( ESlateCheckBoxState::Type NewRadioState, ECreationModeChoice RadioThatChanged )

{

if (NewRadioState == ESlateCheckBoxState::Checked)

{

CurrentCreationModeChoice = RadioThatChanged;

}

}

其中传入这个函数的参数是:

OnCreationModeChanged(ESlateCheckBoxState::Checked, UseChannel0 );

即,在调用SGenerateUniqueUVs::OnApply(),前必须调用这个函数这行代码!!!

点击Apply 按钮生成lightmap

代码是:

StaticMeshEditorTools.cpp

FReply SGenerateUniqueUVs::OnApply();

最终要选择保存

在代码中AssetEditorToolkit.cpp:

Void FAssetEditorToolkit::SaveAsset_Execute()

是真正执行save的操作,也就是static mesh editor的save button的响应函数;

以上可以生成第二套uv,但是,light map的烘焙怎样生成?是build的时候生成的吗?应该不是,light map保存在umap文件中,即使没有点击build也会有umap。。。

《Note --- Unreal 4 --- B project --- Second UV issue》的更多相关文章

  1. 《Note --- Unreal --- MemPro (CONTINUE... ...)》

    Mem pro 是一个主要集成内存泄露检测的工具,其具有自身的源码和GUI,在GUI中利用"Launch" button进行加载自己待检测的application,目前支持的平台为 ...

  2. 《Note --- Unreal 4 --- Sample analyze --- StrategyGame(continue...)》

    ---------------------------------------------------------------------------------------------------- ...

  3. 《Note --- Unreal 4 --- PersonaHowToMovement》

    https://docs.unrealengine.com/latest/CHN/Gameplay/HowTo/CharacterMovement/index.html 这里的demo是按照一些per ...

  4. 《Note --- Unreal 4 --- behavior tree》

    Web: https://docs.unrealengine.com/latest/INT/Engine/AI/BehaviorTrees/index.html Test project: D:\En ...

  5. 《Note --- Unreal 4 --- matinee》

    https://docs.unrealengine.com/latest/CHN/Engine/Matinee/index.html https://docs.unrealengine.com/lat ...

  6. django+nginx+xshell简易日志查询,接上<关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思>

    纠正一下之前在<关于<rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>>的反思>中说到的PHP+MySQL太慢,这里只是说我技术不好,没 ...

  7. 项目管理之道--纪我的新书《PMP项目管理认证学习指南(第4版)》出版并预祝大卖!

    新年伊始,我最新的项目管理书籍——<PMP项目管理认证学习指南(第4版)>也出版了,真是新年新气象啊!翻译英文书籍是一件任重道远的工作,除了要具备扎实的基本功,熟悉相关的领域外,还需要细致 ...

  8. 《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转

    4 坦克移动和旋转 本节课的目标是实现同时wsad和上下左右控制两个坦克分别移动和旋转 4.1 本节代码预览   image 将上节课场景s2另存为s3. 4.2 添加车轮扬沙效果 从Prefabs里 ...

  9. 《杜增强讲Unity之Tanks坦克大战》1-准备工作

    0.案例介绍 0.1开始界面   点击Play Now 进入游戏界面   左边的坦克使用ws控制前后移动,ad键左右旋转,空格键开火   右边的坦克使用方向键上下控制前后移动,方向键左右键实现左右旋转 ...

随机推荐

  1. javascript学习之BOM

    BOM是browser object model的缩写,简称浏览器对象模型.先看看下面这张图 window对象是BOM的顶层(核心)对象,所有对象都是通过它延伸出来的,也可以称为window的子对象. ...

  2. MVC5 网站开发之六 管理员 1、登录、验证和注销

    上次业务逻辑和展示层的架构都写了,可以开始进行具体功能的实现,这次先实现管理员的登录.验证和注销功能. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MV ...

  3. ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?

    我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很少人能够地把它弄清楚.为了让读者 ...

  4. ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求

    之所以称ASP.NET Core是一个Web开发平台,源于它具有一个极具扩展性的请求处理管道,我们可以通过这个管道的定制来满足各种场景下的HTTP处理需求.ASP. NET Core应用的很多特性,比 ...

  5. [C#] Linq To Objects - 如何操作字符串

    Linq To Objects - 如何操作字符串 开篇语: 上次发布的 <LINQ:进阶 - LINQ 标准查询操作概述>(90+赞) 社会反响不错,但自己却始终觉得缺点什么!“纸上得来 ...

  6. XML技术之SAX解析器

    1.解析XML文件有三种解析方法:DOM SAX DOM4J. 2.首先SAX解析技术只能读取XML文档中的数据信息,不能对其文档中的数据进行添加,删除,修改操作:这就是SAX解析技术的一个缺陷. 3 ...

  7. Hibernate(2)——Hibernate的实现原理总结和对其模仿的demo

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: 开源框架的学习思路(个人总结) Hibernate的运行原理总结 Hibernate实现原理中的两个主要技术 ...

  8. Vertica集群单节点宕机恢复方法

    Vertica集群单节点宕机恢复方法 第一种方法: 直接通过admintools -> 5 Restart Vertica on Host 第二种方法: 若第一种方法无法恢复,则清空宕机节点的c ...

  9. C#开发微信门户及应用(6)--微信门户菜单的管理操作

    前面几篇继续了我自己对于C#开发微信门户及应用的技术探索和相关的经验总结,继续探索微信API并分享相关的技术,一方面是为了和大家对这方面进行互动沟通,另一方面也是专心做好微信应用的底层技术开发,把基础 ...

  10. 【Java每日一题】20161229

    package Dec2016; import java.util.ArrayList; import java.util.List; public class Ques1229 { public s ...