fear2002의 등록된 링크

 fear2002로 등록된 네이버 블로그 포스트 수는 26건입니다.

System.Numerics.BigInteger [내부링크]

이번에 double로 된 수치의 한계치를 풀기 위해 BigInteger 변환 작업을 하였다. 상당히 무거운 녀석이다...

투영 변환 행렬 유도 [내부링크]

게임 그래픽에서는 여러 행렬 변환을 거치게 됩니다. 그 중에 투영 변환 행렬에 대해서 알아보겠습니다. 3D에서 카메라는 앞부분이 잘린 사각뿔 형태의 시야 영역을 사용합니다. 이를 절두체(frustum)라고 하며 6개의 평면으로 구성되어 있습니다. 이 절두체를 측면에서 단순화하여 보게 되면 아래 그림과 같습니다.위 그림에서 상이 맺히는 위치는 근평면이며 이를 모니터 화면 위치라고 할 수 있습니다. 모니터 화면의 위치는 시야각에 따라 달라지게 되고, 카메라로부터 상이 맺히는 지점(모니터 화면)까지의 거리를 초점 거리라고 합니다.모니터 화면에 어떤 점을 투영하려면 초점 거리를 알아야 한다. 이 초점 거리는 시야각과 모니터 화.......

Raytracing In PPM #3 [내부링크]

Chapter 6 : Antialiasing현재 출력된 이미지에는 안티 앨리어싱이 적용되어 있지 않습니다. 이를 해결하기 위해 현재 픽셀에 쏘는 레이 주변 0 ~ 1 픽셀의 색을 합산 후 이의 평균치를 구하여 해결하려고 합니다. 이 방식은 상당히 비효율 적이지만 빠른 시간 내에 쉽게 구현할 수 있습니다. 우선 카메라 클래스를 만들어 메인 코드를 깔끔하게 해보도록 하죠. 아래는 카메라 클래스입니다.기존에 mainProc.cpp 에 있었던 카메라와 관련된 내용을 가져와 모아놓은 클래스입니다. 별다른 설명은 필요하지 않을 것 같네요.이 다음에 drand48()이라는 함수가 있는데 이는 Linux 관련 메서드더군요. 그래서 utility.h 파일을 만들어 0.0 ~ 1.0을 반.......

Raytracing In PPM #4 [내부링크]

Chapter 8 : Metal현재 진행한 내용은 mainProc.cpp 에서 Color 메소드를 이용해 색상을 지정해 주었습니다. 하지만 이제는 재질을 분리하여 구현할 것입니다. 재질은 정말 여러가지가 있습니다. Metal도 재질의 일부분이죠. 이를 위해 material 클래스를 생성해 추상적인 메서드를 만듭니다. 이 메서드는 ray가 확산할 수 있는지 여부를 반환해주게 됩니다. 아래는 코드입니다.그리고 ray의 충돌 정보를 기록하는 구조체에 material도 기록할 수 있도록 변수를 추가해줍니다.이후에는 Lambertian 재질을 만들어 줄 것입니다. 우선 코드를 먼저 보도록 하죠.기존 mainProc.cpp에 있던 random_in_unit_sphere() 메서드를 material.h로 옮겼습니다.......

미리 컴파일된 헤더 (Precompiled Header) [내부링크]

이름 그대로 해석하자면 헤더파일을 미리 컴파일 해놓는 것입니다. 프로그램을 제작하다 보면 클래스는 많아지게 되고 그에 따라 컴파일 시간도 당연히 늘어나게 됩니다. 이러한 컴파일 시간을 조금이라도 절약하기 위해 미리 컴파일된 헤더를 사용합니다. 규모가 큰 프로젝트에서는 필수가 아닐까 싶네요.C++ 컴파일러의 컴파일 단위는 cpp입니다. 이 cpp 파일을 컴파일 할 때 include로 선언된 헤더 파일을 매번 파싱하게 됩니다. 간단한 소스 코드를 포함하는 것은 괜찮을 수 있지만, 규모가 커지면 당연히 방대한 소스를 가진 파일을 포함하게 되는 경우가 있습니다. 예를 들어 이러한 파일들을 A, B, C 클래스에서 include로 파싱하게 되.......

NGUI UILabel 줄임표(...) [내부링크]

Overflow 속성이 Clamp Content일 경우 UseEllipsis를 체크해주면 정해진 영역을 넘어갈경우 ...으로 표시가 된다.스크립트 제어 : UILable.overflowEllipsis = true;

