티스토리 뷰
목차
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.5 3x3 큐브로 확장
2. 큐브가 있으니 강화학습으로 맞춰보자
-------------------------------------------------------------------
1.5 2x2 큐브 자동으로 맞추기
1.5.3 나머지 면 맞추기
이번 포스팅에서는 2x2x2 Cube를 저번 포스팅에 이어 나머지 윗면을 맞춰보도록 하겠습니다. 이번 포스팅도 내용이 조금 복잡하고 설명이 섬세하지 못할 수 있습니다. 궁금한 점은 언제든지 댓글 달아주시면 친절하게 도와드리겠습니다!
들어가기에 앞서 이전 포스팅에서 우리는 2x2x2 Cube의 아랫면을 맞춰보았습니다.
앞으로 우리가 맞추는 과정도 아래 영상을 바탕으로 진행하도록 하겠습니다.
1.5.3.1 1번 Cube 맞추기
윗면을 맞추기 전 우리는 먼저 저번 포스팅에서 했던 작은 약속으로 정한 Cube번호에 따라 1번 Cube를 먼저 맞춰주어야 합니다.
1번 Cube자리에 2번 Cube와 Color가 맞는 Cube를 넣어주어야 하기 때문에 저번 포스팅에서 미리 짜두었떤 Color 찾는 Code를 활용하여
- 1번 2번 Cube가 Color가 맞다면 그대로 두고
- 0번 3번 Cube가 Color가 맞다면 전체를 Left로 돌려 0번 Cube가 1번으로 오게 합니다.
- 5번 6번 Cube가 Color가 맞다면 전체를 Right로 두 번 돌려 5번 Cube가 1번으로 오게 합니다.
- 4번 7번 Cube가 Color가 맞다면 전체를 Right로 한 번 돌려 4번 Cube가 1번으로 오게 합니다.
- 위 4가지 Case에 해당되지 않으면 윗줄을 시계방향으로 돌립니다.
아래 그림은 그 내용을 Code로 작성한 부분이고 나머지 부분은 Git에서 보시면 될 것 같습니다. CheckColorCount라는 함수는 computeList의 Color들과 targetList의 Color가 몇개나 동일한지 Check해서 2개면 true를 return하는 함수입니다.
1.5.3.2 Case에 따라 윗 줄 Cube 제자리에 맞추기
1번 Cube를 맞췄으니 영상의 해법을 계속해서 따라가면서 나머지도 맞춰보도록 하겠습니다. 영상 4분 46초부터 보시면
2. 위층 해결하기가 나옵니다.
여기에서 나오는 Skill이 (RUrRrU) x 3 + (rLrULU) x 3 입니다. 이 Skill을 수행하게 되면 아랫면은 그대로 있고 윗면만 바뀌게 되는데 위에서 봤을 때, 아래 그림과 같이 변화하게 됩니다. ( 숫자는 Cube 번호에 맞추었습니다.)
아랫면은 그대로기 때문에 우리는 이 Skill을 사용해서 윗면을 제 위치에 맞춰줄 수 있습니다. 현재 1번은 제자리에 위치한다고 가정하였으므로 총 5가지 Case로 나눌 수 있습니다.
- 1, 0, 4, 5가 다 맞을 때
- 1, 0 두 곳이 맞고 4, 5가 틀릴 때
- 1, 5 두 곳이 맞고 0, 4가 틀릴 때
- 1, 4 두 곳이 맞고 0, 5가 틀릴 때
- 1 한 곳이 맞고 0, 4, 5가 틀릴 때
먼저 다 맞을 때는 아무 작업도 안해도 됩니다.
다음으로 1,0 두 곳이 맞고 4,5가 틀릴 때 입니다. 이 상황은 아래 그림과 같이 해결이 가능합니다. U -> Skill -> U
다음으로 1, 5 두 곳이 맞고 0, 4가 틀릴 때는 아래 그림과 같이 해결이 가능합니다. Skill -> Skill -> U
다음으로 1, 4 두 곳이 맞고 0, 5가 틀릴 때는 아래 그림과 같이 해결이 가능합니다. Skill -> U -> U
다음은 1 한 곳만 맞고 0, 4, 5가 모두 틀렸을 때 입니다. 이 때는 2가지로 나눠서 해결할 수 있습니다.
1번 Cube와 대각선에 있는 Cube가 3번 Cube와 Color가 맞는지 또는 7번 Cube와 Color가 맞는지로 나눠서 생각해 볼 수 있습니다. 만약 1번의 대각선 Cube가 3번 Cube와 Color가 맞다면 초기 상태가 아래 그림과 같고 해결법은 U -> U -> Skill -> rU 입니다.
마지막으로 1번의 대각선 Cube가 7번 Cube와 Color가 맞을 때는 아래 그림과 같이 해결이 가능합니다. rU -> Skill
위의 과정을 Code로 작성하였고 중요한 함수는 SecondStep()과 FindRightCube()에 있으니 확인해보시면 될 것 같습니다. 색깔을 찾는 Code와 회전에 관한 Code를 미리 구현해 놓으니 가져다 쓰기만 해서 편하게 코드를 짤 수 있었습니다.
이 과정까지 완료하면 색이 정확하게 맞지는 않지만 각 위치에 Cube가 알맞게 들어간 것을 확인할 수 있습니다.
1.5.3.3 윗 줄 Cube 색 맞추기
이제 마지막으로 제자리에 맞춰진 Cube의 색을 맞춰주어야 합니다. 이 때 새로운 Skill이 등장하게 되는데 바로 RrFrRF 입니다. 이 Skill을 사용하면 0번 Cube의 방향을 바꾸면서 Color를 맞출 수 있습니다. 이 Skill을 0번 Cube가 알맞는 색을 가질 때까지 적용하고 색이 맞춰지면 U Skill을 사용해서 맨 윗줄을 돌려 0번 Cube를 바꿔주는 식으로 적용하게 되면 모든 Cube의 Color까지 맞춰지게 됩니다. 아래 Code를 참고하시면 될 것 같습니다.
1.5.3.4 하나로 합치기
이제 이 모든 과정을 한 번에 적용해주면 우리가 원하는 2x2 Cube 맞추기를 실행할 수 있게 됩니다!!! 저는 각 Step에 Flag를 주어서 한 Step이 끝나면 다음 Step의 Flag를 true로 주고 진행하는 방법을 사용하였습니다.
FirstStep = 아래면 맞추기
SecondStep = 윗면 제자리 맞추기
FinalStep = 윗면 Color 맞추기
SetTopCubeRightLocation = 1번 Cube 제자리로 맞추기
총 진행은 Random Shuffle 후에 0키를 누르면
FirstStep -> SetTopCubeRightLocation -> SecondStep ->
SetTopCubeRightLocation -> FinalStep -> SetTopCubeRightLocation 순서로 진행하게 하였습니다.
특별한 점은 SetTopCubeRightLocation 과정이 중간에 여러번 있어서 아래 코드와 같이 int 값으로 받아서 각 int 값마다 true 주는 Flag를 다르게 하였습니다.
이제 이 모든 것을 하나로 합쳐서 실행하게 되면 아래 영상과 같이 Random으로 섞인 Cube를 스스로 풀 수 있게 됩니다!!! 여기까지 따라와주신 분들 고생많으셨습니다~!!
다음 포스팅부터는 3x3 Cube를 가지고 맞춰보는 시간을 가지겠습니다.
공지!
Code가 점점 길어지고 복잡해지고 있어서 이제는 Gitlab 주소를 남깁니다. 이곳에 Unity Project까지 함께 올려둘테니 다운 받으셔서 쓰시면 될 것 같습니다.
혹시 Git 사용이 어려우신 분들은 댓글을 남겨주시면 프로젝트 파일을 메일로 보내드리겠습니다.
Git 주소 : https://gitlab.com/bshong2850/rubikspuzzle/-/tree/master
'Unity' 카테고리의 다른 글
큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #10 (0) | 2020.08.17 |
---|---|
Unity SRP 처음부터 시작하기 4 - 최적화 실험(1) (1) | 2020.08.09 |
큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #8 (0) | 2020.07.31 |
큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #7 (0) | 2020.07.23 |
Unity SRP 처음부터 시작하기 3 - 최적화 (3) | 2020.07.19 |
- Total
- Today
- Yesterday
- C#
- SRP
- AABB
- batching
- RL
- 루빅스큐브
- 값 형식
- static batching
- 참조 형식
- value type
- MeshProcessing
- CollisionDetection
- Unreal
- 강화학습
- normalized device coordinate
- NDC
- Scriptable Render Pipeline
- 유니티
- collision detection
- VTK
- Mesh Processing
- Mesh
- Unity
- dynamic batching
- reference type
- RubiksCube
- opengl
- perspective projection
- Transformation
- transform
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |