景观创作 C++ UE4.27
Landscape Creation C++ UE4.27
我想在 unreal engine 4.27 中仅使用 C++ 从头开始创建景观。我对这个过程只有一个简单的概念,它围绕 GetWorld()->SpawnActor<ALandscape>
、ALandscapeProxy::Import(...)
和导入 height/weight 地图。
我使用LandscapeEditorDetailCustomization_NewLandscape::OnCreateButtonClicked()
方法作为学习基础,但不幸的是我陷入了僵局。
从我的搜索中收集到的信息来看,关于这个问题的例子并不多。有人有建议或例子吗?
这是我想出的解决方案,非常感谢 ChenHP (or chpsemail) who gave me a solution to this. Firstly, declare the following variables. A better understanding can be found here。
FQuat InRotation
FVector InTranslation
FVector InScale
FTransform LandscapeTransform{InRotation, InTranslation, InScale}
int32 QuadsPerSection
int32 SectionsPerComponent
int32 ComponentCountX
int32 ComponentCountY
int32 QuadsPerComponent
int32 SizeX
int32 SizeY
为景观的高度和 material 创建容器:
TArray<FLandscapeImportLayerInfo> MaterialImportLayers
TMap<FGuid, TArray<uint16>> HeightDataPerLayers
TMap<FGuid, TArray<FLandscapeImportLayerInfo>> MaterialLayerDataPerLayers
需要注意的是,UE4中的高度是uint16类型,0最深,65'534最高。因此对于平面地图,所有高度条目都应为 32768。
高度数是地图的分辨率,取决于SizeX和SizeY。
TArray<uint16> HeightData;
HeightData.SetNum(SizeX * SizeY);
for (int32 i = 0; i < HeightData.Num(); i++)
{
HeightData[i] = 32768;
}
高度和material信息应该放在相应的容器中,并赋予一个有效的FGuid。
HeightDataPerLayers.Add(FGuid(), MoveTemp(HeightData))
MaterialLayerDataPerLayers.Add(FGuid(), MoveTemp(MaterialImportLayers))
此时景观的基本参数已经设置。 ALandscape* Landscape = SpawnActor<ALandscape>()
可以在任何时候调用,因为它只是生成一个实际上没有任何关于它的信息的对象。这也适用于设置景观的领域。需要设置的字段如下所示:
Landscape->bCanHaveLayersContent
Landscape->LandscapeMaterial
Landscape->SetActorTransform
Landscape->StaticLightingLOD
ULandscapeInfo* LandscapeInfo = Landscape->GetLandscapeInfo()
LandscapeInfo->UpdateLayerInfoMap(Landscape)
Landscape->RegisterAllComponents()
Landscape->GetClass()
Landscape->PostEditChangeProperty(MaterialPropertyChangedEvent)
Landscape->PostEditChange()
风景被赋予形式的实际部分发生在Landscape->Import(...)
的调用中。
可以找到有关脚本外观的详细解释 here 以及有关景观的更多信息(查看 cpp 代码的答案)。
我想在 unreal engine 4.27 中仅使用 C++ 从头开始创建景观。我对这个过程只有一个简单的概念,它围绕 GetWorld()->SpawnActor<ALandscape>
、ALandscapeProxy::Import(...)
和导入 height/weight 地图。
我使用LandscapeEditorDetailCustomization_NewLandscape::OnCreateButtonClicked()
方法作为学习基础,但不幸的是我陷入了僵局。
从我的搜索中收集到的信息来看,关于这个问题的例子并不多。有人有建议或例子吗?
这是我想出的解决方案,非常感谢 ChenHP (or chpsemail) who gave me a solution to this. Firstly, declare the following variables. A better understanding can be found here。
FQuat InRotation
FVector InTranslation
FVector InScale
FTransform LandscapeTransform{InRotation, InTranslation, InScale}
int32 QuadsPerSection
int32 SectionsPerComponent
int32 ComponentCountX
int32 ComponentCountY
int32 QuadsPerComponent
int32 SizeX
int32 SizeY
为景观的高度和 material 创建容器:
TArray<FLandscapeImportLayerInfo> MaterialImportLayers
TMap<FGuid, TArray<uint16>> HeightDataPerLayers
TMap<FGuid, TArray<FLandscapeImportLayerInfo>> MaterialLayerDataPerLayers
需要注意的是,UE4中的高度是uint16类型,0最深,65'534最高。因此对于平面地图,所有高度条目都应为 32768。 高度数是地图的分辨率,取决于SizeX和SizeY。
TArray<uint16> HeightData;
HeightData.SetNum(SizeX * SizeY);
for (int32 i = 0; i < HeightData.Num(); i++)
{
HeightData[i] = 32768;
}
高度和material信息应该放在相应的容器中,并赋予一个有效的FGuid。
HeightDataPerLayers.Add(FGuid(), MoveTemp(HeightData))
MaterialLayerDataPerLayers.Add(FGuid(), MoveTemp(MaterialImportLayers))
此时景观的基本参数已经设置。 ALandscape* Landscape = SpawnActor<ALandscape>()
可以在任何时候调用,因为它只是生成一个实际上没有任何关于它的信息的对象。这也适用于设置景观的领域。需要设置的字段如下所示:
Landscape->bCanHaveLayersContent
Landscape->LandscapeMaterial
Landscape->SetActorTransform
Landscape->StaticLightingLOD
ULandscapeInfo* LandscapeInfo = Landscape->GetLandscapeInfo()
LandscapeInfo->UpdateLayerInfoMap(Landscape)
Landscape->RegisterAllComponents()
Landscape->GetClass()
Landscape->PostEditChangeProperty(MaterialPropertyChangedEvent)
Landscape->PostEditChange()
风景被赋予形式的实际部分发生在Landscape->Import(...)
的调用中。
可以找到有关脚本外观的详细解释 here 以及有关景观的更多信息(查看 cpp 代码的答案)。