코루틴에서 SetActive 제어시 렌더가 정상적으로 되지 않는 문제 [내부링크]

코루틴에서 NGUI와 관련된 오브젝트의 SetActive 제어시 깜빡이는 현상이 발생할 수 있다. yield reutnr null, wait for second 같은 yield 문을 쓰고 activeSelf가 false 인 상태에서 SetActive(true)를 해주면 발생된다. (최초 1번만 발생?) 이 문제를 해결하려면 SetActive를 해주기 전 yield return new WaitForEndOfFrame() 을 호출하여 렌더 타이밍과 맞춰줘야 한다.p.s : 왜 해당 상황이 activeSelft가 false->true 로 변경될 때 최초 한번만 발생하는지는 아직 의문 (아시는분 있으면 도움을 요청드립니다. / UGUI도 발생하려나??), 신기한거는 SetActive(false)는 바로 사라짐....(흐음)

[Git] HTTP Basic: Access denied 에러 [내부링크]

Git에서 어떠한 작업을 수행하다가 HTTP Basic: Access denied 에러가 발생하는 경우 Windows 자격증명을 수정해야하 한다. 저장된 Password와 실제 Password가 달라져서 발생한 문제이다.윈도우 > 자격 증명 관리자 검색 -> Windows 자격 증명 -> git과 관련된 자격 증명의 Password를 최신으로 수정이렇게 하고나면 해당 에러가 발생하지 않는다.발생하면 다른문제일수도??...

Unity 빌드시 용량 줄이기 (Resources) [내부링크]

프로젝트 어느 폴더에 있던 Resources 폴더는 예약어라서 빌드에 포함이 된다.현재 프로젝트에서 아틀라스를 묶어 사용중이고 아틀라스 폴더에 Resources라는 폴더를 만들어 그곳에 원본 리소스를 보관해두고 있었다. 그러한 리소스들을 아틀라스로 묶으면 아틀라스 데이터(머테리얼, 텍스쳐, 에셋)만 빌드에 포함시키면 되는데 각 리소스들까지 빌드에 포함이 되었다. 결과는 당연하게도 빌드 용량이 늘어난다.이런 현상을 없애기 위해서는 Resources라는 예약어 폴더를 없애면 된다. (물론, 진짜로 빌드에 포함되는 리소스들은 Resources에 넣어야한다.)이상 끄적끄적

Unity Animation.Play()시 Animation이 재생이 되지 않는 버그 [내부링크]

Legacy Animation을 이용하여 Play시 Play가 되지 않고 이후에 Play Clip을 바꾸려고 해도 재생이 되지 않는 문제가 있었습니다. 아무리 구글링해도 내용이 나오지 않아서 많은 테스트 후 문제를 찾았네요.이는 Animation Component를 가지고 있는 오브젝트가 비활성화 상태에서 코드상으로 Animation.Play()를 호출 후 해당 오브젝트를 활성화 시키면 발생됩니다. (아래 코드만 봐도 이해가 갈 것이라고 생각합니다.) 이 상태로 한 번 꼬이면 아무리 Play로 애니메이션을 바꿔도 꼬여서 재생이 안됩니다.혹여나 Aniamtion이 재생이 안된다면 오브젝트가 비활성화 된 상태에서 Play하고 활성화를 시키는지 확인!!만약 비활성화 상태에서 실.......

Unity 앱 Pause에서 돌아올 때 AudioSource.isPlaying이 true가 되지 않는 문제 [내부링크]

앱 실행중에 광고를 보고 돌아오거나, 백그라운드에 앱을 내리고 돌아올 때 게임 BGM이 정상적으로 재생되지 않는 문제가 있었습니다. 이를 해결하려고 유니티 내부에서 지원하는 OnApplicationPause에 AudioSource.IsPlaying 을 가져와서 False일 경우 강제로 BGM을 재생하는 로직을 추가하였습니다.이렇게 하니 실제로 음원이 멈춰버리는 현상은 해결되었습니다. 다만, 일부 기기의 경우 isPlaying이 정상적으로 체크되지 않는 문제가 있었습니다. 앱이 Paused 됐다가 돌아오게 되면 무조건 isPlaying이 false로 체크가 되어 음원이 무조건 다시 재생되는 문제가 발생했습니다. 이를 해결하기 위해 코루틴과 AudioSource.Pause(), UnPause()를.......

Unity AOS(Android) 앨범/갤러리 Refresh [내부링크]

