首页 > 编程语言 >[19] C++网络通信开发

[19] C++网络通信开发

时间:2024-05-13 19:42:47浏览次数:30  
标签:网络通信 FVector 角色 19 C++ 余弦 方向 夹角 向量

Day1

 通过引入路径找到类型

根据角色进入方向开门(向量运算、几何概念、点乘)

  1. 向量的减法: OtherActor->GetActorLocation() - GetActorLocation() 这一部分是计算两个位置向量之间的差向量,即门的位置向量减去角色的位置向量,得到了一个从门指向角色的向量。

  2. 向量的归一化: V1.GetSafeNormal() 这一部分是将差向量归一化,即将向量的长度调整为1,这样做的目的是为了得到一个表示方向的单位向量,而不关心具体的长度。

  3. 点乘运算: FVector::DotProduct(GetActorRightVector(), V1) 这一部分是计算门的右侧向量与角色进入方向向量的点乘。点乘的结果可以用来判断两个向量之间的夹角关系,从而确定进入角色的位置相对于门的位置是在门的左侧还是右侧。

  4. 几何概念: 根据点乘的结果,代码确定了门的开启方向。如果点乘结果大于0,则进入角色在门的右侧,门应该向着负方向开启;如果点乘结果小于0,则进入角色在门的左侧,门应该向着正方向开启。这涉及到了几何中向量的方向和夹角的关系。

曲线的应用

向量点乘 计算夹角
2个夹角余弦值

计算角色移动的方向(点乘)

  1. 获取移动方向: 使用GetVelocity()方法获取角色的移动速度向量,并使用GetSafeNormal()方法将其归一化,以获取移动方向。

  2. 计算移动方向与角色正方向的夹角: 使用点乘运算FVector::DotProduct()计算移动方向向量和角色正方向向量的点乘结果,从而得到它们之间的夹角的余弦值。

  3. 将余弦值转换为角度: 使用反余弦函数FMath::Acos()将余弦值转换为夹角的弧度值,并将其转换为角度制。

  4. 根据移动方向与角色右侧向量的点乘结果调整角度方向: 如果移动方向向量与角色右侧向量的点乘结果小于0,则将计算得到的角度方向乘以-1,以确保角度方向的正确性。

FVector MoveDir = MyCharacter->GetVelocity().GetSafeNormal();
//移动速度与角色正方向夹角
float DotValue = FVector::DotProduct(MoveDir, MyCharacter->GetBaseAimRotation().Vector());
//反余弦 注意反余弦的单位是弧度,需要将弧度转为角度
Direction = FMath::Acos(DotValue) * 180 / 3.14f;
if (FVector::DotProduct(MoveDir, MyCharacter->GetActorRightVector()) < 0)
{
    Direction *= -1;
}
bIronsight = MyCharacter->IsIronsight();
//加速度方向和正方向的夹角 = 余弦
//反余弦

判断角色是否向前奔跑(点乘)

bool ALGCharacterBase::IsSprinting()
{
	if (GetHoldWeapon())
	{
		return bSprint
			&& !bIsCrouched
			&& FVector::DotProduct(GetVelocity().GetSafeNormal(), GetActorForwardVector()) > .9f;
	}
	return bSprint && !bIsCrouched;
}
  • GetVelocity().GetSafeNormal():获取角色当前的速度向量,并将其归一化,以得到角色的移动方向。
  • GetActorForwardVector():获取角色当前正前方的向量。
  • FVector::DotProduct():计算移动方向向量和正前方向向量的点乘结果。

如果这个点乘结果大于0.9(在1附近),那么可以理解为角色的移动方向与正前方向相近。这种检查可能用于一些游戏中的特定功能或者行为,比如判断角色是否在直线上高速移动,或者在进行某些特殊动作时的判断。

节点

API

HUD取角色指针 : GetOwningPawn();

Tips

  • 改组件关编译器
  • 常量都应该暴露成参数

标签:网络通信,FVector,角色,19,C++,余弦,方向,夹角,向量
From: https://www.cnblogs.com/Aquakinn/p/18189795

相关文章

  • golang进程通过共享内存和C++进程进行通信
    目录serverclientserverC++可以使用POSIX共享内存API来创建和管理共享内存server.cpp#include<fcntl.h>#include<sys/mman.h>#include<sys/stat.h>#include<unistd.h>#include<cstring>#include<iostream>constchar*S......
  • c++ union
    在C++中,`union`是一种特殊的数据结构,它允许在同一内存空间中存储不同类型的数据。`union`允许您定义一个变量,但这个变量可以存储多种不同类型的值,而不是只能存储一种类型的值。在任何给定时间,`union`中只有一个成员可以有值,所有其他成员都将保持未定义的状态。`union`的声......
  • HydroOJ 从入门到入土(19)导入题解和标程、题目数据统计(>=4.12.0)
    题解和std可以导入了,导出还会远吗?目录一、导入题解和标程1.目录结构2.测试结果3.第二次测试题目结构如下:测试结果:4.总结:关于题解:关于标程(std):去除.DS_Store的解决方法二、题目数据统计1.范围2.筛选选项3.无关紧要的小bug一、导入题解和标程新版本更新了这个功能,方......
  • c++ true_type与false_type
    std::true_type和std::false_type实际上是类型别名是两个类型(类模板)注意区分true_type与false_type与true和false区别true_type,false_type代表类型true,false代表值nmsp1::FalseTypemyfunc1();//返回假这种含义nmsp1::TrueTypemyfunc2();//返回真这种含......
  • 洛谷题单指南-动态规划3-P1880 [NOI1995] 石子合并
    原题链接:https://www.luogu.com.cn/problem/P1880题意解读:计算n堆石子合并的最小、最大得分,只不过这n堆石子是环形的,也就是首、尾也相邻,是区间DP的升级版-环形DP问题。解题思路:如果是常规区间DP的方法:对于n堆石子,考察区间的长度范围是1~n先枚举左端点i,范围是1~n再计算右......
  • c++-----declval
    std::declval基本概念和常规实例std::decval–C++新标准中出现的函数模板,没有函数体(只有声明、没有实现),无法调用,一般用于与decltype,sizeof等关键字配合来进行类型推导、占用内存空间计算等查看源码: add_rvalue_reference:是C++标准库中的类模板,他的能力是给进一个类型,它......
  • sqlserver2019安装
    说明:新版sqlserver安装分两部分:第一部分安装服务 第二部分安装管理工具 第一步:下载安装包 ed2k://|file|cn_office_professional_plus_2019_x86_x64_dvd_5e5be643.iso|3775004672|1E4FFA5240F21F60DC027F73F1C62FF4|/第二步:安装服务这里注意:    推荐第一种安......
  • C++:private继承
    平时我们使用类继承是这个画风:classchild:public::father{};表示子类child继承父类father,这里有个关键词"public",表示继承到的父类属性和方法为自己的public成员,这种情况下子类的对象或者说实例化是可以直接访问这些成员的 当改成classchild:private::father{};则......
  • 2024苏锡常镇高三二模19
    \(实际上不那么难\)......
  • 2024 年 5 月 12 日 母亲节 周日 晴 常(197 字)
    正文昨天玩到了凌晨3点,今天睡了一天……断断续续睡到12点起床,下午又从5点睡到了7点。我愿称之为睡神…….其它时间就是做工作日一直没时间做的杂事,比如洗衣服,刷鞋,换洗被套什么的,还挺花时间。用了得有两三个小时。所以昨天说的今天开摆,那是真的开摆了(笑......