전체 글 403

[UE4] Around Attack 기능(FireBall, IceBall), Rotate Vector Around Axis

🔥 Around Attack 기능 마법사의 공격 기능 중 플레이어의 주위(Around)를 원형으로 돌면서 FireBall 또는 IceBall을 띄워 공격하는 기능을 만들어보았다. ❄️ Ball의 회전 Tick 이벤트를 호출하여 플레이어 주면을 회전하는 Ball의 각도를 계속 증가시켜주었다. 방향의 음값을 가리키는 Negative(bool형) 변수가 False이면 시계방향으로 회전하고, True이면 반시계방향으로 회전하도록 구현하였다. Tick 호출마다 Speed 변수에 Deta Time을 곱하고 Angle값을 더하여 매 프레임마다 각도가 더해지거나, 음의 값이라면 감산되도록 구현하였다. ❗지속적인 각도 증가/증감 시 유의사항 앵글을 계속 감산/가산하며 시간이 지나면 각도가 360도 혹은 -360도를 지나..

[UE4] 순간이동 구현 시 나타나는 문제점 (Get Scaled Capsule Half Height, 블로킹 볼륨)

💥 순간이동 구현 시 나타나는 문제점 - 1 🔹플레이어의 몸통이 땅에 박힌다 마법사의 순간이동 기능을 구현하고 나서 가끔씩 순간이동 시 플레이어의 몸통 절반이 땅에 박힐때가 있다. 이는 플레이어의 중심점이 허리에 위치했는데, 순간이동하려는 땅의 z좌표가 플레이어의 중심점 z좌표보다 아래로 내려가는 순간 중심점이 땅의 z좌표에 맞춰져 허리가 박힌것처럼 보인다. 일반적으로 중심점이 땅보다 살짝 위에있으면 충돌체가 자동으로 땅위에 올려서 크기를 맞춰 배치하여 정상적인 출력이 가능한데, 어쩌다 중심점이 땅보다 밑에 한번 찍히는 경우 버그가 발생하게 된다. 이를 해결하는 방법은, 단순히 중심점 만큼 플레이어의 위치를 땅위로 올려주면 된다. X, Y 좌표는 그대로 사용하면 되고 높낮이 조절인 Z값만 다시 조절해주면..

[BattleProject] Enemy 그룹화

https://youtu.be/n-ZrKjSSd2k 작업일지 진행중인 작업 (문제점) - 공격중인 타겟이 죽었을 때 추적 범위 내 타겟 재설정 기능 구현 - Enemy 그룹 전투 구현 - 같은 그룹간 공격 시 데미지 입히지 않도록 구현 진행 예정 작업 - 문제점 해결 - 플레이어 방어 구현 - 플레이어 반격 구현 진행 완료 작업 1. 일정 반경 내 플레이어 들어오면 타겟 설정 및 추격 - 추격의 시작과 끝에 따라 Enemy 무기 장착/해제 2. 일정 반경 내 플레이어 들어오면 콤보 공격 - 콤보 공격 중 범위 밖으로 나갈 시 공격 중단 - Enemy 공격 중 플레이어 공격 시 애니메이션 초기화 상태 수정 + 콤보 이어서 공격 - 플레이어와 Enemy의 체력 감소 (데미지) 및 죽음 구현 3. Enemy ..

[C++] 디폴트 생성자, NULL, 포인터와 객체, 위치 지정 new

디폴트 생성자 - 사용자가 어떠한 생성자도 제공하지 않으면, C++가 디폴트 생성자를 제공한다. - Klunk::Klunk() {} // 암시적 디폴트 생성자 - 디폴트 생성자는 단지 객체를 만들면 항상 생성자가 호출되기 때문에 필요한 것이다. NULL, 0, nullptr - NULL은 여러 개의 헤더 파일에 0으로 정의되어 있는 기호 상수이다. 포인터와 객체 요약 객체를 지시하는 포인터 String* glamour; 기존의 객체를 지시하는 포인터 String* first = &sayings[0]; new를 사용한 새 객체 생성 String* favorite = new String(sayings[choice]); // String(const String & ) 생성자 호출 String* gleep = ..

📚책읽기 2023.02.06

[DX] 지면의 높이 구하기 2 (D3DXIntersectTri 함수), Raycast/Picking

🎢 지면의 높이 구하기 2 저번에는 같은 크기의 그리드 지면에서 높이를 구하는 방법을 공부하였다. 이번에는 정규화되어있지 않고 서로 다른 크기의 그리드 지면에서 높이를 구하는 방법을 알아보자. 🚩 D3DXIntersectTri 지면의 크기가 다른 경우에는 "삼각형 충돌"을 이용하여 높이를 구할 수 있다. 먼저 "반직선"과 "삼각형 충돌"의 수식이 필요하다. 해당 수식은 D3DXIntersectTri 함수를 이용하여 구할 수 있다. D3DXIntersectTri 함수는 "Start" 지점과 충돌을 검출할 "방향(Direction)"이 필요하다. 직선은 시작지점과 끝지점이 모두 정해져있는 선분을 말하고, 반직선은 시작지점은 존재하고, 어느 방향으로 나갈지 방향만이 존재하고 끝지점이 정해져있지 않은 선분이다...

🎨DirectX 2023.02.06

[DX] 지면의 높이 구하기, 경사 오르기

🎢 지면의 높이 구하기 플레이어가 경사가 있는 땅을 올라가는것을 구현하기 위해선 바닥의 높이 값을 계산할 수 있어야 한다. 바닥의 높이를 구하는 데 가장 핵심적인 것은 출발지점에서 x축으로 특정 거리만큼 이동했을 때 그 이동한 비율을 계산해서 y축으로는 얼만큼 이동하는지를 구하면 된다. 예를 들어 정점 (0,0)에서 x로 1만큼 올라갔다고 하면 y로도 1만큼 올라가서 (1,1)에 위치하게 된다. 또 x로 0.5만큼 갔을때 y는 0.5만큼 갔을것이다. 이러한 원리를 이용해서 얼만큼 갔는지 비율만 알면 플레이어가 움직일 경사를 구할 수 있다. 플레이어가 출발지(x, y)에서 V0까지 얼마만큼 갔는지를 아는 방법은 (x - V0.x)를 구하면 된다. 여기에 V0부터 V2까지의 길이에 비례해서 (V2 - V0)..

🎨DirectX 2023.02.05

[DX] 음영 효과 (Light Direction)

💡 음영 음영을 구현하기 위해선 어느 방향에서 빛이 내리쬐고 있는지 Light Direction이 필요하다. 음영을 구현하는데 노멀벡터가 필요했던 이유는 Light Direction과 내적하기 위함이다. 📐 내적의 성질 내적은 "|A| |B| cosθ"를 적용하는데, 방향 벡터의 크기를 1로 잡는다고 하면 결과는 cosθ 만 나오게 된다. 즉, 벡터 A와 벡터 B가 이루는 내각이 cosθ 이다. 이러한 내각의 크기를 이용하여 태양이 위치한 각도와 사람이 위치한 각도에 따라 내적값이 변화하는 원리를 적용시켜보았다. 내적의 성질에 따르면 태양과 사람이 수직일수록 밝은(1에 가까운)값이 나오고, 태양이 땅과 가까울수록 사람과 직각이되어 가장 어두운(0에 가까운)값이 나온다. 즉, 태양을 Light Direct..

🎨DirectX 2023.02.05

[DX] 노멀 벡터(Normal Vector)

🔀 노멀 벡터(Normal Vector) 조명/음영을 구현하기 위해선 노멀 벡터라는 개념을 잘 알아야한다. 💡 Normal 이란? 그리드가 있다면 1칸만 가져다 빼보자. 그럼 하나의 사각형은 두개의 삼각형으로 그려져 있다. 이때 (V0→V2)로 가는 벡터 하나와 (V0→V1)으로 가는 벡터 하나를 두고, 두 벡터에 수직하는 벡터가 바로 노멀 벡터이다. 두 벡터에 수직하는 벡터를 만드는 방법은 "외적"을 이용하면 된다. (과거에 이미 카메라에서 위 벡터와 전방 벡터을 외적해서 두 벡터에 수직하는 오른쪽 벡터를 만든적이 있다) 즉, 노말 벡터를 구하려면 A (V0→V1), B(V0→V2) 두 A,B벡터에서 수직하는 벡터를 외적으로 구하면 된다. A 벡터와 B 벡터를 만드는 방법 아래와 같다. 벡터 A = V..

🎨DirectX 2023.02.05

[DX] 높이맵

📚 높이맵 지금까지는 2D 좌표계에서 x축과 z축으로만 그리드를 만들고 y값을 0으로 설정하였다. 이번에는 이러한 y값을 0이 아닌 높이값을 할당하여 평평한 2D 그리드에서 입체적으로 y값이 들쭉날쭉한 3D 그리드로 출력하는 방법을 공부하였다. Texture의 픽셀 하나에는 r,g,b,a 를 갖는 색상값이 존재하는데 그 값은 0~1까지의 범위를 갖는다. 정규화된 범위에 255를 곱하면 0부터 255로 범위가 늘어나게 되어, Texture의 픽셀 범위가 256 * 256이 된다. 이후 Texture에 있는 0번째 픽셀이 그리드의 0번째 y값이 되고 Texture의 1번째 픽셀은 그리드의 1번째 값이 된다. 이렇게 Texture에서 픽셀 값을 꺼내다가 높이를 만들어서 생긴 맵을 높이맵이라고 한다. 그렇다면 ..

🎨DirectX 2023.02.04

[DX] Texture Sampler (Map.Sample 함수), SamplerState(Address/Filter), 선형보간

🎨 Texture Sampler 쉐이더를 이용하여 Texture를 출력할 때 픽셀 쉐이더 함수에서 Map.Sample(SamplerState, input.Uv) 함수를 수행하였다. Sample은 uv의 비율에 따라 정점에 이미지를 잘라서 붙여주는, 발라주는 역할을 수행한다. 즉, Map.Sample 함수에 들어가는 uv 값이 (0,0) ~(1,1)이면 다 출력되고 (0,0) ~ (0.5,0.5)이면 절반만 출력될 것이다. 또한 원래 이미지를 0부터 1까지 출력해야 온전한 이미지가 출력되는데, 0부터 0.5까지만 출력하면 0.5크기에 맞춰서 이미지가 확대된다. 다른 예시로는 화면의 크기가 (100, 100)일때 이미지가 (50, 50)이라면 이미지가 100만큼 확대되어 붙어질 것이다. 반대로 이미지가 (2..

🎨DirectX 2023.02.04

[DX] UV 좌표계 (Texture 출력)

📚 UV 좌표계 (2D) 가로로 가는 좌표 : U 세로로 가는 좌표 : V 기존 좌표계 UV 좌표계 DirectX에서 Texture를 출력하기 위해서 유용하게 사용되는 것이 UV 좌표계이다. UV좌표는 비율이다. 정점에서 다른 정점까지의 거리 비율이기 때문에 항상 0~1값을 가진다. 즉, Normalize 되었다고 볼 수있다. 색상값(RGB)은 256이기 때문에 (0~255) 값을 사용한다. 근데 그래픽 프로그래밍에서는 색상값도 비율로 계산해서 255값으로 나눈 Blue(0, 0, 1) 값을 사용한다. (0~1값으로 변환하면서 조금은 수치가 달라지긴 하는데 게임 만들때 엄청나게 정확한 소수점 수치까지 다 필요한경우는 거의 없어서 신경쓰지 않는다) 또한 UV좌표는 2D여서 z축이 존재하지 않는다. 따라서 ..

🎨DirectX 2023.02.04

[DX] 공간변환, D3DXVec3TransformCoord/D3DXMatrix3TransformNormal

🎪 공간변환 공간변환에 사용되는 mul 함수는 mul(input.position, world) 라고 작성되었을 때 position의 값을 world로 변환하겠다라는 의미로 사용된다. 기존의 position이 (0, 0, 0)이었다면 world공간의 x축으로 10만큼 이동한 결과는 position(10, 0, 0)이 될 것이다. 이런식으로 position의 값을 world의 공간으로 변환해 주는것이 mul이다. 이러한 mul 함수는 쉐이더의 명령이고 DirectX에도 같은 기능을 수행하는 명령이 있다. ⭐ D3DXVec3TransformCoord(Vector, Matrix) / D3DXMatrix3TransformNormal(Vector, Matrix) 두 함수의 차이는 D3DXVec3TransformCo..

🎨DirectX 2023.02.04
728x90