FMath::Sin()

김민수·2025년 1월 22일

언리얼 C++

목록 보기
20/32

sin(사인) 함수는 삼각 함수의 하나로, 특정 각도에 대한 y축 값(단위 원 상에서)을 반환한다. 이 함수는 주기적이고 부드러운 곡선(사인파)을 만들어내며, 각도를 입력으로 받아 -1에서 1 사이의 값을 출력한다.


1. sin의 기본 개념

수학적 정의

  • sin(θ)는 단위 원에서 각도 θ에 해당하는 점의 y좌표를 의미한다.
  • θ(세타)는 보통 라디안 단위로 입력된다.

단위 변환:

  • 라디안 → 도(degree): 라디안 = 도 × π / 180
  • 도 → 라디안: 도 = 라디안 × 180 / π


2. sin 함수

언리얼 엔진에서는 FMath::Sin(C++)를 사용해서 사인 값을 계산할 수 있다.

  • 입력: 라디안(각도 x π / 180)
  • 출력: -1 ~ 1 사이의 값
#include "Math/UnrealMathUtility.h"

float Radian = PI / 2; // 90도 (라디안)
float SinValue = FMath::Sin(Radian); // 결과: 1.0


3. 주요 특징

1) 출력 값의 범위

  • -1 ~ 1 사이의 값을 반환한다.
  • 예) sin(0) = 0, sin(π/2) = 1, sin(π) = 0, sin(3π/2) = -1

2) 주기성

  • sin 함수는 2π(360도)마다 값을 반복한다.
  • 이를 통해 주기적인 애니메이션이나 진동 효과를 구현할 수 있다.

3) 부드러운 곡선

  • 사인 함수는 부드러운 곡선을 그리기 때문에 움직임이나 전환을 자연스럽게 만든다.

4. sin 함수의 활용 사례

1) 주기적인 움직임

sin 함수는 주기적으로 값을 변화시키므로, 캐릭터의 점프 애니메이션이나 오브젝트의 상하 이동 등 반복적인 움직임을 구현할 수 있다.

float Time = GetWorld()->GetTimeSeconds(); // 게임 시간
float Amplitude = 50.0f; // 진폭
float Frequency = 1.0f; // 주파수

FVector NewLocation = StartLocation;
NewLocation.Z += Amplitude * FMath::Sin(Frequency * Time);
SetActorLocation(NewLocation);

오브젝트가 Z축을 따라 부드럽게 상하로 움직인다.


2) 파동 효과

물결 모양의 파동을 구현할 때도 sin 함수가 유용하다. 예를 들어, 물리적인 파동이나 시각적 이펙트를 구현할 때 사용할 수 있다.

float Time = GetWorld()->GetTimeSeconds();
float Amplitude = 20.0f; // 파동의 높이
float Frequency = 2.0f; // 파동의 속도

for (int32 i = 0; i < NumberOfPoints; ++i)
{
    float X = i * 50.0f; // 점의 X 위치
    float Z = Amplitude * FMath::Sin(Frequency * Time + X); // 파동 계산
    Points[i].Z = Z;
}

X축을 따라 사인파 모양의 물결이 생성된다.


3) 색상 변화
sin 함수는 0~1 사이로 변환하면, 색상이나 밝기의 부드러운 변화를 구현할 수 있다.

float Time = GetWorld()->GetTimeSeconds();
float Brightness = (FMath::Sin(Time) + 1) / 2.0f; // 0~1로 변환

FLinearColor Color = FLinearColor::LerpUsingHSV(FLinearColor::Red, FLinearColor::Blue, Brightness);
MyMaterialInstance->SetVectorParameterValue("BaseColor", Color);

빨간색에서 파란색으로 부드럽게 색상이 변환된다.



5. 주의사항

  1. 입력 값은 라디안

    • sin 함수는 입력 값으로 라디안을 요구한다. 도(degree)를 입력하려면 DegreesToRadians 함수를 사용하여 변환해야 한다.
  2. 주기적인 움직임 제한

    • sin 함수는 무한히 반복되므로, 특정 조건에서 멈추거나 범위를 제한하는 로직이 필요할 수 있다.
  3. 값의 스케일 조정

    • 기본적으로 -1 ~ 1의 값을 반환하므로, 원하는 범위로 변환하려면 스케일 조정이 필요하다.
float ScaledValue = FMath::Sin(Time) * Amplitude + Offset;
profile
안녕하세요

0개의 댓글