UE5.3C++通过Spline样条实现三维连线,自己UV贴图。
- 其他
- 2025-09-08 00:30:01

一.制作了基于USplineComponent的画线插件,就是我们常说的样条线。
直接看怎么用,关于插件实现细节,后续会更新,看思路就行。通过ID,管理每一条线。移除删掉上一帧的线条Mesh。第一个点,是本身直接放过去。第二个点是使用AddSplinePoint放进去。让后算两个点的距离,通过材质参数集合,设置UV。最后生成三角形面构成线条。
void UDrawLineSubsystem::UpdateLinePath(int id,FVector First, FVector Second) { int32 pointsNum = 2; if (pointsNum <= 1) return; int32 tmpPathID = id; if (LinePathMap.Find(tmpPathID)) { ASplineActor* tmpFlightPath = *LinePathMap.Find(tmpPathID); tmpFlightPath->SetActorHiddenInGame(true); LinePathMap.Remove(tmpPathID); //删除旧的同序号航迹线 tmpFlightPath->Destroy(); } // //生成轨迹线 UClass* tmpSplineClass = LoadClass<ASplineActor>(nullptr, TEXT("/Script/Engine.Blueprint'/HMSLineSystem/Blueprints/BP_ConnectLine.BP_ConnectLine_C'")); ASplineActor* LinePathActor = Cast<ASplineActor>(GetWorld()->SpawnActor(tmpSplineClass)); if (!LinePathActor) { UE_LOG(LogTemp, Error, TEXT("failed to spawn spline actor! UProject2444System::UpdateFlightPath")); return; } LinePathActor->DeleteSplinePointByIndex(1); if (!Georeference) InitialGeoreference(); if (!Georeference) return; if (!First.IsZero()) { //处理点位信息 FVector tmpDataPosition = FVector(First); FVector tmpUELocation = Georeference->TransformLongitudeLatitudeHeightPositionToUnreal(tmpDataPosition); LinePathActor->SetActorLocation(tmpUELocation); First = tmpUELocation; //FTransform LocalTransform; //LocalTransform.SetLocation(tmpUELocation); //LinePathActor->AddSplinePoint(LocalTransform, EPointTransformMode::world); } if (!Second.IsZero()) { //处理点位信息 FVector tmpDataPosition = FVector(Second); FVector tmpUELocation = Georeference->TransformLongitudeLatitudeHeightPositionToUnreal(tmpDataPosition); FTransform LocalTransform; LocalTransform.SetLocation(tmpUELocation); LinePathActor->AddSplinePoint(LocalTransform, EPointTransformMode::world); Second = tmpUELocation; } LinePathActor->SplineMeshData.MeshSlice = 1; LinePathActor->SplineMeshData.FacesCount = 2; LinePathActor->SplineMeshData.EdgeLength = 200; LinePathActor->SplineMeshData.MeshMode = EMeshMode::BaseOnPoint; LinePathActor->SetAllPointsMode(ESplineMode::Curve); LinePathActor->SetAllPointsMode(LinePathActor->SplineMeshData.SplineMode); LinePathMap.Add(tmpPathID, LinePathActor); //TPADataMap.Add(tmpPathID, _TPAData); ///Script/Engine.MaterialInstanceConstant'/Game/ZOthers/Other/Materials/M_Border_Anim_10.M_Border_Anim_10' // //设置材质 UMaterial* SplineMaterial; SplineMaterial = LoadObject<UMaterial>(nullptr, TEXT("/Script/Engine.Material'/Game/ZOthers/Other/Materials/Link.Link'")); // switch (tmpPathID) // { // case 1: SplineMaterial = LoadObject<UMaterial>(nullptr, FLIGHT_PATH_MATERIAL1); break; // case 2: SplineMaterial = LoadObject<UMaterial>(nullptr, FLIGHT_PATH_MATERIAL2); break; // case 3: SplineMaterial = LoadObject<UMaterial>(nullptr, FLIGHT_PATH_MATERIAL3); break; // default:SplineMaterial = LoadObject<UMaterial>(nullptr, FLIGHT_PATH_MATERIAL1); break; // } if (SplineMaterial) LinePathActor->SplineMeshMaterial = SplineMaterial; // // //描绘航迹线 if (!M_ParamCollection) { UMaterialParameterCollection* MPC = LoadObject<UMaterialParameterCollection>(nullptr, TEXT("/Script/Engine.MaterialParameterCollection'/Game/ZOthers/Other/Materials/1'")); M_ParamCollection = GetWorld()->GetParameterCollectionInstance(MPC); } if (!M_ParamCollection) return; double dis = FVector::Dist(First,Second); dis *= 0.01; if (id == int(DTypeIdPlatform::A)) { M_ParamCollection->SetScalarParameterValue(FName("ATOB"), dis); } LinePathActor->CreateSplineMesh(); }二.材质参数集合在C++使用
材质参数需要的头文件
#include "Materials/MaterialParameterCollection.h" #include "Materials/MaterialParameterCollectionInstance.h"材质参数集合,它的改动,在上面的代码里。它在材质里的如下图,只设置了V的平铺,没设置U的平铺。
UMaterialParameterCollectionInstance* M_ParamCollection;UE5.3C++通过Spline样条实现三维连线,自己UV贴图。由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“UE5.3C++通过Spline样条实现三维连线,自己UV贴图。”
上一篇
【NLP】文本预处理
下一篇
WPF-APP全局生命周期事件