게임 내에서 사진이나 캡쳐를 앨범/갤러리에 저장하는 경우가 있다. 하지만 저장은 정상적으로 된 것을 확인했는데 앨범이나 갤러리 앱을 통해 보면 저장한 사진이 보이지 않는다. 이를 해결하기위해 알아본 결과, AOS는 앨범/갤러리 Refresh 기능이 있는 것을 알게 되었다. (아래처럼 직접 호출하거나 기기가 재실행될 때 호출??)아래 코드는 앨범/갤러리를 AndroidJava 클래스를 이용해 Refresh 하는 방법이다. 주의점으로는 해당 파일의 Path를 알고 있어야 한다.해당 코드를 써도 Refresh 되지 않는다면 filePath에 확장자까지 들어갔는지 확인해보자.

Unity AOS(Android) 앨범/갤러리 경로(Path) 가져오기 [내부링크]

게임내 캡처나 텍스쳐를 앨범에 저장하고 싶은 경우가 있다. 이 포스팅은 AOS 앨범/갤러리 경로를 가져오는것에 대한 포스팅이다. 주의점은 AndroidManifest에 ExternalWrite 권한에 대한 소스가 있어야한다. 또는 PlayerSettings 에서 Android Write Permission 을 Internal이 아닌 External(SD Card)로 설정해주어야 한다. 이유는 이 메서드는 Directory를 만들기 때문이고 External이 아닌 Internal로 하게 되면 DCIM에 접근이 불가능하다고 한다. 이 메서드를 호출하기 전 위 세팅을 확인하고 반드시 권한을 체크해주어야 한다. 지금은 한 메서드로 제작하느라 권한체크를 메서드 안에 넣었지만 외부에서 권한체크를 먼저 한 후 해당 메서드.......

Unity Texture를 PNG 파일로 저장하기 [내부링크]

해당 포스팅은 말 그대로 Texture를 PNG 파일로 저장하는 방법이다. Texture를 PNG로 변환하려면 Texture2D 형태로 변경하여야 한다. 헌데 이 방법이 쉽지만은 않다. 다른 좋은 코드가 있을 수 있으며 아래는 필자가 작업한 소스다.

Unity AOS(Android) 외부 쓰기 권한(External Write Permission) 설정 [내부링크]

우선 스크립트로 권한을 체크하거나 요청하기전에 기본 세팅에 들어가야한다. 이는 2가지 방법이 있다.1. AndroidManifest에 외부 저장 권한 소스 추가 (아래 소스 확인)2. UnityEditor -> Player Settings -> 안드로이드 Other Settings -> Write Permission 을 External (SDCard)로 설정위 두가지중 한가지라도 설정했다면 쓰기 권한을 체크하거나 요청할 수 있는 준비가 되어 있다. 아래는 체크하거나 요청하는 소스이다. 이는 Runtime Permission으로 앱이 실행되는 도중 원하는 시점에 사용할 수 있다.이 소스의 단점은 Callback이 없어 직접 포커싱 체크를 했다는 점이다. 또한, 다시 묻지 않음을 했을 경우 권한 요청에 대한.......

Unity SelectionBase [내부링크]

[SelectionBase] public class ClassName : MonoBehaviour { } [SelectionBase]를 클래스 위에 선언해두면 에디터에서 오브젝트를 눌렀을 때 이 스크립트가 있는 오브젝트를 기준으로 선택하게 할 수 있다. 예) ParrentObject ChildObject ParentObject는 아무것도 없는 오브젝트이고 ChildObject에는 renderer, collider 등이 있다고 가정했을 때 에디터 씬에서 저 오브젝트를 클릭하면 ChildObject가 Hierarchy에서 선택이 된다. 만약 ParentObject에 있는 스크립트에 [SelectionBase]가 선언되어있다면 ParentObject가 선택된다. 오브젝트 자식에 무언가를 많이 만들어놓고 부모 하나로 움직이게 해야할 때 다른 작업자에게 레벨 배치를 시키.......

Unity Vector3.Dot 내적 [내부링크]

게임에서 내적은 시야각에 들어왔는지 또는 전방, 후방에 있는지 체크할 때 좋다. 물론 내적 한줄만 사용하면 이런식으로 쓸 수 있지만 내적을 활용하면 더 많은 방법으로 응용할 수 있다. 내적은 float로 반환이 된다. 내적의 공식은 A벡터와 B벡터가 있다고 하면 (A.x * B.x) + (A.y * B.y) + (A.z * B.z) 이다. 또 다른 공식으로는 |A| * |B| * Cosθ 이다. 위 사진과 같이 forward나 .normalized를 이용하면 벡터의 크기가 1이 되므로 2번째 공식으론 1 * 1 * Cosθ 가 되므로 결국 내적은 Cosθ를 의미할 수 있다. Cos그래프는 아래와 같다. 그래프를 보면 0일때는 1을 의미한다. 90일때는 0 180일때는 -1을 의미한다. 결국 내적을 하게.......

