๐ก C++๋ก ์กํฐ์ Transform์ ์กฐ์ํด๋ณด์.
FRotator์ ํ๊ณ๋ก ์ธํ ์กํฐ์ ํ์ ์ ๋ํด์ ๊ฐ์ ์ ํด๋ณด๊ฒ ์ต๋๋ค.
1. C++ ์ฝ๋๋ก ์กํฐ ์์ฑ
2. ์กํฐ Transfrom ์กฐ์
3. ์กํฐ ํ์ ๊ฐ์
FRotator๋ ์ค์ผ๋ฌ ๊ฐ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ํตํด ๊ณ์ฐ์ ํ์ฌ -90 ~ 90๋ ์ฌ์ด๋ก ๋ฒ์๊ฐ ์ ํ๋ฉ๋๋ค.
์ด๋ ์ง๋ฒ ๋ฝ (Gimbal Lock)์ผ๋ก ์ธํ์ฌ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋๋ค.
๊ธฐ์กด ์ฝ๋
void AMyActor::Rotate(float DeltaTime)
{
currentRotation = GetActorRotation();
currentRotation += rotateSpeed * DeltaTime;
SetActorRotation(currentRotation);
}
3์ฐจ์ ๊ทธ๋ํฝ์์ ํ์ ์ ํํํ ๋, ํ๋ ฌ ๋์ ์ฌ์ฉํ๋ ์ํ์ ๊ฐ๋ ์ผ๋ก 4๊ฐ์ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ณต์์ ์ฒด๊ณ์ ๋๋ค.
ํ๋ ฌ์ ๋นํด ์ฐ์ฐ ์๋๊ฐ ๋น ๋ฆ
๋๋ค.
์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ํ ์ ์ต๋๋ค.
์ค๋ฅ๊ฐ ๋ ํ๋ฅ ์ด ์ ์ต๋๋ค.
์ฟผํฐ๋์ธ๋ ์ง๋ฒ๋ฝ(Gimbal Lock)์ ์์ ํ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค.
ํ์ง๋ง ์ค์ผ๋ฌ ๊ฐ์ ์ฌ์ฉํด ํ์ ์ ํํํ ๋ ๋ณด๋ค ์ง๋ฒ๋ฝ ๋ฌธ์ ๋ฅผ ์ต์ํํ ์ ์์ต๋๋ค.
FRotator๋ก ๋ฐ์์จ ์กํฐ์ ์์น๋ฅผ FQuat()๋ก ๋ณํํด์ค๋๋ค.
๊ทธ ํ FQuat์ MakeFromEuler๋ฅผ ํตํด DeltaRotation์ ๋ง๋ญ๋๋ค.
์ด๋ ๋ถ๋ ์์์ ์ค์ผ๋ฌ ๊ฐ๋์ ๋ฒกํฐ๋ฅผ ์ฟผํฐ๋์ธ์ผ๋ก ๋ณํํด์ฃผ๋ ํจ์์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ฌ ํ์ ๊ฐ๊ณผ ์ถ๊ฐํ ํ์ ๊ฐ์ ๋ํ ํ SetActorRotation์ ํ์ฉํ์ฌ ์ ์ฉํด์ค๋๋ค.
void AMyActor::Rotate(float DeltaTime)
{
currentRotation = GetActorRotation();
FQuat CurrentQuat = FQuat(currentRotation);
FQuat DeltaRotation = FQuat::MakeFromEuler(FVector(rotateSpeed.Roll, rotateSpeed.Pitch, rotateSpeed.Yaw) * DeltaTime);
FQuat NewRotation = DeltaRotation * CurrentQuat;
SetActorRotation(NewRotation.Rotator(), ETeleportType::None);
}
โ์ ์ฅ ํ ์ปดํ์ผโํ ํ ํ๋ ์ด๋ฅผ ํตํด ๊ฐ์ ํ์ธํด๋ณด๋ฉด, ์ด๋ฒ์๋ roll๊ฐ๋ 360๋๋ก ํ์ ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๊ฒ์ผ๋ก ์กํฐ์ Location๊ณผ Rotation์ C++์ ์ฌ์ฉํ์ฌ ์กฐ์ ํ๋ ๋ฒ์ ์์ ๋ณด์์ต๋๋ค.
Scale์ ๋ํด์๋ ๋์ผํ๊ฒ ์์ ์ ํด๋ณผ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
1. C++ ์ฝ๋๋ก ์กํฐ ์์ฑ
2. ์กํฐ Transfrom ์กฐ์
3. ์กํฐ ํ์ ๊ฐ์