UE Gameplay入门51(相机视锥空间的计算方法推导)

article/2025/3/17 9:33:52

非常感谢匿名大哥一直对我的支持,本文内容由他赞助
在这里插入图片描述


#1. 视锥(Frustum)是什么
在这里插入图片描述
在相机的近裁剪面和远裁剪面之间的渲染范围内的空间叫做视锥空间(Frustum),通常情况下我们是不需要处理,但
当下比较流行动态遮挡剔除技术,只渲染视锥空间里面物体,再配合LOD等级来最大化效果,可以最小使用设备机能
Unity的FOV和Unreal的FOV有些区别
Unity的FOV是指视锥空间的张开角度,好比人眼睛的开闭角度
Unreal的FOV是指视锥空间的范围角度,基于水平面来伸开的


#2. 计算视锥需要的参数
在这里插入图片描述
相机自身的2个参数:FieldOfView(FOV)和Aspect Ratio宽高比
在这里插入图片描述
一般情况下还需要配合摇臂一起使用,Target Arm Length
CameraSpringArm默认延展的长度是反向距离,所以需要减掉forward反向的摇臂长度


#3. 计算方法
在这里插入图片描述
使用0为原点,视角FOV为90度,摇臂300米来进行推导
第一个有效计算三角形,图中绿色部分
一个角是90度,另外一个角度是45度的等腰三角形
这是视锥空间中有效的计算三角形,总计2个可用,分别位于左右两边,我们已知了一个角度和一条边

因为视锥空间是真3维空间,完全是在空间中计算的,通常情况下3维度空间的计算我们可以转为
2维空间来处理,比如玩家移动,此时朝上的轴向是固定的
在完全3维空间中计算,我们需要找投影,只有投影的向量才是有效的(相机也是投影成像)
找投影需要找一个可靠的平面来进行投影,需要是相互垂直的平面,可以构成勾股定律

计算一个有效中心点
在这里插入图片描述

原点:(0,0,0)
理论点:(300,300,0) - 摇臂(300,0,0)
未知中心点:(0, 300, 0)

在这里插入图片描述

获取相机的宽高比aspect ratio:1.5 width/height
300/1.5 = 200
未知顶点1:(0,300,200)
未知顶点1:(0,300,-200)


#4. 显示相机的视锥空间
有两种方法可以显示相机的视锥空间,编辑器显示或者代码显示
> 编辑器显示
在这里插入图片描述

> 使用UDrawFrustumComponent来显示

DrawFrustum = CreateDefaultSubobject<UDrawFrustumComponent>(TEXT("DrawFrustum"));
DrawFrustum->SetupAttachment(CameraBoom, USpringArmComponent::SocketName);
DrawFrustum->FrustumAspectRatio = FollowCamera->AspectRatio;
DrawFrustum->FrustumAngle = FollowCamera->FieldOfView;
DrawFrustum->FrustumStartDist = 10.0f;
DrawFrustum->FrustumEndDist = 1010.0f;

代码显示的好处是可以在任意位置显示,编辑器默认跟随相机显示


#5. 代码绘制DebugLine
在绘制之前,我也不知道能不在空间中把相机的视锥边缘绘制出来,最关键的是如果我们不做,
那么功能一定是不能完成的,因此我们应该尝试迈出第一步,其中有3种常见情况,
分别是镜头默认在原点,镜头往上移动,镜头往下移动
> 镜头默认在原点
在这里插入图片描述
这种情况下,我们可以直接计算

//lv1.在原点,无旋转最简单的情况下
//1.通过角度计算对边(半边)
//2.通过比例计算上下顶点
//3.计算其余的两点
void AViewFrustumCharacter::DrawFrustumPlane(float Dist)
{float Angle = FollowCamera->FieldOfView / 2;float ToRadians = FMath::DegreesToRadians(Angle);float Tan = FMath::Tan(ToRadians);float HalfWidth = Tan * Dist;float AspectRatio = FollowCamera->AspectRatio;float HalfHeight = HalfWidth / AspectRatio;GLog->Logf(TEXT("Tan:%f Angle:%f HalfWidth:%f HalfHeight:%f"), Tan, Angle, HalfWidth, HalfHeight);FVector RightUpPoint = FVector(0, HalfWidth, HalfHeight);FVector RightBottomPoint = FVector(0, HalfWidth, -HalfHeight);FVector LeftUpPoint = FVector(0, -HalfWidth, HalfHeight);FVector LeftBottomPoint = FVector(0, -HalfWidth, -HalfHeight);DrawDebugLine(GetWorld(), RightUpPoint, RightBottomPoint, FColor::Green, true, -1, 0, 5);DrawDebugLine(GetWorld(), LeftUpPoint, LeftBottomPoint, FColor::Green, true, -1, 0, 5);DrawDebugLine(GetWorld(), LeftUpPoint, RightUpPoint, FColor::Green, true, -1, 0, 5);DrawDebugLine(GetWorld(), LeftBottomPoint, RightBottomPoint, FColor::Green, true, -1, 0, 5);
}

> 镜头左右有旋转
在这里插入图片描述
这种情况下,需要计算旋转之后的偏移,我们可以直接使用集成的API来计算
我直接在Google上找到了解决办法
在这里插入图片描述

//lv2.相机有旋转,只有左右旋转的情况下
void AViewFrustumCharacter::DrawFrustumPlaneEx1(float Dist)
{float Angle = FollowCamera->FieldOfView / 2;float ToRadians = FMath::DegreesToRadians(Angle);float Tan = FMath::Tan(ToRadians);float HalfWidth = Tan * Dist;float AspectRatio = FollowCamera->AspectRatio;float HalfHeight = HalfWidth / AspectRatio;GLog->Logf(TEXT("Tan:%f Angle:%f HalfWidth:%f HalfHeight:%f"), Tan, Angle, HalfWidth, HalfHeight);FVector RightUpPoint = FVector(0, HalfWidth, HalfHeight);FVector RightBottomPoint = FVector(0, HalfWidth, -HalfHeight);FVector LeftUpPoint = FVector(0, -HalfWidth, HalfHeight);FVector LeftBottomPoint = FVector(0, -HalfWidth, -HalfHeight);FRotator Rotation = GetActorRotation();FVector EulerAngle = Rotation.Euler();FVector NewRightUpPoint = RightUpPoint.RotateAngleAxis(EulerAngle.Z, FVector::UpVector);FVector NewRightBottomPoint = RightBottomPoint.RotateAngleAxis(EulerAngle.Z, FVector::UpVector);FVector NewLeftUpPoint = LeftUpPoint.RotateAngleAxis(EulerAngle.Z, FVector::UpVector);FVector NewLeftBottomPoint = LeftBottomPoint.RotateAngleAxis(EulerAngle.Z, FVector::UpVector);DrawDebugLine(GetWorld(), NewRightUpPoint, NewRightBottomPoint, FColor::Black, true, -1, 0, 5);DrawDebugLine(GetWorld(), NewLeftUpPoint, NewLeftBottomPoint, FColor::Black, true, -1, 0, 5);DrawDebugLine(GetWorld(), NewLeftUpPoint, NewRightUpPoint, FColor::Black, true, -1, 0, 5);DrawDebugLine(GetWorld(), NewLeftBottomPoint, NewRightBottomPoint, FColor::Black, true, -1, 0, 5);
}

> 镜头上下有旋转
在这里插入图片描述
上下旋转的时候,是反方向进行的

void AViewFrustumCharacter::DrawFrustumPlaneEx2(float Dist)
{float Angle = FollowCamera->FieldOfView / 2;float ToRadians = FMath::DegreesToRadians(Angle);float Tan = FMath::Tan(ToRadians);float HalfWidth = Tan * Dist;float AspectRatio = FollowCamera->AspectRatio;float HalfHeight = HalfWidth / AspectRatio;GLog->Logf(TEXT("Tan:%f Angle:%f HalfWidth:%f HalfHeight:%f"), Tan, Angle, HalfWidth, HalfHeight);FVector RightUpPoint = FVector(0, HalfWidth, HalfHeight);FVector RightBottomPoint = FVector(0, HalfWidth, -HalfHeight);FVector LeftUpPoint = FVector(0, -HalfWidth, HalfHeight);FVector LeftBottomPoint = FVector(0, -HalfWidth, -HalfHeight);FRotator Rotation = GetActorRotation();FVector EulerAngle = Rotation.Euler();// 上下的旋转是默认取反,下显示往上,上显示往下FVector NewRightUpPoint = RightUpPoint.RotateAngleAxis(-EulerAngle.Y, FVector::RightVector);FVector NewRightBottomPoint = RightBottomPoint.RotateAngleAxis(-EulerAngle.Y, FVector::RightVector);FVector NewLeftUpPoint = LeftUpPoint.RotateAngleAxis(-EulerAngle.Y, FVector::RightVector);FVector NewLeftBottomPoint = LeftBottomPoint.RotateAngleAxis(-EulerAngle.Y, FVector::RightVector);DrawDebugLine(GetWorld(), NewRightUpPoint, NewRightBottomPoint, FColor::Purple, true, -1, 0, 5);DrawDebugLine(GetWorld(), NewLeftUpPoint, NewLeftBottomPoint, FColor::Purple, true, -1, 0, 5);DrawDebugLine(GetWorld(), NewLeftUpPoint, NewRightUpPoint, FColor::Purple, true, -1, 0, 5);DrawDebugLine(GetWorld(), NewLeftBottomPoint, NewRightBottomPoint, FColor::Purple, true, -1, 0, 5);
}


http://chatgpt.dhexx.cn/article/K419YjT1.shtml

相关文章

怎样用计算机才能更快,如何让网速变快,详细教您怎么让电脑网速变快

电脑的用户会遇到网速变慢的情况&#xff0c;不足为奇&#xff0c;其原因是多方面的&#xff0c;必须逐一进行解决。不过对于新手来说&#xff0c;该方法将不可取。别依赖技术人员&#xff0c;那么怎么让电脑网速变快&#xff1f;下面&#xff0c;小编跟大家介绍让电脑网速变快…

台式计算机运行慢怎么样能提高速度,如何提高电脑的运行速度,让电脑快起来!...

原标题&#xff1a;如何提高电脑的运行速度&#xff0c;让电脑快起来&#xff01; 本人的笔记本电脑的已经使用了5年多了&#xff0c;经常出现卡顿&#xff0c;运行速度非常慢的情况&#xff0c;有时速度慢到无法忍受。以下是总结的解决电脑运行慢的几个方法&#xff0c;让自己…

电脑速度变快优化

1.加快系统启动速度  WindowsXP的启动速度比Windows2000要快30%左右&#xff0c;但相对于Windows98仍然要慢了不少&#xff0c;不过&#xff0c;我们可以通过优化设置&#xff0c;来大大提高WindowsXP的启动速度。加快系统启动速度主要有以下方法&#xff1a;尽量减少系统在启…

如何用计算机直接连接秒开服务器上网,三种方法让你实现电脑秒开!提升电脑开机速度就是这么简单!-怎么让电脑速度变快...

不少朋友常常抱怨自己的电脑开机速度太慢了&#xff0c;看着朋友或同事的电脑开机提示&#xff1a;开机用时XX秒&#xff0c;击败了全国百分之几的电脑用户&#xff0c;再看看自己的电脑光是开机就得几分钟&#xff0c;是不是砸了换新电脑的心情都有。 那么有没有办法让自己的电…

台式计算机运行慢怎么样能提高速度,怎么让电脑速度变快win7,win7运行速度提高90%的方法...

电脑的运行速度不仅跟电脑硬件配置高低有关&#xff0c;跟电脑系统也有一定的关联。那么怎样让电脑速度变快呢?下面分享的几条提升电脑速度的方法&#xff0c;有兴趣的朋友可以尝试下&#xff1a; 怎样让电脑速度变快? 1、加大运行内存&#xff1a; 如果你发现&#xff0c;你…

计算机网络速度怎么改,怎么让电脑网速变快? 公用网络怎么变快

【导读】怎么让电脑网速变快相关问题&#xff0c;下面191路由网小编为大家详细解答。 电脑在使用一段时间以后&#xff0c;上网速度就会明显变慢&#xff0c;有时甚至连网页都打不开。其实导致网速变慢的原因是多方面的&#xff0c;即有操作系统本身的原因&#xff0c;也有人为…

怎样让计算机加快速度,六大招教你把旧电脑恢复如新,速度提升N倍!-怎么让电脑速度变快...

旧电脑用久了难免会有点卡&#xff0c; 打开一个网页要等待很久&#xff0c; 操作的过程中出现卡顿&#xff0c; 导致数据丢失的情况也时常发生&#xff0c; 可能连打开office办公软件都非常慢&#xff01; 这其实是电脑垃圾太多了&#xff01; 电脑是我们的各种资料、信息生活…

笔记本计算机运行程序,这几招让你的笔记本电脑运行速度变快 必学技巧

很多电脑用户一直都被电脑慢的问题困扰着&#xff0c;而电脑大神根本不把电脑慢当做电脑问题&#xff0c;因为让电脑变快的方法有很多&#xff0c;而且操作都巨简单。提高电脑速度的方法也能很多而且很容易操作&#xff0c;一切的难&#xff0c;只是来源于你没有学过而已&#…

计算机如何配置速度快,怎么设置速度,教您怎么可以让电脑速度变快

在使用电脑的过程中&#xff0c;我们难免会需要使用电脑下载资源的情况&#xff0c;但是有用户发现在电脑在下载网上的时候&#xff0c;明明网络良好的情况下&#xff0c;却发现下载的速度依然很慢&#xff0c;那么这到底是怎么回事呢&#xff1f;该怎么去解决呢&#xff1f;下…

怎么样很快的速度锁定计算机,怎样让电脑速度变快

电脑的运行速度不仅跟电脑硬件配置高低有关&#xff0c;跟电脑系统也有一定的关联。那么怎样让电脑速度变快呢?下面分享的几条提升电脑速度的方法&#xff0c;有兴趣的朋友可以尝试下&#xff1a; 怎样让电脑速度变快? 1、加大运行内存&#xff1a; 如果你发现&#xff0c;你…

电脑开机太慢!怎么让电脑开机速度变快?

电脑刚买来的时候&#xff0c;开机速度很快&#xff0c;用了一段时间后&#xff0c;开机速度越来越慢&#xff0c;甚至要等上好几分钟&#xff0c;这实在是太让人苦恼了!电脑开机太慢&#xff0c;怎么让电脑开机速度变快&#xff1f;其实想要解决这个问题很简单&#xff0c;我们…

计算机网络速度怎么改,教你调网速让电脑速度更快-怎么让电脑速度变快

你是不是会经常为自己的电脑运行卡慢而感受生气么&#xff1f;你是不是经常羡慕别人的电脑为什么可以飞速的运行呢&#xff1f;你是不是经常会为自己的网速为什么这么慢而感到疑惑呢&#xff1f;对于电脑系统比较不懂的你是不是觉得需要很专业的代码或者需要重新换台好一点的电…

计算机运行速度靠什么,怎么让电脑运行速度变快?一招搞定

如果电脑经常处于卡顿不流畅&#xff0c;卡、慢的状态&#xff0c;对经常使用电脑的人来说是非常糟糕的体验&#xff0c;那么有什么方法可以让电脑运行速度更快呢&#xff1f;今天就来教教各位可以让电脑速度变快的方法。 一、磁盘清理 很多时候正是因为电脑中的系统盘储存的文…

如何让电脑的开机速度变快?

文章目录 1.此电脑 → 鼠标右键 → 选择图中的高级系统设置。2.选择启动和故障恢复中的设置。3.将时间都调成0秒&#xff0c;并且点击确定&#xff0c;就可以让电脑的开机速度变快。 1.此电脑 → 鼠标右键 → 选择图中的高级系统设置。 2.选择启动和故障恢复中的设置。 3.将时间…

快速加速计算机的方法,电脑慢的快速解决办法 四种方法电脑速度变快10倍

电脑这种东西刚买来的时候用起来“刷刷”的&#xff0c;随着使用时间的增加&#xff0c;电脑就会开始莫名的变卡、变慢。作为一个资深的电脑大神&#xff0c;电脑慢这种问题根本就不能算电脑问题&#xff0c;让电脑变快的方法有很多&#xff0c;而且操作都巨简单&#xff0c;下…

如何让电脑运行速度变快

电脑的运行速度不仅跟电脑硬件配置高低有关&#xff0c;跟电脑系统也有一定的关联。那么怎样让电脑速度变快呢?下面分享的几条提升电脑速度的方法&#xff0c;有兴趣的朋友可以尝试下&#xff1a; 怎样让电脑速度变快? 1、加大运行内存&#xff1a; 如果你发现&#xff0c;你…

只需3步让你电脑瞬间变快10倍

【1】winR打开电脑的运行界面&#xff0c;输入cmd。 【2】出现黑框&#xff0c;在里面输入chkdsk&#xff0c;点击确定&#xff0c;自动开始运行。 如果出现[访问被拒绝,因为你没有足够的特权&#xff0c;你必须调用这个在提升模式下运行的实用程序] 点击搜索cmd&#xff0c;右…

提升电脑运行速度,10个秘笈,让你的win10飞起来

Windows10比以前的操作系统功能强大&#xff0c;运行速度快。 通过一些技巧&#xff0c;可以优化其性能&#xff0c;使它运行地更快。下面是10个提高win10电脑运行速度的绝招&#xff0c;想成为电脑高手的你&#xff0c;要注意点收藏了&#xff01; 1.卸载垃圾软件 购买电脑时&…

常见的几种锁

1.悲观锁 for update 悲观锁认为每次查询数据数据都会造成数据的更新或者丢失问题&#xff0c;所以每次查询都会加上排它锁。 如图所示&#xff0c;当两条线程同时访问该sql语句时&#xff0c;可能会造成脏读数据user_money为原来的两倍&#xff08;假设线程一执行完第一句等待…

java中都有哪些锁?

相信大家在学习java的过程中, 一定听到过很多, 关于java中的锁 , 但这些锁并不完全都是指一把真正的锁, java中的锁有的是指锁的实现, 而有的指的是锁的特性, 下面来介绍 目录 乐观锁与悲观锁 死锁 可重入锁 读写锁 分段锁 自旋锁 共享锁与独占锁 AQS 公平锁与非公平锁…