Unity Vector3.Cross 외적 [내부링크]

외적은 좌측인지 우측인지 판별할 때 쓰면 좋다. 위 그림에서는 하얀색 벡터는 가만히 있는 기준 벡터이고 빨간색 벡터는 원점을 중심으로 회전하는 벡터이다. 위에서는 하얀색과 빨간색 벡터를 외적하였으며 그 결과가 노란색 벡터이다. 유니티는 위 그림과 같이 왼손 좌표계이다. Z축을 기준으로 오른쪽으로 가면 Y가 상승하는 구조이기 때문에 외적도 이와 같이 똑같이 적용된다. 맨 위 외적 결과물을 보면 기준벡터에서 우측으로 갈수록 결과벡터는 Y양의 방향을 가리키고 있고 좌측으로 갈수록 결과벡터는 Y음의 방향을 가리킨다. 결국 우측인지 좌측인지를 판별하려면 결과벡터의 y값을 가져와서 양수일 경우 오른쪽 음수일 경우 왼쪽이라.......

Unity Character Controller Skin Width [내부링크]

오브젝트에 물리적 충돌을 구현하는 방법은 크게 Rigidbody와 Character Controller가 아닐까 싶다. 우리가 오늘 해 볼 것은 오브젝트를 일정 높이에서 떨어트린 후 바닥이랑 충돌했을 때 살짝 밀리는 현상을 해결해 볼 것이다. 일단 Character Controller는 컴포넌트 자체에서 이 기능을 구현해 주고 있다. 그것이 바로 Skin Width라는 놈이다. Skin Width라는 것은 무엇을 하는 변수일까? Rigidbody를 써서 점프를 하고 착지를 하였을 때 아래 그림과 같이 살짝 밀리는 현상을 많이들 겪었을 것이라 생각한다. 아래 그림은 한프레임 단위로 실행을 시켜서 밀림현상을 보여주기 위함이다.캡슐이 바닥에 충돌했을 때 살짝 바닥을 뚫고 다시 올라.......

Unreal Level [내부링크]

언리얼에서는 오브젝트의 위치값을 잡아놓고(배치) 값을 수정시키거나 하여 최종적으로 에디터를 키거나 게임이 실행될 때 배치 또는 수정한데로 나오게 저장한 것을 Level이라고 한다. 유니티의 씬(Scene)이라고 보면 된다. 에디터를 열어서 현재 작업된 것을 저장하면 Level을 저장하라고 나올 것이다. 언리얼에서 저장된 Level을 폴더로 구분할 때 주로 Maps 폴더로 만들어서 저장한다고 한다. 유니티에서는 Scenes라는 폴더를 만들어 저장하는 것과 같은 개념이다. 이 맵 파일(Level)을 저장하게 되면 프로젝트 세팅에서 에디터가 실행될 때와 게임이 실행될 때 어떤 Level로 실행할 지 설정이 가능하다. 이 부분을 보면 Editor Startup Map과.......

Unreal Actor [내부링크]

Actor의 사전적 의미는 배우이다. 배우란 카메라에 비춰져서 연기하는 것을 말한다. 우리가 만드는 게임도 카메라에 비춰지는 오브젝트들이 프로그래머가 구현한 방식대로 행동을 하기 때문에 언리얼에서는 Level안에 배치되는 최소 단위를 Actor라고 하였다. 즉 Actor는 Level안에 배치할 수 있는 최소단위의 클래스이다. Level안에 배치되는 모든 물체들은 Actor를 상속받아야만 배치될 수 있다.위 사진은 새로운 C++ 클래스를 추가할 때 나오는 화면으로서 어떤 클래스를 상속받을 것인지 설정하는 부분이다. 없음이 아닌 아래에 있는 것들은 언리얼에서 내부적으로 미리 만들어 놓은 클래스이다. 이 부분에서 Actor를 상속받아 사용하면 된다.......

Unreal Pawn [내부링크]

