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 효과를 추가 해 준다.










댓글