UE4 C++ 通过Spline绘制任意道路
仅作为学习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绘制任意道路相关推荐
- 地图上绘制任意角度的椭圆_地图上的总椭圆
地图上绘制任意角度的椭圆 或者,如何选择下班后去海滩的最佳方式 (Or, how to choose the best way to walk to the beach after work) It ...
- ue4 unreal4 自定义网格 绘制自定义网格 绘制面 (Plus)
额四月份写了 CustomMeshComponent 用于创建自定义网格 ue4 unreal4 自定义网格 绘制自定义网格 绘制面_ljason1993的博客-CSDN博客 当时想着找时间写个 Pr ...
- matlab 绘制任意方向和位置的空间圆锥体
matlab 绘制任意方向和位置的空间圆锥体 function cone3(X1,X2,r,color) %一个简单的例子:cone3([1 2 3],[7 8 9],1,'b');%两个空间点位置, ...
- c语言 绘制任意斜率的直线,绘制任意斜率的直线
<绘制任意斜率的直线>由会员分享,可在线阅读,更多相关<绘制任意斜率的直线(15页珍藏版)>请在人人文库网上搜索. 1.淮海工学院计算机工程学院 实验报告书 课程名: 计算机图 ...
- 实验一:绘制任意斜率的直线段
一.实验目的 1.1掌握任意斜率直线段的中点Bresenham扫描转换算法 1.2掌握CLine直线类的设计方法 1.3掌握状态栏编程技术 二.实验步骤 在进行实验之前要知道绘制直线的中点Bresen ...
- 计算机图形学实验二 《绘制任意斜率的直线》
计算机图形学实验二 <绘制任意斜率的直线> 视频讲解地址 一.Bresenham算法 用视频讲会好点我之前也录过相关视频可以先凑合看 二.设计CLine类 之前也说了C++一个类是由源文件 ...
- 用python基础知识绘制任意格数的棋盘进行五子棋游戏
绘制任意格数的棋盘进行五子棋游戏 代码显示: # 本程序是为了实现一个任意大小的棋盘def draw_board(t, array):# 绘制出第一行数字for i in range(t):print ...
- 用 ATL ActiveX 绘制任意平面函数的曲线
作者: 杨老师 下载源代码 关键词:脚本.ATL.ActiveX.脚本引擎.表达式计算.IActiveScript.IActiveScriptSite 一.前言 这是非常有挑战性的题目.对于用户输入的 ...
- 用ATL ActiveX 绘制任意平面函数的曲线
一.前言 这是非常有挑战性的题目.对于用户输入的任意一个平面函数f(x),绘制出其函数曲线.这里最关键的技术难点就是如何实现计算表达式的值.在<编译原理>和<数据结构>的书中, ...
- 使用python绘制任意函数图像
使用python绘制任意函数图像 ##原创文章不易,望点赞转发收藏三连 效果展示 y = (sinx)/x y = x4+x3+x^2+1 y=-x^2 文末还会展示一些实例图片 引入需要的库 我们使 ...
最新文章
- NOIP2002 均分纸牌
- python—多进程之进程的创建(一)
- 抓取SAP报表ALV GRID上的数据
- 修复:安装 CUDA9.0 Patch 1 时载入文件后闪退(cuda_9.0.176.1_windows.exe)
- 合数分解质数c语言算法,合数分解成质数之和问题探究
- android canvas 清空画布,清除canvas画布内容(点擦除+线擦除)
- bigdecimal乘法_Java面试题之BigDecimal比较大小问题
- pycharm hotkey
- MS SQL SERVER中的临时表
- 【亲测】win7设置让PC变身无线热点共享给手机上网
- 计算机二进制编码原理,浅谈计算机信息的二进制编码
- 不小心将 pip 卸载了,重新安装pip
- RK3588超强8K视频输出NRV边缘计算盒 AI人工智能
- java上传加密_Java实现文件的加密与解密
- 计算机考试电子邮件怎么回复,计算机基础知识电子邮件使用技巧集锦(二)
- Win10安装Ubuntu18.04
- 浙江理工大学 我的编程之路 零基础学C/C++ 200题 标程/题解
- 暗黑-角色-中英文对照
- java照片水印怎么做的_java图片加水印_百度经验
- L1-016. 查验身份证
热门文章
- 古剑奇谭ol服务器位置,国产网游史上第一次?古剑奇谭OL将把WeGame与360服务器数据互通...
- python二元函数图像在线绘制_numpy,matplotlib
- git如何选择性合并_git - 如何挑选一系列提交并合并到另一个分支?
- 网站被攻击怎么办如何解决
- 《趣学算法(第2版)》读书笔记 Part 2 :算法入门
- django mysql graphql_GraphQL graphene-django 基本使用文档
- sublime好看的字体设置
- 《东周列国志》第六十六回 杀宁喜子鱄出奔 戮崔杼庆封独相
- SVG_16_defs标签_use标签_style标签_红绿灯效果
- linux Permission 0644 for are too open 错误解决方案