【虚幻引擎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());
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的垃圾分类管理系统

基于SpringBootVue的垃圾分类管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven主要功能&#xff1a;包括前台和后台两部分、首页列表展示、垃圾分类、垃圾图谱、查看详…

基于PHP的图像分享社交平台

有需要请加文章底部Q哦 可远程调试 基于PHP的图像分享社交平台 一 介绍 此图像分享社交平台基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。平台角色分为用户和管理员。用户可注册登录&#xff0c;发布图像&#xff0c;修改个人信息&#xff0c;评论图像…

lua-web-utils和proxy程序示例

以下是一个使用lua-web-utils和https://www.duoip.cn/get_proxy的爬虫程序示例。每行代码后面都给出了详细的中文解释。 -- 导入所需的库 local http require("http") local ltn12 require("ltn12") local json require("json") local web_u…

Python 编写 Flink 应用程序经验记录(Flink1.17.1)

目录 官方API文档 提交作业到集群运行 官方示例 环境 编写一个 Flink Python Table API 程序 执行一个 Flink Python Table API 程序 实例处理Kafka后入库到Mysql 下载依赖 flink-kafka jar 读取kafka数据 写入mysql数据 flink-mysql jar 官方API文档 https://nigh…

软件工程17-18期末试卷

2.敏捷开发提倡一个迭代80%以上的时间都在编程&#xff0c;几乎没有设计阶段。敏捷方法可以说是一种无计划性和纪律性的方法。错 敏捷开发是一种软件开发方法论&#xff0c;它强调快速响应变化、持续交付有价值的软件、紧密合作和适应性。虽然敏捷方法鼓励迭代开发和灵活性&…

腾讯云国际-如何使用对象存储COS在 CKafka 控制台创建数据异步拉取任务?腾讯云代充

操作场景 Datahub 支持接入各种数据源产生的不同类型的数据&#xff0c;统一管理&#xff0c;再分发给下游的离线/在线处理平台&#xff0c;构建清晰的数据通道。 本文以 COS 数据为例介绍如何在 CKafka 控制台创建数据异步拉取任务&#xff0c;并对任务进行修改配置&#xf…

CVE-2023-46227 Apache inlong JDBC URL反序列化漏洞

项目介绍 Apache InLong&#xff08;应龙&#xff09;是一站式、全场景的海量数据集成框架&#xff0c;同时支持数据接入、数据同步和数据订阅&#xff0c;提供自动、安全、可靠和高性能的数据传输能力&#xff0c;方便业务构建基于流式的数据分析、建模和应用。 项目地址 h…

Python 中的 Pexpect

我们将通过示例介绍Python中的Pexpect。 Python 中的 Pexpect Python 是一种非常流行的语言&#xff0c;用于数据科学和机器学习。 它是一种非常强大的语言&#xff0c;因为 Python 具有可用于不同目的的内置库。 在这篇文章中&#xff0c;我们将研究Python中的pexpect。 Pex…

性能测试 —— Jmeter 常用三种定时器!

1、同步定时器 位置&#xff1a;HTTP请求->定时器->Synchronizing Timer 当需要进行大量用户的并发测试时&#xff0c;为了让用户能真正的同时执行&#xff0c;添加同步定时器&#xff0c;用户阻塞线程&#xff0c;知道线程数达到预先配置的数值&#xff0c;才开始执行…

k8s客户端配置

K8s客户端安装 前提 K8s服务部署成功&#xff0c;如下 角色 IP地址 操作系统 主机名 Kubernetes版本 master节点 172.16.4.167 CentOS 7.9 k8s-master01 v1.28.2 工作节点1 172.16.4.168 CentOS 7.9 k8s-worker01 v1.28.2 工作节点2 172.16.4.169 CentOS 7.9…

竞赛选题 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

2.7每日一题(分段函数不定积分)

1、分段函数不定积分是分段做&#xff0c;但分段得出原函数后必须写成C1&#xff0c;C2&#xff0c;C3&#xff1b;&#xff08;直接全部写成C是错误的&#xff09; 2、又因为原函数可导&#xff0c;可导必连续&#xff0c;所以根据原函数在分界点的连续性找到C1&#xff0c;C…

吃豆人C语言开发—Day2 需求分析 流程图 原型图

目录 需求分析 流程图 原型图 主菜单&#xff1a; 设置界面&#xff1a; 地图选择&#xff1a; 游戏界面&#xff1a; 收集完成提示&#xff1a; 游戏胜利界面&#xff1a; 游戏失败界面 死亡提示&#xff1a; 这个项目是我和朋友们一起开发的&#xff0c;在此声明一下…

Qt 窗口的尺寸

本文通过多个案例&#xff0c;详细说明关于Qt窗体尺寸的一些重要问题 默认尺寸 对于一个Qt的窗口&#xff08;继承于QWidget&#xff09;&#xff0c;获取其窗体尺寸的方法size()&#xff1b; 以一个Qt创建Qt Widgets Application项目的默认生成代码为基础&#xff0c;做如下…

实现基于 Jenkins 的多服务器打包方案

实现基于 Jenkins 的多服务器打包方案 在实际项目中&#xff0c;我们经常会遇到需要将一个应用程序或服务部署到不同的服务器上的需求。而使用 Jenkins 可以很方便地自动化这个过程。 设置参数 首先&#xff0c;我们需要设置一些参数&#xff0c;以便在构建过程中指定要部署…

Element UI + Vue 新增和编辑共用表单校验无法清除问题(已解决)

问题描述 在新增和编辑过程中大部分情况下 两个表单是一致的&#xff0c;而且编辑也有回显需要&#xff0c;所有绝大多数情况下 都是一个表单两个用处&#xff0c;但是随之而来出现了一个无法清除校验的问题&#xff0c;在先点击编辑后再点击新增会出现校验红字&#xff1a; …

防止消息丢失与消息重复——Kafka可靠性分析及优化实践

系列文章目录 上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析&#xff0c;打破面试难关 防止消息丢失与消息重复——Kafka可…

【Linux】进程优先级|进程并发概念|在vim中批量化注释

文章目录 前言tips——如何在vim中批量化注释进程更深度理解一、什么是进程优先级二、 为什么要有优先级三、Linux怎么设置优先级查看进程优先级的命令PRI and NI用top命令更改已存在进程的nice&#xff1a; 如何根据优先级开展调度呢&#xff1f;五、其他概念并发&#xff08;…

css四种导入方式

1 行内样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <h1 style"color: blue">我是标题</h1> </body> </htm…

【Objective-C】浅析Block及其捕获机制

目录 Block的基本使用Block的声明Block的实现Block的调用 Block作为形参使用Block作为属性使用给Block起别名Block的copy Block的捕获机制auto类型的局部变量__block浅析static类型的局部变量全局变量 其他问题 Block的基本使用 什么是Block&#xff1f; Block &#xff08;块…