仅作为学习UE4的记录,请勿转载。

先看效果图

上关键源码。

1. 通过两个点和点的切线向量构建一个SplineMeshCompoent。

USplineMeshComponent* ASplineRoadActor::CreateSplineMeshComponent(const FVector& StartPos, const FVector& StartTangent, const FVector& EndPos, const FVector& EndTangent, const FVector& UpDir)
{USplineMeshComponent* pSplineMesh = NewObject<USplineMeshComponent>(this, USplineMeshComponent::StaticClass());pSplineMesh->CreationMethod = EComponentCreationMethod::UserConstructionScript;pSplineMesh->SetStaticMesh(SplineStaticMesh);//    pSplineMesh->AttachTo(pSpline);pSplineMesh->SetForwardAxis(ForwardAxis, false);FTransform t = pSplineMesh->GetRelativeTransform();t.SetScale3D(FVector(1.f, 1.f, 1.f));pSplineMesh->SetRelativeTransform(t);pSplineMesh->SetStartAndEnd(StartPos, StartTangent, EndPos, EndTangent);pSplineMesh->SetSplineUpDir(UpDir);return pSplineMesh;
}

2. 使用上面的函数绘制多条道路

void ASplineRoadActor::CreateSplineMesh(const TArray<TArray<FVector>>& pts)
{// 将数据显示加载到窗口进行显示for (const TArray<FVector> &line : pts){USplineComponent* pSpline = NewObject<USplineComponent>(this, USplineComponent::StaticClass());pSpline->SetupAttachment(Scene);pSpline->RegisterComponent();pSpline->SetSplineLocalPoints(line);//  只有两个点,则直接绘制if (pSpline->GetNumberOfSplinePoints() == 2){//  先获取三个点FVector FirstPos, LastPos;FVector Tangent;FirstPos = pSpline->GetLocationAtSplinePoint(0, ESplineCoordinateSpace::Local);LastPos = pSpline->GetLocationAtSplinePoint(1, ESplineCoordinateSpace::Local);Tangent = LastPos - FirstPos;CreateSplineMeshComponent(FirstPos, Tangent, LastPos, Tangent, FVector(0, -1, 0));return;}// 两个以上点,则需要计算朝向for (int32 i = 0; i < pSpline->GetNumberOfSplinePoints() - 2; i++){//  先获取三个点FVector FirstPos, MiddlePos, LastPos;FVector StartTangent, EndTangent;FirstPos = pSpline->GetLocationAtSplinePoint(i, ESplineCoordinateSpace::Local);MiddlePos = pSpline->GetLocationAtSplinePoint(i + 1, ESplineCoordinateSpace::Local);LastPos = pSpline->GetLocationAtSplinePoint(i + 2, ESplineCoordinateSpace::Local);//   计算两个线段的方向StartTangent = MiddlePos - FirstPos;StartTangent.Normalize();EndTangent = LastPos - MiddlePos;EndTangent.Normalize();//  计算mesh的朝向FVector StartDir = StartTangent;FVector EndDir = EndTangent;float LineDir = atan2(StartDir.Y, StartDir.X) - atan2(EndDir.Y, EndDir.X);if (LineDir > PI)LineDir = 0 - LineDir;else if (LineDir < -PI)LineDir = 0 - LineDir;FVector UpDir(0, 1, 0);if (LineDir < 0.f){UpDir = StartDir - EndDir;}else if (LineDir > 0.f){UpDir = EndDir - StartDir;}//    创建meshCreateSplineMeshComponent(FirstPos, StartTangent, MiddlePos, EndTangent, UpDir);//    给最后一个线段创建meshif (i == pSpline->GetNumberOfSplinePoints() - 3){CreateSplineMeshComponent(MiddlePos, EndTangent, LastPos, EndTangent, UpDir);}}}//注册组件RegisterAllComponents();
}

3. 使用模拟数据进行显示。

void ASplineRoadActor::BeginPlay()
{Super::BeginPlay();//  使用一些模拟数据创建道路TArray<TArray<FVector>> pts;//  第一条道路TArray<FVector> road1;road1.Add(FVector(0, 0, 10));road1.Add(FVector(200, 200, 10));road1.Add(FVector(200, 400, 10));road1.Add(FVector(0, 200, 10));road1.Add(FVector(-200, 0, 10));pts.Add(road1);TArray<FVector> road2;road2.Add(FVector(-400, 0, 10));road2.Add(FVector(-400, -200, 10));road2.Add(FVector(-200, -200, 10));road2.Add(FVector(-400, -400, 10));road2.Add(FVector(-600, -100, 10));pts.Add(road2);CreateSplineMesh(pts);
}

最后附上源码下载链接:https://download.csdn.net/download/chenxipu123/15866603

