티스토리 뷰
목차
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.3 나머지 면 맞추기
1.6 3x3 큐브로 확장
2. 큐브가 있으니 강화학습으로 맞춰보자
-------------------------------------------------------------------
1.6 3x3 큐브 자동으로 맞추기
이번 포스팅에서는 3x3x3 Cube를 끝까지 맞춰보도록 하겠습니다. 이번 포스팅도 내용이 조금 복잡하고 설명이 섬세하지 못할 수 있습니다. 궁금한 점은 언제든지 댓글 달아주시면 친절하게 도와드리겠습니다!
들어가기에 앞서 이전 포스팅에서 우리는 3x3x3 Cube의 바닥의 십자모양을 맞추었습니다.
https://mathmakeworld.tistory.com/66
오늘은 그 다음으로 Cube를 맞춰보겠습니다.
들어가기에 앞서 전체 맞추는 과정을 이야기해보면
1. 바닥면 중심을 흰색으로 맞추기
2. 바닥면 흰색으로 십자가 맞추기
3. 1층의 Side Cube 옆면 색과 맞추기
4. 1층의 Corner Cube 맞추기
5. 2층 맞추기
6. 윗면의 십자가 색 맞추기
7. 윗면 나머지 색 맞추기
8. 맨 윗층 Side Cube 색 맞추기
9. 맨 윗층 Corner Cube 색 맞추기
1.6.4 각 Step에 맞는 Code 생성
3번부터 9번까지 과정은 이전에 첨부했던 Cube 맞추는 영상과 아래 페이지를 참고해가며 작업하였습니다.
실제로 3x3 Rubiks Cube를 사서 직접 손으로 해보고 Code로 옮기는 작업을 하였습니다.
Code 전체를 설명하기에는 너무 반복되는 이야기가 많아서 각 Step의 작업과정을 말씀드리면 먼저 탈출조건을 만들어주었습니다. 예를들어 6번째 Step의 맨 윗면의 십자가 색 맞추기를 예로 들면 아래 Code와 같이 ClearCheck를 하는 함수를 만족하면 다음 stepCount가 1 증가하면서 탈출하게 됩니다.
실제로 ClearCheck를 하는 함수는 아래와 같습니다. Top Face의 1, 3, 5, 7번 small Face가 topColor와 같다면 ture를 반환합니다.
만약 이 조건을 만족하지 못한다면 그 상황에 맞는 Case에 따라 basic skill들을 쌓아서 Cube를 움직입니다. 아래 Code가 그 부분입니다. 모든 Step에서 Case는 한정적이기 때문에 모든 Case마다 Skill을 저장해준 뒤 저장된 Skill에 맞게 Cube를 움직여 줍니다.
모든 Step이 이 과정으로 짜여졌기 때문에 직접 Code를 보면서도 쉽게 읽힐것 같습니다. 다음으로 각각의 Step을 어떻게 묶었는지 말씀드리겠습니다.
1.6.5 Step 연동
먼저 아래 Code와 같이 Step값에 따른 Case문을 생성하였습니다. 또한 각 Step에서 탈출조건을 만족할 때마다 step을 1씩 증가시켜주었습니다. 그러면 다음 Step 함수로 넘어가게 됩니다.
실제 RubiksCube.cs에서 이 RunSolver를 어떻게 사용하는지 말씀드리겠습니다. RubiksCube.cs Code에서도 solverStep 변수를 가지고 있고 처음에 -1값으로 초기화 시켜 둡니다. 그 다음 내가 원하는 Key를 눌렀을 때(현재 코드에서는 0번), solverStep이 0이 되면서 아래 Code로 들어가게 됩니다.
그 다음 RunSolver를 들어가 Step변수에 맞는 함수에서 basicSkill을 저장하고 solver의 solverStep과 값이 다르다면 SkillRun 함수를 통해 저장되어있던 basicSkill을 수행합니다. solver에서 탈출조건을 충족하여 solverStep값이 증가하게 되면 else문으로 들어가 RubiksCube.cs의 solverStep이 증가하여 다음 Step으로 넘어가게 됩니다.
이 과정을 마지막 Step까지 하게 되면 아래 영상과 같이 스스로 Cube를 맞추게 됩니다. 아직 가장 쉽지만 오래 걸리는 방법을 사용하였기 때문에 천천히 맞추지만 추후에 계속 업그레이드해서 더욱더 적은 횟수로 맞추는 solver를 만들어 보겠습니다.
전체 Code는 아래 Git 주소에 들어가시면 내려받을 수 있습니다. Code에 주석을 달아두긴 했는데 혹시라도 보다가 어렵거나 이해가 되지 않는 부분이 있다면 언제든지 물어봐주시면 친절하게 답변드리도록 하겠습니다. 또한, 더 깔끔하게 Code를 짤 수 있거나 더 좋은방법이 있으신 분들도 댓글로 남겨주시면 언제든지 반영하도록 하겠습니다.
---------------------------------------------------------------------------------------------------------------------------------
약 3달간의 1. 큐브가 없으니 큐브를 먼저 만들자 Part가 끝이 났습니다. 길다면 길고 짧다면 짧은 기간동안 포스팅을 해왔는데 보시는 분들께 많은 도움이 되었으면 좋겠습니다.
다음 포스팅부터는 강화학습을 사용하여 맞추기가 시작됩니다. 계획상으로는 강화학습 카테고리를 생성하여 공부를 하면서 포스팅을 진행할까 합니다(강화학습을 해본지가 오래돼서 기억이 가물가물해요). 어느정도 지식을 다시 다지고 이곳으로 돌아와 강화학습으로 큐브를 맞춰보도록 하겠습니다~!!!!
---------------------------------------------------------------------------------------------------------------------------------
공지!
Code가 점점 길어지고 복잡해지고 있어서 이제는 Gitlab 주소를 남깁니다. 이곳에 Unity Project까지 함께 올려둘테니 다운 받으셔서 쓰시면 될 것 같습니다.
혹시 Git 사용이 어려우신 분들은 댓글을 남겨주시면 프로젝트 파일을 메일로 보내드리겠습니다.
3x3 rubiks Cube Git 주소 : https://gitlab.com/bshong2850/3x3rubikspuzzle
2x2 rubiks Cube Git 주소 : https://gitlab.com/bshong2850/rubikspuzzle
'Unity' 카테고리의 다른 글
큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #10 (0) | 2020.08.17 |
---|---|
Unity SRP 처음부터 시작하기 4 - 최적화 실험(1) (1) | 2020.08.09 |
큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #9 (0) | 2020.08.09 |
큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #8 (0) | 2020.07.31 |
큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #7 (0) | 2020.07.23 |
- Total
- Today
- Yesterday
- AABB
- RubiksCube
- batching
- perspective projection
- collision detection
- 값 형식
- static batching
- MeshProcessing
- Mesh Processing
- 참조 형식
- 루빅스큐브
- transform
- 강화학습
- dynamic batching
- value type
- NDC
- reference type
- RL
- C#
- SRP
- VTK
- CollisionDetection
- Transformation
- normalized device coordinate
- Mesh
- opengl
- Scriptable Render Pipeline
- 유니티
- Unity
- Unreal
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |