본문 바로가기

분류 전체보기

(22)
[알고리즘 문제] 백준 7569번 토마토 7569번: 토마토 (acmicpc.net) 7569번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100, www.acmicpc.net 문제 3차원 배열 그래프 상에서 토마토가 익는 시간을 측정하는 문제입니다. 아이디어 BFS를 사용하는 몇 가지 방법이 있겠지만, 여기서는 가장 단순한 방법을 사용합니다. 시간을 들여 직접 토마토를 익혀봅시다. 1. 처음 익은 토마토의 리스트를 만듭니다. 정확히는 다음 시간에 주변에 영향을 줄 토마토들입니다. 2. 익은 토마토의 주변에 안 익은 토마토, 즉 다음에 익을 토마토를 익히고 리스트로 만..
[알고리즘 문제] 백준 4963번 섬의 개수 4963번: 섬의 개수 (acmicpc.net) 4963번: 섬의 개수 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도 www.acmicpc.net 문제 2차원 그래프 상에 연결된 섬의 개수를 구하는 문제다. 그림에 제시된 상황에서는 총 3개의 섬을 찾을 수 있다. 아이디어 1. 지도의 좌상단에서 시작하여 우하단으로 이동하며 섬을 찾는다. 2. 만약 현재 탐색한 칸이 섬이면, 주변에 연결된 섬을 모두 찾는다. 문제 데이터가 50*50으로 작기 때문에 DFS, BFS 어느 방법을 사용해도 문제없다. 연결된 섬은 표시를 해서 다시 카운트하지 않도록 한다. 섬..
퀘스트에 Spatial Anchor를 사용하기 퀘스트에서 유니티로 만든 게임을 실행하면 실행 시점의 헤드셋의 위치 + 바닥의 위치가 (0, 0, 0)이 된다. 이 말은 실행 시킬 때 마다 유저의 위치에 따라 물체의 위치가 변한다는 뜻이다. 하지만 현실과 상호작용하는 몇몇 앱의 경우 현실의 물체에 고정된 좌표를 필요로 한다. 이를 위해서는 자체적인 공간 매핑을 구현하거나 퀘스트가 제공하는 Spatial Anchor를 사용해야한다. Sptial Anchor는 퀘스트의 카메라 정보를 기반으로 특정 물체의 좌표를 현실의 좌표에 매핑 시켜준다. 공유 공간 앵커를 사용할 경우 서로 다른 퀘스트가 동시에 현실의 좌표에 동기화 할 수 있다. 그렇지만 지금은 혼자 사용하는 경우에 대해 알아보겠다. 우선 OVRCameraRig의 Quest Features로 가서 An..
delegate 사용하기 delegate는 특정 반환값과 인자를 받는 함수의 형을 선언해서 함수를 변수처럼 전달받을 수 있게한다. 다음은 예시를 위해 간단히 체력을 담당하는 스크립트를 만들었다. OnHealthSliderChange는 UI의 슬라이더가 움직일 때 마다 호출된다. public class Health : MonoBehaviour { public delegate void HealthCallback(float health); public HealthCallback healthCallback; public void HealthChange(float health) { Debug.Log("Method " + health); } void Start() { healthCallback += HealthChange; healthCa..
Passthrough를 이용해 AR 만들기 메타 퀘스트에는 트래킹 카메라를 이용해 외부의 환경을 볼 수 있는데, 이를 개발자 도구에서 접근해 AR앱을 개발할 수 있습니다. 다른 데이터 없이 이미지만 띄워주는 방식이라 제한이 있지만, 여전히 시각적으로 흥미로운 앱들을 만들 수 있습니다. 기본적인 프로젝트 설정은 끝났다고 가정하고 시작합니다. 1. 우선 OVRCameraRig를 선택하고 OVR Passthrough Layer 컴포넌트를 추가합니다. 2. Quest Features에 Passthrough Support를 Supported로 변경합니다. 3. Enable Passthrough를 체크합니다. 실행 중 Passthrough를 키고 끄고 싶다면, Enable Passthrough 설정을 조절하면 됩니다. 5. OVR Passthough Lay..
유니티로 퀘스트2 앱 개발 시작하기 메타에서는 퀘스트의 개발에 쓸 수 있게 개발 도구를 유니티 패키지 형태로 제공하고 있습니다. 들어가기 앞서 유니티에 안드로이드 SDK를 설치하고, 퀘스트에 개발자 설정을 열어둡니다. 우선 기본 3d 프로젝트를 생성합니다. 에셋스토어에 들어가 Unity Interation을 구입합니다. 유니티의 상단 바에서 Window - Package Manager로 들어가 방금 구매한 에셋을 임포트합니다. 일단은 모두 선택해 임포트해주세요. 중간에 OpenXR을 사용할 것인지 물어보는데, 리프트를 대상으로 개발하고 있지 않으니 Use OpenXR을 누룹니다. 그 이외에도 최대한 업그레이드를 하고, 추천하는 대로 진행하면 됩니다. 설치가 끝났으면 Project Settings 최하단에 XR Plug-in Manageme..
메타 퀘스트 AR 위치 기록기를 만드는 중 퀘스트3 출시를 대비하며 퀘스트를 월드 스케일로 써먹을 아이디어를 생각하다가, 밖에서 HMD위치를 추적하면 길에 대한 정보를 얻을 수 있지 않을까? 하는 생각에 만들어보고 있다. 일단 간단히 HMD의 위치를 3초마다 기록하고 순서대로 LineRenderer로 그어보는 식으로 움직임을 추적했다. 방에서 출발해 대략 150m 정도 되는 네모난 복도를 한 바퀴 돌아오고 그 경로를 그어봤다. 움직이면서 퀘스트의 트래킹이 수직방향으로 튕길 때가 종종 있었지만 빠르게 복구되었다. 총 2바퀴를 돌았는데 시작위치에 있는 모델의 위치를 확인하니 처음에는 시작 위치보다 20cm정도 위에 있었고, 2번째에는 변함없이 있었다. 메타 퀘스트는 GPS가 없기에 순수 카메라로만 위치 트래킹을 해야하는데, 길이 길어질 수록 오차가 ..
간단한 단색 그래픽 만들기 비주얼적으로 단색만을 사용하는 게임을 만들고 있다. 내가 원하는 것은 * 포인트 라이트를 사용해 그림자가 원형으로 퍼져 나간다. * 빛을 받는 곳은 단색, 받지 않는 곳과 그림자 지는 부분은 검은색으로 나와야 한다. * 빛의 강도에 따라 색은 원색에서 검은색으로 바뀌어야 한다. 이 조건을 해결하면서 여러 시행착오를 겪었는데, 어떤 과정이 있었는지 써보고자 한다. _유니티의 기본 쉐이더를 사용 처음 시도한 방법은 포인트 라이트의 intensity를 올려 음영이 지는 부분을 없애고, 화면이 어두워지는 효과를 카메라 앞에 반투명한 상자를 씌우는 식으로 만드는 것이었다. 머티리얼은 기본 제공되는 것에서 metalic을 1로 smooth를 0으로 설정했다. 얼추 작동하는 것 같지만 몇가지 문제가 있다. inten..
코루틴 뒤에 코루틴을 실행시키기 만약 어떤 오브젝트가 시간에 따라 사라지거나 움직이는 기능을 만들고 싶다면 Update함수와 Time.deltaTime을 활용해 만들 수 있다. 하지만 이 방법은 하나뿐인 Update함수를 복잡하게 만든다. 이때 코루틴은 유니티에서 Update외 다른 루틴을 만들 수 있게 해준다. public class MoveForSeconds : MonoBehaviour { public int time; private Vector3 start; void Start() { start = transform.position; } public IEnumerator CoMoveForSeconds() { float timer = 0.0f; while (timer < time) { timer += Time.deltaTime; t..
체스말을 잡기 저번에 만든 것으로 폰부터 퀸까지의 말을 만들고 배치했다. 다음으로 말을 잡는 법을 만들어보자. 지금까지 기능으로는 상대의 말이 내 경로에 있을 경우 자신의 말과 구분하지 못하고 막혀버린다. 그리고 폰의 경우 앞으로 전진하고 대각선으로 잡는 독특한 행마법을 가지고 있어서 행마처리를 일관적으로 만들기 어렵다. 그래서 보드에 해당칸이 비어있는지를 알려주는 IsCoordAvailable()에 더불어 해당 칸이 잡을 수 있는 칸인지를 알려주는 IsCoordCatchable()을 추가하고, 이동 가능한 칸을 계산하는 MoveableCoord()에서 말마다 각각 계산하기로 했다. 퀸, 룩, 비숍은 이동 가능한 방향으로 나아가면서 막혀있는지 확인한다. 막혀있으면 잡을 수 있는 칸인지 확인하고 다음 방향으로 넘어간다...