【虚幻引擎UE】UE4/UE5 基于2D屏幕坐标获取场景3D坐标 射线检测(蓝图/C++)

UE4/UE5 基于2D屏幕坐标获取场景3D坐标

  • 一、射线检测
    • 1)定义
    • 1)射线与3D场景中的物体交互的流程
    • 2)射线检测蓝图函数
    • 3)蓝图实现根据鼠标点击位置获取场景中的坐标值
    • 4)根据相机中心点获取场景中的坐标值
    • 5)射线检测相关C++函数
    • 6)C++实现手动创建射线检测
    • 7)C++实现点击获取场景中的坐标值
  • 二、非射线检测的情况
    • 1)根据相机当前位置获取中心点的世界坐标


一、射线检测

1)定义

射线检测(Ray Casting) 是一种计算机图形和计算机图形学中的基本技术,用于检测光线或射线是否与三维场景中的物体相交,以确定相交点的位置和其他相关信息。射线检测通常用于实现各种交互功能、渲染效果和物理模拟,包括但不限于鼠标拾取、光线追踪、碰撞检测和物体拾取等。

1)射线与3D场景中的物体交互的流程

步骤描述
1定义射线:
定义射线的起点和方向向量。
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系列其他大同小异)

  1. LineTraceSingleByChannel
    • 用于检测一条射线与第一个相交物体的碰撞。
    • 返回一个FHitResult结构,其中包含有关碰撞的信息,如碰撞点、碰撞法线和碰撞物体的引用。
bool UWorld::LineTraceSingleByChannel(FHitResult& OutHit, const FVector Start, const FVector End, ECollisionChannel TraceChannel, const FCollisionQueryParams& Params)
  1. LineTraceMultiByChannel
    • 用于检测一条射线与多个相交物体的碰撞。
    • 返回一个TArray<FHitResult>,其中包含所有相交物体的碰撞信息。
int32 UWorld::LineTraceMultiByChannel(TArray<FHitResult>& OutHits, const FVector Start, const FVector End, ECollisionChannel TraceChannel, const FCollisionQueryParams& Params)
  1. LineTraceSingleByObjectType
    • 类似于LineTraceSingleByChannel,但是使用物体类型(EObjectTypeQuery)而不是碰撞通道进行检测。
bool UWorld::LineTraceSingleByObjectType(FHitResult& OutHit, const FVector Start, const FVector End, FObjectQueryParams ObjectQueryParams, const FCollisionQueryParams& Params)
  1. 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());}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MSQL系列(七) Mysql实战-SQL语句Join,exists,in的区别

Mysql实战-SQL语句Join&#xff0c;exists&#xff0c;in的区别 前面我们讲解了索引的存储结构&#xff0c;BTree的索引结构&#xff0c;以及索引最左侧匹配原则及讲解一下常用的SQL语句的优化建议&#xff0c;今天我们来详细讲解一下 我们经常使用的 join&#xff0c; exist&…

进程之操作系统的概念

再小的努力&#xff0c;乘以365都很明显。文章目录 操作系统操作系统的概念设计操作系统的目的 管理 ps:如何理解管理如何进行管理 操作系统管理软硬件资源小总结系统调用和库函数的概念小总结 操作系统 在讲述进程的时候我们先讲述一下操作系统&#xff08;os&#xff09;,因…

VR全景平台应该具备哪些功能,怎样选择VR全景平台

引言&#xff1a; 虚拟现实&#xff08;VR&#xff09;技术在不断发展&#xff0c;为企业和消费者提供了全新的交互体验。VR全景平台是一个关键的组成部分&#xff0c;它必须具备一系列重要的功能来吸引用户、提供内容和实现商业成功。那么VR全景平台应该具备哪些功能&#xf…

数据分析和机器学习的11个高级可视化图表介绍

可视化是一种强大的工具&#xff0c;用于以直观和可理解的方式传达复杂的数据模式和关系。它们在数据分析中发挥着至关重要的作用&#xff0c;提供了通常难以从原始数据或传统数字表示中辨别出来的见解。 可视化对于理解复杂的数据模式和关系至关重要&#xff0c;我们将介绍11…

面试题—JAVA基础①

文章目录 1.Java面向对象有哪些特征&#xff1f;2.ArrayList和LinkedList有什么区别&#xff1f;3.Java接口和抽象类有哪些区别&#xff1f;4.hashcode和equals如何使用&#xff1f;5.try-catch6.局部变量和实例变量7.String、StringBuffer、StringBuilder 的区别&#xff1f;8…

编程小白的自学笔记十七(python办公自动化操作EXCEL表格之作图)

系列文章目录 编程小白的自学笔记十六&#xff08;python办公自动化操作EXCEL表格&#xff09; 编程小白的自学笔记十五&#xff08;python办公自动化操作EXCEL表格&#xff09; 编程小白的自学笔记十四&#xff08;python办公自动化创建、复制、移动文件和文件夹 编程小白…

12. 机器学习 - 拟合

Hi, 你好. 我是茶桁. 这一节课一开始我们要说一个非常重要的概念: 拟合. 拟合 相信只要你关注机器学习, 那么多少在某些场合下都会听到拟合这个概念. 什么叫做拟合,什么叫做过拟合或者欠拟合呢? 假如有一个模型, 这个模型在训练数据的时候效果很好, 体现在loss很小, 或者说…

系统配置与性能评价

系统配置与性能评价&#xff08;0-2分&#xff09; 章节介绍 系统性能&#xff08;性能指标&#xff09; 在web服务器的测试中&#xff0c;反映其性能的指标主要有最大并发连接数&#xff0c;响应延迟和吞吐量等。 常见的web服务器性能评测方法有基准性能测试&#xff0c;压力…

决策树完成图片分类任务

数据集要求&#xff1a; 训练集 和 验证集 &#xff08;要求分好&#xff09; 图片放置规则 &#xff1a; 一个总文件夹 放类别名称的子文件夹 其中子文件夹 为存放同一类别图片 举个例子 分类动物 则 总文件夹名称为动物 子文件夹为 猫 狗 猪猪 。。。 其中猫的文件夹里面…

css-边框流水线

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"initial-scale1.0, user-scalableno" /><title></title><style type&…

Java将djvu文件转成pdf

需求来源 迫于有部分资源是djvu格式的文件&#xff0c;需要预览这部分文件&#xff0c;web端无法直接预览djvu&#xff0c;所以需要将djvu转成pdf。 转换方法 简单来说就是先把djvu文件转换成tiff文件&#xff0c;再将tiff文件转换成pdf文件。 Ubuntu服务器 如果服务器是U…

二分查找:如何快速定位IP对应的省份地址?

文章来源于极客时间前google工程师−王争专栏。 通过IP地址查找IP归属地功能&#xff1a; 这个功能是通过维护一个很大的IP地址库来实现。地址库中包含IP地址范围和归属地的对应关系。 当我们查询202.201.133.13这个IP地址归属地时&#xff0c;在地址库中搜索&#xff0c;这个…

H3C AC通过Web平台进行AC软件的升级?

软件升级的流程 1、获取软件版本 登录新华三官网&#xff08;首页>产品支持与服务>文档与软件>软件下载&#xff09;&#xff0c;将指定的软件版本下载至本地。 无线路由器-无线接入点-无线控制器-新华三集团-H3C 官网软件下载公共账号密码&#xff1a;账号&#x…

c语言刷题(第8周)

输入整数m,n&#xff08;m&#xff1c;n&#xff09;&#xff0c;输出[m,n]之间所有能被3&#xff0c;不能被4整除的所有数并求和&#xff0c;输出时每行显示5个数。 题干输入整数m,n&#xff08;m&#xff1c;n&#xff09;&#xff0c;输出[m,n]之间所有能被3&#xff0c;不…

C++进阶篇2---多态

1.多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是当不同的对象&#xff0c;去完成某个行为&#xff0c;会产生不同的状态 举个例子&#xff1a;同样是吃饭&#xff0c;狗吃狗粮&#xff0c;猫吃猫粮&#xff0c;不同的对象&#…

nodejs+vue大学生社团管理系统

通过软件的需求分析已经获得了系统的基本功能需求&#xff0c;根据需求&#xff0c;将大学生社团管理系统平台功能模块主要分为管理员模块。管理员添加社团成员管理、社团信息管理&#xff0c;社长管理、用户注册管理等操作。 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1…

asp.net社区医疗辅助诊断网站系统VS开发sqlserver数据库web结构c#编程

一、源码特点 asp.net社区医疗辅助诊断网站系统 是一套完善的web设计管理系统&#xff0c;系统采用mvc模式&#xff08;BLLDALENTITY&#xff09;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver200…

spring懒加载

简介 Spring默认会在容器初始化的过程中&#xff0c;解析xml或注解&#xff0c;创建配置为单例的bean并保存到一个map中&#xff0c;这样的机制在bean比较少时问题不大&#xff0c;但一旦bean非常多时&#xff0c;spring需要在启动的过程中花费大量的时间来创建bean &#xff0…

Flink学习笔记(四):Flink 四大基石之 Window 和 Time

文章目录 1、 概述2、 Flink 的 Window 和 Time2.1、Window API2.1.1、WindowAssigner2.1.2、Trigger2.1.3、Evictor 2.2、窗口类型2.2.1、Tumbling Windows2.2.2、Sliding Windows2.2.3、Session Windows2.2.4、Global Windows 2.3、Time 时间语义2.4、乱序和延迟数据处理2.5、…

Git(一)Windows下安装及使用Git Bash

目录 一、简介1.1 什么是Git&#xff1f;1.2 Git 的主要特点1.3 什么是 Git Bash&#xff1f; 二、下载三、安装3.1 同意协议3.2 选择安装位置3.3 其他配置&#xff08;【Next】 即可&#xff09;3.4 安装完毕3.5 打开 Git Bash 官网地址&#xff1a; https://www.git-scm.com/…