Pawn의 사전적 의미는 말이다. 체스에서도 많이 들어봤을 것이다. 체스에서 사용하는 말을 체스말이라고 하며 플레이어가 조종하는대로 움직인다. 언리얼에서는 플레이어가 컨트롤하여 움직이는 것을 Pawn이라고 내부적으로 만들어두었다. 간단하게 말해 플레이어가 조종해서 말처럼 움직이는 것은 Pawn으로 만들어주면 된다. Pawn도 Level에 들어가는 오브젝트이므로 선언부를 보면 Actor를 상속받는 것을 볼 수 있다.위 사진은 C++ 클래스를 만들 때 나오는 창이다. 없음을 제외한 아래에 있는 것들은 유니티에서 내부적으로 만들어 놓은 클래스이다. 이 부분에서 Pawn을 선택하게 되면 Pawn을 상속받는 새로운 클래스가 만들어지게 된다. Pawn.......

Unreal Character [내부링크]

이 글을 보기전에 Pawn에 대해 모른다면 Pawn을 먼저 보고 오길 권장한다. https://blog.naver.com/fear2002/221304127729Pawn을 보고왔다면 이 글을 이해할 수 있을 것이다. Pawn은 플레이어가 컨트롤하여 조종되는 말이었다. 하지만 Pawn안에는 Component가 선언되어 있지 않아 구현을 할 때 Component를 일일히 만들어줘야 했다. 이 중 Pawn을 제작할 때 많이 사용하는 Component들을 미리 만들어 둔 것이 Character 클래스이다. 만들어 놓은 Component들은 아래와 같다. - CharacterMovementComponent : 이동관련 컴포넌트 - SkeletalMeshComponent : 애니메이션을 사용하는 메쉬 컴포넌트 - CapsuleComponent : 캡슐모양의 콜라이더를 사용.......

Unreal UPROPERTY [내부링크]

변수를 선언할 때 UPROPERTY() 매크로를 많이 사용하게 될 것이다.C++ 에서는 변수를 포인터로 메모리에 할당한다고 할 때 프로그램이 끝나기 전 항상 메모리 해제를 해야 한다.C# 에서는 GC로 인해 따로 해제를 안 해도 내부적으로 가비지를 모아 한 번에 어느정도 쌓이면 그 가비지를 처리한다.언리얼도 마찬가지로 C++이기 때문에 메모리 해제를 프로그래머가 직접 해야 하지만 언리얼에서 내부적으로 UPROPERTY라는 매크로를 만들어 이 변수를 GC와 같이 내부적으로 관리할 수 있게 만들었다.어느 변수든 위쪽에 UPROPERTY를 사용하고 그 안에는 여러가지 속성들이 들어갈 수 있다.UPROPERTY(VisibleAnywhere)을 선언하면 이 변수의 속성.......

RayTracing In PPM #1 [내부링크]

이 포스팅에 대한 내용은 CPU로 이미지를 찍어내는 내용입니다. CPU로 무수히 많은 작업을 하기 때문에 속도가 상당히 느리지만 수학적 내용을 파악하고 RayTracing의 작동 원리를 이해하는데 상당히 좋은 역할을 합니다. 이 포스팅은 아래 PDF를 보고 진행하였으며 해당 내용에 대한 분석과 해석등을 위해 이 글을 작성합니다.(부족한 점이 있을 수 있으니 양해 부탁드립니다.)1주일만에 레이 트레이싱을 깨우치자는 교재인데, 꽤 괜찮아 보입니다. API를 사용하지 않고 PPM 파일을 이용하여 구현하게 되는데 레이트레이싱에 관한 수학적 내용이나 어떤식으로 과정이 진행되는지 알기 좋은 책인거 같습니다. 해당 PDF와 예제 소스는 무료로 배포.......

RayTracing In PPM #2 [내부링크]

Chapter 4 : 원 추가하기드디어 처음으로 추가되는 도형입니다. 원을 그리기 위해 복잡한 수학식이 있네요. 이를 하나씩 파헤쳐 나가보도록 해봅시다. 아래는 해당 코드입니다.저도 이해하기 정말 어려웠습니다. 우선 구의 방정식부터 알아보도록 합시다. 구의 중심이 (cx, cy, cz)이고 반지름이 R인 구라고 가정을 내려봅시다. 해당 구의 방정식은 아래와 같이 정의할 수 있습니다. 여기서 제곱을 풀어서 써보도록 합시다. 위와 같이 볼 수 있겠네요. 여기서 임의의 점 p = (x, y, z)와 원의 중심 C = (cx, cy, cz)라고 하면 p - C는 아래와 같습니다.각 벡터의 성분끼리 뺀 값입니다. 여기서 내적의 공식을 한 번 보도록 합시다. 임.......