UE4 C++ 通过Spline绘制任意道路相关推荐

  1. 地图上绘制任意角度的椭圆_地图上的总椭圆

    地图上绘制任意角度的椭圆 或者,如何选择下班后去海滩的最佳方式 (Or, how to choose the best way to walk to the beach after work) It ...

  2. ue4 unreal4 自定义网格 绘制自定义网格 绘制面 (Plus)

    额四月份写了 CustomMeshComponent 用于创建自定义网格 ue4 unreal4 自定义网格 绘制自定义网格 绘制面_ljason1993的博客-CSDN博客 当时想着找时间写个 Pr ...

  3. matlab 绘制任意方向和位置的空间圆锥体

    matlab 绘制任意方向和位置的空间圆锥体 function cone3(X1,X2,r,color) %一个简单的例子:cone3([1 2 3],[7 8 9],1,'b');%两个空间点位置, ...

  4. c语言 绘制任意斜率的直线,绘制任意斜率的直线

    <绘制任意斜率的直线>由会员分享,可在线阅读,更多相关<绘制任意斜率的直线(15页珍藏版)>请在人人文库网上搜索. 1.淮海工学院计算机工程学院 实验报告书 课程名: 计算机图 ...

  5. 实验一:绘制任意斜率的直线段

    一.实验目的 1.1掌握任意斜率直线段的中点Bresenham扫描转换算法 1.2掌握CLine直线类的设计方法 1.3掌握状态栏编程技术 二.实验步骤 在进行实验之前要知道绘制直线的中点Bresen ...

  6. 计算机图形学实验二 《绘制任意斜率的直线》

    计算机图形学实验二 <绘制任意斜率的直线> 视频讲解地址 一.Bresenham算法 用视频讲会好点我之前也录过相关视频可以先凑合看 二.设计CLine类 之前也说了C++一个类是由源文件 ...

  7. 用python基础知识绘制任意格数的棋盘进行五子棋游戏

    绘制任意格数的棋盘进行五子棋游戏 代码显示: # 本程序是为了实现一个任意大小的棋盘def draw_board(t, array):# 绘制出第一行数字for i in range(t):print ...

  8. 用 ATL ActiveX 绘制任意平面函数的曲线

    作者: 杨老师 下载源代码 关键词:脚本.ATL.ActiveX.脚本引擎.表达式计算.IActiveScript.IActiveScriptSite 一.前言 这是非常有挑战性的题目.对于用户输入的 ...

  9. 用ATL ActiveX 绘制任意平面函数的曲线

    一.前言 这是非常有挑战性的题目.对于用户输入的任意一个平面函数f(x),绘制出其函数曲线.这里最关键的技术难点就是如何实现计算表达式的值.在<编译原理>和<数据结构>的书中, ...

  10. 使用python绘制任意函数图像

    使用python绘制任意函数图像 ##原创文章不易,望点赞转发收藏三连 效果展示 y = (sinx)/x y = x4+x3+x^2+1 y=-x^2 文末还会展示一些实例图片 引入需要的库 我们使 ...

最新文章

  1. NOIP2002 均分纸牌
  2. python—多进程之进程的创建(一)
  3. 抓取SAP报表ALV GRID上的数据
  4. 修复:安装 CUDA9.0 Patch 1 时载入文件后闪退(cuda_9.0.176.1_windows.exe)
  5. 合数分解质数c语言算法,合数分解成质数之和问题探究
  6. android canvas 清空画布,清除canvas画布内容(点擦除+线擦除)
  7. bigdecimal乘法_Java面试题之BigDecimal比较大小问题
  8. pycharm hotkey
  9. MS SQL SERVER中的临时表
  10. 【亲测】win7设置让PC变身无线热点共享给手机上网
  11. 计算机二进制编码原理,浅谈计算机信息的二进制编码
  12. 不小心将 pip 卸载了,重新安装pip
  13. RK3588超强8K视频输出NRV边缘计算盒 AI人工智能
  14. java上传加密_Java实现文件的加密与解密
  15. 计算机考试电子邮件怎么回复,计算机基础知识电子邮件使用技巧集锦(二)
  16. Win10安装Ubuntu18.04
  17. 浙江理工大学 我的编程之路 零基础学C/C++ 200题 标程/题解
  18. 暗黑-角色-中英文对照
  19. java照片水印怎么做的_java图片加水印_百度经验
  20. L1-016. 查验身份证

热门文章

  1. 古剑奇谭ol服务器位置,国产网游史上第一次?古剑奇谭OL将把WeGame与360服务器数据互通...
  2. python二元函数图像在线绘制_numpy,matplotlib
  3. git如何选择性合并_git - 如何挑选一系列提交并合并到另一个分支?
  4. 网站被攻击怎么办如何解决
  5. 《趣学算法(第2版)》读书笔记 Part 2 :算法入门
  6. django mysql graphql_GraphQL graphene-django 基本使用文档
  7. sublime好看的字体设置
  8. 《东周列国志》第六十六回 杀宁喜子鱄出奔 戮崔杼庆封独相
  9. SVG_16_defs标签_use标签_style标签_红绿灯效果
  10. linux Permission 0644 for are too open 错误解决方案