전체 글 (21) 썸네일형 리스트형 [게임수학] 충돌처리 (2 - Sphere, Capsule 충돌) Sphere 충돌검사AABB & SphereAABB 박스와 구의 충돌검사는 아주 간단하게 가능하다.위에 보이는 그림처럼 박스와 구가 있으면 구의 원점과 가장 가까운 박스 위의 한 점(D)을 찾은 다음해당 점과 구의 원점과의 거리가 원의 반지름보다 큰지 작은지 확인하면 끝이다.{ // 가장 가까운 점 찾기 vector3 closest = float3( clamp(sphere.center.x, aabb.min.x, aabb.max.x) clamp(sphere.center.y, aabb.min.y, aabb.max.y) clamp(sphere.center.z, aabb.min.z, aab.. [게임수학] 충돌처리 (1 - AABB, OBB 충돌) 더보기목차AABB 바운딩OBB 바운딩Sphere 바운딩Capsule 바운딩충돌검사AABBOBBSphereCapsule AABB (Axis-Aligned Bounding Box)AABB 박스는 모든 면이 법선이 좌표축과 일치하는 박스를 말한다.AABB 바운딩은 다음의 2가지 요소로 정의 가능하다중심점너비 (중심점에서 각 면까지의 거리) OBB (Oriented Bounding Box)OBB 박스는 AABB 박스에 회전값이 추가된 박스이다.즉 OBB 박스는 모든 면이 항상 법선의 좌표축과 일치하지는 않는다.따라서 OBB 박스 바운딩은 AABB의 요소에 회전값이 추가된다.중심점너비 (중심점에서 각 면까지의 거리)회전값 (쿼터니온) Sphere구의 바운딩은 다음 2가지 요소로 정의 가능하다.중심점반지름 Cap.. [Shader] Random 완전한 난수는 아니지만 랜덤처럼 보이는 값을 만들어주는 효과 float random (in vec2 st) { return frac(sin(dot(st.xy, float2(12.9898,78.233))) * 43758.5453123);} float main (float x) { float amplitude = 1.0; // 진폭 float frequency = 1.0; // 진동수 return amplitude * sin(x * frequency);}sin 함수는 어디에 어떤 값을 곱해주고 더해주느냐에 따라 다양한 변형을 가할 수 있는데 이번에는 위에서 보이는 것처럼 진폭과, 진동수를 적절하게 변형해 랜덤 효과를 만들 것이다. 즉 이 sin함수의 진동수와 진폭을 엄청나게 키우고.. [Shader] Value Noise Value Noisehttps://quattroro.tistory.com/35 float random (in float2 st) { return frac(sin(dot(st.xy, float2(12.9898,78.233))) * 43758.5453123);}float noise (in float2 st) { float2 i = floor(st); float2 f = frac(st); // 현재 자신의 위치를 포함한 셀의 각 꼭짓점의 랜덤값을 구한다. float a = value_random(i); float b = value_random(i + float2(1.0, 0.0)); float c = value_random(i + float2(0.0, 1.0)); f.. [Shader] Twist 소용돌이 모양으로 말려들어가는 효과float4 ps_main(VS_OUTPUT In){ float2 _TwistUvPos = float2(_TwistUvPosX,_TwistUvPosY); half2 tempUvTwist = In.TextureUV - _TwistUvPos; half percent = (_TwistUvRadius - length(tempUvTwist)) / _TwistUvRadius; half theta = percent * percent * _TwistUvAmount * 8.0; half s = sin(theta); half c = cos(theta); half beta = max(sign(_TwistUvRadius - length(tempUvTwist.. [Shader] CircleWave 원형으로 퍼져나가는 파도 효과 float4 ps_main(VS_OUTPUT In){ float2 uvWave = float2(0.5, 0.5) - In.TextureUV; float waveTime = _timeVal; float angWave = (sqrt(dot(uvWave, uvWave)) * _CircleWaveAmount) - (waveTime * _CircleWaveSpeed); In.TextureUV = In.TextureUV + uvWave * sin(angWave) * (_CircleWaveStrength / 1000.0);} 해당 셰이더로 변형되는 UV값을 x성분만 그래프로 나타내면 아래와 같은 모습이 된다. float angWave = (sqrt(dot(uvWav.. [Shader] Pinch float4 ps_main(VS_OUTPUT In){ float2 center = float2(0.5f,0.5f); float2 dP = In.TextureUV - center; float pinchInt = (3.14159265359 / length(center)) * (-_PinchAmount + 0.001); In.TextureUV = center + normalize(dP) * atan(length(dP) * -pinchInt * 10.0) * 0.5 / atan(-pinchInt * 5);} 핀치효과는 탄젠트 함수를 이용했던 어안렌즈와는 반대로 아크탄젠트 함수를 이용한다.여기도 어안렌즈와 마찬가지로 _PinchAmount에 (3.14 / length(center))를 곱해주면서 정규화시켜주고마지.. [Shader] FishEye 볼록한 어안렌즈 효과 float4 ps_main(VS_OUTPUT In){ float2 center = float2(0.5f,0.5f); float bind = length(center); float2 dF = In.TextureUV - center; float dFlen = length(dF); float fishInt = (3.14159265359 / bind) * (_FishEyeAmount + 0.001); In.TextureUV = center + (dF / (max(0.0001, dFlen))) * tan(dFlen * fishInt) * bind / tan(bind * fishInt);} 어안렌즈 효과는 탄젠트 함수를 이용한다.0~1로 이어지는 UV값을 아래 보이는 그래프처럼 변경해준다._F.. 이전 1 2 3 다음