티스토리 뷰
목차
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를 맞춰보도록 하겠습니다. 이번 포스팅도 내용이 조금 복잡하고 설명이 섬세하지 못할 수 있습니다. 궁금한 점은 언제든지 댓글 달아주시면 친절하게 도와드리겠습니다!
들어가기에 앞서 이전 포스팅에서 우리는 2x2x2 Cube를 맞춰보았습니다.
3x3x3 Cube도 아래의 영상을 바탕으로 진행하도록 하겠습니다.
1.6.1 작은약속과 Color 받아오기
우리는 큐브를 맞추기 전에 2x2 큐브에서 했던 것처럼 약속을 해야합니다. 바로 아래 포스팅에서 했었던 Face 번호를 정하는 것입니다. 이번에도 제 임의로 정했으니 사용하시는 분들은 편하신 방법이 있다면 그 방법으로 변형해서 사용하시면 될 것 같습니다.
저는 아래 그림과 같이 지정하였습니다. Top Right Near Face를 회전하면 Bottom Left Far Face와 같아지게 지정하였고 Center는 언제나 8로 지정하였습니다.
다음은 큐브들의 Index를 정해야합니다. 2x2 큐브와는 다르게 3x3 큐브는 3종류의 큐브로 나누어 집니다.
1. 1개의 면만 가지고 있는 Center Cube
2. 2개의 면을 가지고 있는 Side Cube
3. 3개의 면을 가지고 있는 Corner Cube
그림으로 표현해보면 아래와 같습니다.
다음으로 3가지 큐브에 번호를 지정해보도록 하겠습니다. Center Cube는 각 Face에 하나씩 있으므로 따로 번호 지정을 하지 않았습니다. 그 다음 Side Cube는 아래와 같이 지정하였습니다.
마지막으로 Corner Cube는 아래 그림과 같이 지정하였습니다. Corner Cube는 크게 복잡하지 않아 Front View만 가져왔습니다.
이제 모든 Face의 번호와 Cube 번호에 대한 정의가 끝났으므로 각 Face의 Color 및 Cube의 Color를 받아올 수 있습니다. Code는 2x2 Cube때의 Code에서 Cube가 늘어난 만큼 추가만 해주었고, Cube를 생성할 때 좌표를 -0.5~0.5 였던 것을 -1, 0, 1 로 바꾸어 확장하였습니다.
Code에 주석을 달아놓았으니 Git으로 받아서 보시면 편하실 것 같습니다.
1.6.2 아랫면 흰색으로 설정
다음은 아랫면을 설정해주어야합니다. 영상에서도 흰색으로 설정하여서 저도 흰색으로 정해주기로 했습니다.
그래서 아래 Code와 같이 Center가 White인 Face를 찾아서 그 Face의 상태에 따라서 큐브를 돌려주었습니다.
이 코드를 가지고 0번 Key를 누르면 실행되게 Code를 짜면 아래와 같습니다. 먼저 0번 Key를 누르면 Flag가 true로 설정이 되고,
이 initCubeFlag가 true면 아래 Code가 실행됩니다.
그러면 아까 본 InitCube에서 쌓인 basicSkill들이 SkillRun에서 실행되게 되면서 White면을 바닥으로 보내는 Code가 완성됩니다. 결과는 아래 영상과 같습니다. White가 맨 위에 있으므로 바닥으로 보내는 것을 확인하실 수 있습니다.
1.6.3 바닥면 십자가 맞추기
이제 바닥면이 White 이므로 우리는 다음 Step으로 바닥면의 십자가를 맞춰야합니다. 근데 이 부분이 Google에서 찾아봐도 방법을 알려주기 보단 직접해보라고 하더라구요.....(나는 컴퓨터로 해야한다구! ㅜㅠ) 그래서 Cube를 직접 사서 돌려보면서 해보았습니다.
십자가를 맞추면서 주의해야할 점이 있었는데요. 이미 맞춰진 십자가 부분은 돌려서는 안된다는 것이었습니다.
예를 들어 Bottom의 5번에 이미 White색의 Cube가 들어가 있으면 우리는 맨 앞면을 돌리면 안됩니다. 따라서 저는 Basic Skill 중 특별한 경우를 제외하고는 F와 rF, L, rL, B, rB을 사용하지 않고 바닥 십자가를 맞추어 보았습니다.
바닥 십자가를 맞춘다는 것은 바닥면의 1, 3, 5, 7번 Face를 맞춘다는 것과 같습니다.
제가 생각한 알고리즘은 아래와 같습니다.
1. Cube 전체에서 White Color를 가진 Cube를 찾는다.
2. 그 중 Face 번호가 홀수인 면만 찾는다.
3. 각 Face와 번호에 맞게 Bottom 3번으로 보낸 뒤 전체 Cube를 왼쪽으로 돌린다.
4. 3번 과정을 4번 반복하게 되면 아래 십자가가 모두 맞춰진다.
따라서 저는 아래와 같이 Code를 작성하였습니다. 먼저 FindColorLocation 함수를 통해 White Color를 가지는 Face의 위치를 List에 저장한 뒤, 2로 나누어 나머지가 1일때만 확인하였습니다.
또한, 각 Case일 때마다 Bottom 3으로 보내주는 Code를 작성했는데 예를 들어 위의 Code에서 보이는 것처럼 위치가 Top일 때를 보시면 아래 그림과 같이 Top 7번자리로 보내주게되면 그 다음에 rR rR 을 수행하여 Bottom 3번자리로 보낼 수 있게 됩니다.
이런 식으로 Top, Right, Left, Near, Far에 White Face가 있을 때 어떻게 움직여야 하는지 모두 정의를 해준 뒤에 Code를 실행시켜주면 아래 영상과같이 아래 십자가가 맞춰집니다. 각 위치일 때 어떻게 움직여야 하는지 궁금하다면 Git Code 중에 Solver.cs 파일을 확인해보시면 제가 하나하나 다 정의해 두었으니 확인해보시면 될 것 같습니다~!!!(힘들었다 증말)
다음 포스팅에서는 바닥면 전체를 맞추고 2번째 층도 맞춰보도록 하겠습니다!
공지!
Code가 점점 길어지고 복잡해지고 있어서 이제는 Gitlab 주소를 남깁니다. 이곳에 Unity Project까지 함께 올려둘테니 다운 받으셔서 쓰시면 될 것 같습니다.
혹시 Git 사용이 어려우신 분들은 댓글을 남겨주시면 프로젝트 파일을 메일로 보내드리겠습니다.
3x3 rubiks Cube Git 주소 : https://gitlab.com/bshong2850/3x3rubikspuzzle
2x2 rubiks Cube Git 주소 : https://gitlab.com/bshong2850/rubikspuzzle
'Unity' 카테고리의 다른 글
큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #11 (0) | 2020.08.30 |
---|---|
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
- 참조 형식
- Scriptable Render Pipeline
- collision detection
- Unity
- normalized device coordinate
- SRP
- CollisionDetection
- Transformation
- Mesh
- Mesh Processing
- VTK
- transform
- reference type
- RubiksCube
- MeshProcessing
- C#
- batching
- Unreal
- AABB
- perspective projection
- static batching
- NDC
- value type
- 유니티
- dynamic batching
- opengl
- RL
- 루빅스큐브
- 값 형식
- 강화학습
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |