最简单的 UE 4 C++ 教程 —— 绕轴旋转【二十六】

举报
ShaderJoy 发表于 2021/11/19 00:33:13 2021/11/19
【摘要】 原教程是基于 UE 4.18,我是基于 UE 4.25】 英文原地址 接上一节教程,在本教程中,我们将学习如何使用 RotateAngleAxis 函数。首先创建一个新的C++ Actor 类,并将其命名为 RotateAngleAxis 。在头文件中,我们将创建两个浮点变量和两个FVector 变量,并将它们设置...

原教程是基于 UE 4.18,我是基于 UE 4.25】

英文原地址

接上一节教程,在本教程中,我们将学习如何使用 RotateAngleAxis 函数。首先创建一个新的C++ Actor 类,并将其命名为 RotateAngleAxis 。在头文件中,我们将创建两个浮点变量和两个FVector 变量,并将它们设置为 EditAnywhere以便稍后在编辑器中编辑它们

下面是最终的头文件代码。

RotateAngleAxis.h


  
  1. #pragma once
  2. #include "CoreMinimal.h"
  3. #include "GameFramework/Actor.h"
  4. #include "RotatingAngleAxis.generated.h"
  5. UCLASS()
  6. class UNREALCPP_API ARotatingAngleAxis : public AActor
  7. {
  8. GENERATED_BODY()
  9. public:
  10. // Sets default values for this actor's properties
  11. ARotatingAngleAxis();
  12. protected:
  13. // Called when the game starts or when spawned
  14. virtual void BeginPlay() override;
  15. public:
  16. // Called every frame
  17. virtual void Tick(float DeltaTime) override;
  18. // declare our float variables
  19. UPROPERTY(EditAnywhere, Category = Movement)
  20. float AngleAxis;
  21. UPROPERTY(EditAnywhere, Category = Movement)
  22. FVector Dimensions;
  23. UPROPERTY(EditAnywhere, Category = Movement)
  24. FVector AxisVector;
  25. UPROPERTY(EditAnywhere, Category = Movement)
  26. float Multiplier;
  27. };

 在 .cpp 中,让我们首先为 actor 设置一些默认值。


  
  1. // Sets default values
  2. ARotatingAngleAxis::ARotatingAngleAxis()
  3. {
  4. // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
  5. PrimaryActorTick.bCanEverTick = true;
  6. Dimensions = FVector (300, 0, 0); ///< 旋转半径
  7. AxisVector = FVector (0, 0, 1);
  8. Multiplier = 50.f;
  9. }

我们所有的逻辑都在 Tick 函数中。在这个例子中,我们将使用一个固定的矢量点,所以每一帧我们都想通过将 NewLocation 设为固定的 FVector 来初始化我们的固定位置。

接下来,我们想要添加到 AngleAxis 变量中,该变量将指示 actor 应该旋转的角度。我们添加了 DeltaTime 乘以我们的 Multiplier 来平滑移动。如果 AngleAxis 大于或等于 360,我们将 AngleAxis 重置为 0。

接下来,我们将通过使用 RotateAngleAxis 函数从 Dimensions 位置(以它为半径旋转)来设置 RotateValue
这会返回将 actor 移动到下一个位置所需的单位数量。
RotateValue 的 X、Y 和 Z 值相应地添加到 NewLocation 变量中。
我们将把 RotateValue 和 AngleAxis 变量打印到屏幕上,以便实时查看这些值。

最后,用 SetActorLocation 将角色的位置设置为 NewLocation


  
  1. FVector RotateAngleAxis
  2. (
  3. const float AngleDeg, ///< 旋转的角度
  4. const FVector & Axis ///< 围绕的旋转轴
  5. ) con

Tick 函数的定义 


  
  1. // Called every frame
  2. void ARotatingAngleAxis::Tick(float DeltaTime)
  3. {
  4. Super::Tick(DeltaTime);
  5. FVector NewLocation = FVector (0,0,800);
  6. AngleAxis += DeltaTime * Multiplier;
  7. if(AngleAxis >= 360.0f)
  8. {
  9. AngleAxis = 0;
  10. }
  11. FVector RotateValue = Dimensions.RotateAngleAxis(AngleAxis, AxisVector);
  12. GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("RotateValue: %s"), *RotateValue.ToString()));
  13. GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("AngleAxis: %f"), AngleAxis));
  14. NewLocation.X += RotateValue.X;
  15. NewLocation.Y += RotateValue.Y;
  16. NewLocation.Z += RotateValue.Z;
  17. SetActorLocation(NewLocation, false, 0, ETeleportType::None);
  18. }

完整的 cpp 代码如下


  
  1. #include "RotatingAngleAxis.h"
  2. // Sets default values
  3. ARotatingAngleAxis::ARotatingAngleAxis()
  4. {
  5. // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
  6. PrimaryActorTick.bCanEverTick = true;
  7. Dimensions = FVector (300, 0, 0);
  8. AxisVector = FVector (0, 0, 1);
  9. Multiplier = 50.f;
  10. }
  11. // Called when the game starts or when spawned
  12. void ARotatingAngleAxis::BeginPlay()
  13. {
  14. Super::BeginPlay();
  15. }
  16. // Called every frame
  17. void ARotatingAngleAxis::Tick(float DeltaTime)
  18. {
  19. Super::Tick(DeltaTime);
  20. FVector NewLocation = FVector (0,0,800);
  21. AngleAxis += DeltaTime * Multiplier;
  22. if(AngleAxis >= 360.0f)
  23. {
  24. AngleAxis = 0;
  25. }
  26. FVector myCharacter = GetWorld()->GetFirstPlayerController()->GetPawn()->GetActorLocation();
  27. FVector RotateValue = Dimensions.RotateAngleAxis(AngleAxis, AxisVector);
  28. GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("RotateValue: %s"), *RotateValue.ToString()));
  29. GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("AngleAxis: %f"), AngleAxis));
  30. NewLocation.X += RotateValue.X;
  31. NewLocation.Y += RotateValue.Y;
  32. NewLocation.Z += RotateValue.Z;
  33. /// @note 仅公转
  34. ///SetActorLocation(NewLocation, false, 0, ETeleportType::None);
  35. /// @note 公转的同时还会绕自转
  36. FRotator NewRotation = FRotator(0, AngleAxis, 0); ///< pitch, yaw, roll
  37. FQuat QuatRotation = FQuat(NewRotation);
  38. SetActorLocationAndRotation(NewLocation, QuatRotation, false, 0, ETeleportType::None); ///< 立即移动 actor 到指定的位置并旋转。
  39. }

编译代码。将新 actor 拖放到游戏世界中。向 actor 添加一个静态网格组件(比如立方体)。当你按下 play 时,actor 会找到并绕着给定的矢量点旋转。。

运行效果如下

文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/119207396

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。