已解决
【虚幻引擎UE】UE4/UE5 基于2D屏幕坐标获取场景3D坐标 射线检测(蓝图/C++)
来自网友在路上 11128112提问 提问时间:2023-10-26 00:35:58阅读次数: 112
最佳答案 问答题库1128位专家为你答疑解惑
UE4/UE5 基于2D屏幕坐标获取场景3D坐标
- 一、射线检测
- 1)定义
- 1)射线与3D场景中的物体交互的流程
- 2)射线检测蓝图函数
- 3)蓝图实现根据鼠标点击位置获取场景中的坐标值
- 4)根据相机中心点获取场景中的坐标值
- 5)射线检测相关C++函数
- 6)C++实现手动创建射线检测
- 7)C++实现点击获取场景中的坐标值
- 二、非射线检测的情况
- 1)根据相机当前位置获取中心点的世界坐标
一、射线检测
1)定义
射线检测(Ray Casting) 是一种计算机图形和计算机图形学中的基本技术,用于检测光线或射线是否与三维场景中的物体相交,以确定相交点的位置和其他相关信息。射线检测通常用于实现各种交互功能、渲染效果和物理模拟,包括但不限于鼠标拾取、光线追踪、碰撞检测和物体拾取等。
1)射线与3D场景中的物体交互的流程
定义射线的起点和方向向量。2检测相交:
沿着射线的方向,从起点开始沿射线前进,检测射线是否与场景中的任何物体相交。
通常,这涉及到进行碰撞检测,以确定是否有物体与射线相交。3确定交点:
如果射线与物体相交,计算交点的位置。
交点通常以3D坐标的形式给出,表示射线与物体相交的点。4处理交互:
根据应用的需求,您可以在交互点上执行特定的操作,如选择物体、执行动作或渲染效果。5遍历所有可能的相交点:
射线检测通常可以返回多个相交点,因此可以考虑遍历所有可能的交点以处理多重相交。
2)射线检测蓝图函数
LineTraceByChannel
执行一条射线检测,检测与指定碰撞通道相交的物体。返回一个 Hit Result
结构。SphereTraceByChannel
以球体的形状执行射线检测,检测球体与物体的碰撞。返回一个 Hit Result
结构。LineTraceMultiByChannel
执行射线检测,检测与指定碰撞通道相交的所有物体。返回一个 Hit Results
数组。SphereTraceMultiByChannel
以球体的形状执行射线检测,检测球体与多个物体的碰撞。返回一个 Hit Results
数组。BoxTraceByChannel
执行射线检测,检测与指定碰撞通道相交的物体,使用盒子形状。返回一个 Hit Result
结构。MultiSphereTraceByChannel
执行多个球体形状的射线检测,检测多个球体与物体的碰撞。返回一个 Hit Results
数组。LineTraceForObjects
执行射线检测,检测与指定物体类型相交的物体。返回一个 Hit Result
结构。SphereTraceForObjects
以球体的形状执行射线检测,检测与指定物体类型相交的物体。返回一个 Hit Result
结构。BoxTraceForObjects
执行射线检测,检测与指定物体类型相交的物体,使用盒子形状。返回一个 Hit Result
结构。MultiSphereTraceForObjects
执行多个球体形状的射线检测,检测与指定物体类型相交的物体。返回一个 Hit Results
数组。CapsuleTraceByChannel
以胶囊体的形状执行射线检测,检测胶囊体与物体的碰撞。返回一个 Hit Result
结构。CapsuleTraceForObjects
以胶囊体的形状执行射线检测,检测与指定物体类型相交的物体。返回一个 Hit Result
结构。
3)蓝图实现根据鼠标点击位置获取场景中的坐标值
4)根据相机中心点获取场景中的坐标值
需要获取到pawn里的相机。
5)射线检测相关C++函数
(仅列举linetrace系列其他大同小异)
LineTraceSingleByChannel
:- 用于检测一条射线与第一个相交物体的碰撞。
- 返回一个
FHitResult
结构,其中包含有关碰撞的信息,如碰撞点、碰撞法线和碰撞物体的引用。
bool UWorld::LineTraceSingleByChannel(FHitResult& OutHit, const FVector Start, const FVector End, ECollisionChannel TraceChannel, const FCollisionQueryParams& Params)
LineTraceMultiByChannel
:- 用于检测一条射线与多个相交物体的碰撞。
- 返回一个
TArray<FHitResult>
,其中包含所有相交物体的碰撞信息。
int32 UWorld::LineTraceMultiByChannel(TArray<FHitResult>& OutHits, const FVector Start, const FVector End, ECollisionChannel TraceChannel, const FCollisionQueryParams& Params)
LineTraceSingleByObjectType
:- 类似于
LineTraceSingleByChannel
,但是使用物体类型(EObjectTypeQuery
)而不是碰撞通道进行检测。
- 类似于
bool UWorld::LineTraceSingleByObjectType(FHitResult& OutHit, const FVector Start, const FVector End, FObjectQueryParams ObjectQueryParams, const FCollisionQueryParams& Params)
LineTraceMultiByObjectType
:- 类似于
LineTraceMultiByChannel
,但是使用物体类型(EObjectTypeQuery
)而不是碰撞通道进行检测。
- 类似于
int32 UWorld::LineTraceMultiByObjectType(TArray<FHitResult>& OutHits, const FVector Start, const FVector End, FObjectQueryParams ObjectQueryParams, const FCollisionQueryParams& Params)
6)C++实现手动创建射线检测
FVector StartLocation; // 射线的起点坐标
FVector ForwardVector; // 射线的方向向量
FHitResult HitResult; // 用于存储碰撞信息的变量// 设置射线的起点坐标
StartLocation = PlayerCameraComponent->GetComponentLocation(); // PlayerCameraComponent是摄像机组件// 设置射线的方向向量
ForwardVector = PlayerCameraComponent->GetForwardVector(); // 获取摄像机的前向向量// 建立射线
FVector EndLocation = ((ForwardVector * RayLength) + StartLocation); // 计算射线的终点坐标// 进行射线检测
if (GetWorld()->LineTraceSingleByChannel(HitResult, StartLocation, EndLocation, ECC_Visibility))
{// 射线与物体相交,可以在HitResult中获取碰撞信息AActor* HitActor = HitResult.GetActor();FVector ImpactPoint = HitResult.ImpactPoint;// 进一步处理交互逻辑
}
PlayerCameraComponent:摄像机组件
LineTraceSingleByChannel:射线检测函数
HitResult:碰撞的物体和碰撞点
RayLength:射线的长度;
ECC_Visibility:射线检测所使用的碰撞通道
7)C++实现点击获取场景中的坐标值
void AYourPlayerController::GetSceneLocationFromMouse()
{// 获取玩家控制器APlayerController* PlayerController = this;if (PlayerController){// 获取鼠标点击位置FVector MouseLocation, MouseDirection;PlayerController->DeprojectMousePositionToWorld(MouseLocation, MouseDirection);// 创建射线,用于射线检测FHitResult HitResult;FCollisionQueryParams CollisionParams;// 执行射线检测if (GetWorld()->LineTraceSingleByChannel(HitResult, MouseLocation, MouseLocation + MouseDirection * YourRayLength, ECC_Visibility, CollisionParams)){// 获取射线与场景相交的位置FVector SceneLocation = HitResult.Location;// 打印结果UE_LOG(LogTemp, Warning, TEXT("Scene Location: %s"), *SceneLocation.ToString());}}
}
二、非射线检测的情况
1)根据相机当前位置获取中心点的世界坐标
void AYourPlayerController::GetCameraCenterLocation()
{// 获取玩家控制器的视图控制器APlayerController* PlayerController = this;if (PlayerController){// 获取相机组件UCameraComponent* CameraComponent = PlayerController->PlayerCameraManager->GetCameraComponent();if (CameraComponent){// 获取相机位置FVector CameraLocation = CameraComponent->GetComponentLocation();// 获取相机旋转FRotator CameraRotation = CameraComponent->GetComponentRotation();// 计算相机中心点的位置(通常位于相机位置的前方,视角方向)FVector CameraForwardVector = CameraRotation.Vector();FVector CameraCenterLocation = CameraLocation + CameraForwardVector * YourDistance; // 替换 YourDistance 为相机中心点到相机位置的距离// 将相机中心点的位置转换为场景中的坐标FVector WorldLocation = CameraCenterLocation;// 打印结果UE_LOG(LogTemp, Warning, TEXT("Camera Center Location: %s"), *WorldLocation.ToString());}}
}
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"【虚幻引擎UE】UE4/UE5 基于2D屏幕坐标获取场景3D坐标 射线检测(蓝图/C++)":http://eshow365.cn/6-24602-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 二、PHP基础学习[变量]
- 下一篇: 扩散模型学习——代码学习