UE5 -HLSL- 솟아라 나무나무
HLSL로 간단한 버텍스 애니메이션 만들기.
요약하면
정점을 오리진에 모으고 딜레이타임(5초)이후에 2초동안 기존 위치로 돌아오게 만든다.
로컬 좌표계로 구현 후 월드 좌표로 변환해 반한환다.
float Duration = 2.0;
float ResetTime = fmod(Time , 10000.0);
float DelayTime = 5.0;
float effectiveTime = max(ResetTime - DelayTime,0.0);
float progress = saturate(effectiveTime / Duration);
return (Position * progress) - Position;
회전 추가
float TotalRotAngle = 9.42;
float Rot = progress * TotalRotAngle;
float3 axis = float3(0,0,1);
float c = cos(Rot);
float s = sin(Rot);
float3 N = axis * dot(Position, axis);
float3 U = Position - N;
float3 P = U * c + cross(axis, U) * s;
float3 P1 = N + P;
float3 finalPos = lerp(float3(0,0,0), P1, progress);
float3 offset = finalPos - Position;
return offset;
TotalRotAngle 최종회전각을 540도로 선언해 주고 progress 와 곱해 실제 회전 각도(Rot)를 결정한다.
z축과의 내적에 z축을 곱해, Position의 z축(회전축) 방향 성분을 구하고, 이를 N으로 저장한다.
원래 위치(Position)에서 N을 빼서 회전 평면(U)을 구하고, 로드리게스 회전 공식인 U*cos(Rot) + (axis × U)*sin(Rot)를 적용해 회전된 평면 성분을 계산한다.
N과 회전된 평면 성분을 더해 최종 회전된 위치 P1을 구한 후, lerp를 통해 0 (원점)에서 P1까지 progress에 따라 보간하여 애니메이션 효과를 주고, 최종적으로 원래 Position과의 차이(offset)를 반환한다
float DurationXY = 2.1;
float DelayTimeXY = 5.13;
float progressXY1 = saturate(effectiveTimeXY / DurationXY);
float progressXY = smoothstep(0.0,1.0,progressXY1); //easyinout 효과
float3 finalPos =float3(lerp(0.0,P1.x,progressXY),lerp(0.0,P1.y,progressXY),lerp(0.0,P1.z,progress));
XY애니메이션 속도를 조절
조금 심심한 느낌이 있어 마지막으로 damping 효과를 추가 해 준다.
댓글
댓글 쓰기