티스토리 뷰
목차
1. 큐브가 없으니 큐브를 먼저 만들자
1.1 Unity로 1x1 큐브 만들기
1.1.1 Cube에 Color 입히기
1.2 Rotation 구현
1.3 2x2 큐브로 확장
1.4 Skill 구현
1.4.1 Random Shuffle 구현
1.4.2 Twist 두가지 구현
1.5 2x2 큐브 자동으로 맞추기 구현
1.5.1 각 Face의 Color 받아오기
1.5.2 한 면 맞추기
1.5 3x3 큐브로 확장
2. 큐브가 있으니 강화학습으로 맞춰보자
-------------------------------------------------------------------
1.5 2x2 큐브 자동으로 맞추기
1.5.2 한 면 맞추기
이번 포스팅에서는 2x2x2 Cube를 자동으로 맞추기 전 작업인 각 Face의 Color를 받아오는 Code를 추가하고 한 면을 자동으로 맞추도록 구현해 보겠습니다. 오늘 포스팅부터는 내용이 조금 복잡해지고 설명이 섬세하지 못할 수 있습니다. 궁금한 점은 언제든지 댓글 달아주시면 친절하게 도와드리겠습니다!
1.5.2.0(들어가기에 앞서) 여러가지 Color 받아오기 추가
이전 포스팅에서 우리는 2x2x2 Cube를 자동으로 맞추기 전 작업인 각 Face의 Color를 받아오는 Code를 구현해 보겠습니다. 또한 앞으로 Cube를 맞춰가기 위한 기준이 되는 영상을 소개하고 작은 약속들을 했습니다.
앞에서 구현했던 기능들 외에 다른 방법으로 Color를 받아오는 기능들을 구현해보겠습니다.
1.5.2.0.1 또 하나의 작은 약속
우리는 또다시 하나의 작은 약속을 해야할 것 같습니다. 바로 Cube 마다 Index를 설정해 주는 것입니다. 뒤에서 Cube를 맞출 때 꼭 필요한 내용이기 때문에 아래와 같이 정하고 시작하겠습니다. 이전에 했던 Face의 약속과 index 순서는 동일합니다.
1.5.2.0.2 각 Cube의 Color 받아오기
바로 위에서 정한 Cube Index대로 각 Cube의 Color를 저장해보도록 하겠습니다. 아래 Code를 보시면 먼저 Big Face를 구하고 Big Face에 해당하는 display Small Face를 구합니다. 그 다음 미리 초기화 해둔 cubeColorList에 각 Cube index에 맞는 Face를 찾아 color를 저장하였습니다. 그림에는 2번 Cube까지 나와있지만 실제 Code를 보시면 0~7까지 저장하였습니다.
1.5.2.0.3 원하는 Face, index에 해당하는 Color 받아오기
다음은 Big Face의 이름과 Index가 주어졌을 때 그 위치의 Color를 Return하는 Code 입니다. 만약 Bottom 3번의 Color가 알고 싶다면 Debug.Log(GetCubeColor("Bottom", 3)) 으로 쉽게 알아 볼 수 있습니다.
1.5.2.1 글로 쓰는 아래면 맞추기 알고리즘
이제는 본격적으로 Cube의 아래면을 맞춰보겠습니다.
실제로 코딩을 하기 전에 Solver가 어떻게 진행되어야 할지 써보도록 하겠습니다.
0. Cube가 Random으로 섞여있는 상태처음은 Cube가 Random으로 섞여있는 상태입니다. 앞에서 구현했던 Random Suffle로 0번 상태를 만들 수 있습니다.
1. Bottom의 3번이 StartColor가 되면서 앞으로 그 색으로 맞추기로 설정
처음으로 맞출 Color를 정해야합니다. 그 기준은 위의 영상처럼 Bottom 3번에 위치한 Color로 하도록 하겠습니다. Bottom 3번은 우리가 조금전에 한 작은 약속에 의해서 Cube 2번이 됩니다.
2. Cube 2번이 가진 Near 2 Face와 StartColor를 둘 다 가지는 Cube 탐색
이제 우리는 Cube 2번을 고정시킨 뒤 Cube 3번에 와야할 Cube를 찾도록 하겠습니다. Cube 3번에는 Cube 2번과 앞면 아랫면이 같은 색을 가지는 Cube입니다. 아래 그림에서는 Red와 StartColor인 White를 가지는 Cube를 찾아야합니다.
현재 그림에서는 4번에 (Red White Blue) color를 가진 큐브가 있습니다.
3. 2번에서 찾은 Cube의 위치에 따라 움직임을 다르게 해줍니다.
- 0, 3 Cube 자리에 있다면 R, U, rR, rU 을 반복해서 Cube가 맞춰질때까지 수행합니다.
- 1, 4, 5 Cube 자리에 있다면 U를 반복하면서 0 Cube 자리로 위치시킵니다.
- 6 Cube 자리에 있다면 R을 수행해서 3 Cube 자리로 위치시킵니다.
- 7 Cube 자리에 있다면 rB(뒷면 돌리기)로 6 Cube로 위치시킵니다.
4. 3번을 반복해서 3번자리의 Cube가 맞춰졌다면 큐브를 왼쪽으로 돌려 3번 Cube가 2번이 되게 하고 다시 2번과 3번을 반복합니다.
이 과정을 3번 거치면 아래면이 완성됩니다.
1.5.2.2 Code로 작성하기
이제 위의 과정을 Code로 작성해 보겠습니다.
0. 앞에서 만들었던 Random Shuffle을 이용하여 섞어줍니다.
1. StartColor를 찾아야합니다. 아래 Code는 편의를 위해 Bottom 3의 StartColor와 2번에서 필요한 Near 2번의 색을 Pair로 묶어준 Code입니다.
2. StartColor를 설정했으니 StartColor의 두 요소를 가지는 Cube를 찾아야합니다. 아래 Code는 Cube의 index를 넣어주면 그 Cube가 StartColor의 두 요소와 몇개나 같은 Color를 가지고 있는지 탐색합니다. 만약 1.5.2.0.2 에서 저장한 cubeColorList와 StarColor가 2개가 같다면 그 Cube가 우리가 찾던 Cube 이므로 true를 Return합니다.
3. 이제 우리가 찾은 StartColor를 가지는 Cube의 위치에 따라 다르게 움직여야합니다. 아래 Code는 위의 함수를 사용하여 0,3 or 1,4,5 or 7에 위치했을 때마다 행동할 동작을 저장하는 Code입니다.
4. 3번을 계속 반복하다보면 결국 우리가 원하는 Cube가 제자리를 찾아갈 것입니다. 그러면 전체 Cube를 왼쪽으로 돌려줍니다. 아래 Code는 1.5.2.0.3 에서 작성한 Code를 활용하여 원하는 Cube가 제자리를 찾아갔는지 확인하는 Code입니다.
위 함수의 결과가 true라면 아래 Code를 실행하여 전체 Cube를 왼쪽으로 회전합니다.
위 과정을 반복하다보면 아래면이 다 맞춰지는 순간이 있습니다. 아래 Code는 Bottom의 모든 면이 StartColor로 잘 맞춰졌는지 확인하는 Code입니다. 아래 함수가 true가 되면 Cube는 동작을 멈춥니다.
이렇게 아래면을 맞추는 Solver를 만들었습니다. 위의 Code들을 조합해서 실행시키면 아래 영상과 같이 아래면이 맞춰지는 것을 확인할 수 있습니다.
다음 포스팅에서는 나머지 윗면도 해결하여 전체 Cube를 자동으로 맞춰보도록 하겠습니다.
공지!
Code가 점점 길어지고 복잡해지고 있어서 이제는 Gitlab 주소를 남깁니다. 이곳에 Unity Project까지 함께 올려둘테니 다운 받으셔서 쓰시면 될 것 같습니다.
혹시 Git 사용이 어려우신 분들은 댓글을 남겨주시면 프로젝트 파일 또는 전체 Code를 메일로 보내드리겠습니다.
Git 주소 : https://gitlab.com/bshong2850/rubikspuzzle/-/tree/master
'Unity' 카테고리의 다른 글
Unity SRP 처음부터 시작하기 4 - 최적화 실험(1) (1) | 2020.08.09 |
---|---|
큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #9 (0) | 2020.08.09 |
큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #7 (0) | 2020.07.23 |
Unity SRP 처음부터 시작하기 3 - 최적화 (3) | 2020.07.19 |
큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #6 (0) | 2020.07.08 |
- Total
- Today
- Yesterday
- CollisionDetection
- transform
- Unity
- Unreal
- reference type
- Mesh Processing
- NDC
- AABB
- Mesh
- 유니티
- Transformation
- VTK
- value type
- RubiksCube
- SRP
- 참조 형식
- 강화학습
- Scriptable Render Pipeline
- static batching
- MeshProcessing
- C#
- perspective projection
- opengl
- RL
- 값 형식
- dynamic batching
- normalized device coordinate
- collision detection
- 루빅스큐브
- batching
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |