티스토리 뷰

목차

1. 큐브가 없으니 큐브를 먼저 만들자

  1.1 Unity로 1x1 큐브 만들기

    1.1.1 Cube에 Color 입히기

  1.2 Rotation 구현

  1.3 2x2 큐브로 확장

  1.4 Random Shuffle 구현

  1.5 3x3 큐브로 확장

 

2. 큐브가 있으니 강화학습으로 맞춰보자

 

-------------------------------------------------------------------

1.4 Random Shuffle 구현

 

이번 포스팅에서는 2x2x2 Cube를 Random으로 Shuffle 해주는 기능을 구현해 보겠습니다.

 

이전 포스팅에서 우리는 2x2x2 Cube를 만들고 Union, Line Rotation을 구현해 보았습니다. 이전 포스팅을 참고하시거나 영상을 참고하시면 될 것 같습니다.

TwobyTwoRubiksCube.mp4
4.11MB

 

그러면 이제 Cube를 맞춰야 합니다. Cube를 맞추기 위해서는 2가지가 필요하죠. 1. Cube, 2. 섞여있는 상태!!!!

그래서 이번에는 Cube를 키를 누르면 마음대로 섞어주는 기능을 만들어보겠습니다.

 

1.4.1 Random으로 Line 및 Direction 선택

 

먼저 Random으로 Line 및 Direction을 선택하기 위해서는 Random으로 숫자를 골라야겠죠? 저는 Line이 4가지, Direction이 각 Line마다 2가지 이므로 Line은 0~3까지, Direction은 0,1 값을 뽑아주었습니다. 그리고 그 값에 따라 Line과 Direction을 선택해주는 함수를 만들었습니다.

Random으로 Direction 선택
Line 선택 함수 - randomLineValue를 인자로 넣으면 Line이 선택된다.

1.4.2 Setting

 

Line과 Direction 값을 선택해주었으니 Rotation만 시켜주면 됩니다!

하지만 Random으로 섞을 때 Union Cube Rotation도 있기 때문에 0~9까지 랜덤으로 숫자를 선택하는 변수를 추가하여 7 이하면 Line, 이상이면 Union Cube를 Rotation 하도록 하였습니다.

Union, Line Cube 선택 변수 추가

이제 키보드 R키를 누르면 RandomValue들이 Setting 되는 함수를 만들어봅시다. Code는 아래와 같습니다. Flag는 true일 때 RandomShuffle을 실행하고, false면 하지 말라는 Flag가 되겠습니다!

키보드 R키를 눌렀을 때 RandomValueSetting 및 Flag를 true로 바꿔주는 함수

1.4.3 Run 함수 구현

 

그 다음 실제로 Rotation을 시켜주는 RunRandomSuffle 함수를 만들어 봅시다. 간단히 설명하자면 randomSize만큼 Rotation을 실행하고 각 Rotation은 randomValue들에 의해서 결정됩니다. 자세한 설명은 주석을 보시면 쉽게 이해할 수 있습니다. 

RandomSuffle 함수

이렇게 구성한 코드들을 Update에 추가해주면 됩니다! randomCount가 randomSize보다 작고 flag가 true라면 RandomShuffle을 진행하게 됩니다.

Update 함수

그럼 이제 이쁘게 짠 코드를 실행해보겠습니다. Code는 첨부해드린 두 cs 파일을 Asset 폴더에 넣고 Button에는 RubiksCube.cs파일을 연결해서 사용하시면 됩니다.(#1참고)

 

큐브 맞추는 기계 살 돈이 없어서 직접 만드는 글 #1

목차 1. 큐브가 없으니 큐브를 먼저 만들자 1.1 Unity로 1x1 큐브 만들기 1.2 Rotation 구현 1.3 2x2 큐브로 확장 1.4 Random Shuffle 구현 1.5 3x3 큐브로 확장 2. 큐브가 있으니 강화학습으로 맞춰보자 --------..

mathmakeworld.tistory.com

RandomSuffle.cs
0.00MB
RubiksCube.cs
0.01MB

결과 영상은 다음과 같습니다.

RandomShuffle.mp4
6.13MB

 

다음 포스팅에서는..... 어라??

 

 

 

 

1.4.4 부동 소수점 오차 문제 해결

 

영상을 틀어보거나 코드를 돌려보신 분들은 결과가 이상하게 되는 것을 확인하셨을 겁니다. 이런 결과가 나오는 이유는 Code가 똥인게 아니라..... Rotation을 하면서 부동 소수점 오차가 계속 쌓이게 되어 Cube의 위치가 조금씩 틀어지는 문제가 생기기 때문입니다. 부동 소수점 문제는 아래 Tstroy에서 잘 설명해주고 계셔서 가져왔습니다.

 

부동소수점 오차 0.1

추가자료 : http://blog.naver.com/leojesus?Redirect=Log&logNo=80045980042 아이오 교육센터의 기술자료는 다양한 서적/문서를 참고해서 교육센터 자체로 만든 자료입니다. 마음대로 퍼가셔도 되지만 꼭 출처를.

3dmpengines.tistory.com

부동 소수점 오차 문제를 해결하기 위해서 Position과 Rotation값을 보정하는 함수를 생성하고, 그 함수를 Rotation이 끝날 때마다 호출하여 보정해줍니다.

 

1.4.4.1 Recompute Position

 

먼저 부동 소수점 오차는 아주 작은 값이고 Cube 특성상 Rotation뒤의 위치가 고정이기 때문에 반올림으로 해결할 수 있습니다. Position 값은 하위 Cube들을 찾아서 자신의 Position 값을 반올림하여 보정합니다.

Position 보정

1.4.4.1 Recompute Rotation

 

다음은 Rotation 값을 보정해주겠습니다. Rotation 값은 그냥 반올림하기에는 0~360이라는 제한이 있기 때문에 강제로 보정을 진행해주었습니다. RotationValueCheck 함수를 활용하여 값을 재설정해줍니다.

Rotation 보정

이제 이 함수들을 매번 Rotation을 한 다음 호출해주게 되면 다음 영상과 같이 제대로 작동하는 것을 확인할 수 있습니다. 전체 Code를 보시면서 하시면 이해하기 쉬울 것 같습니다.

RandomSuffle.cs
0.00MB
RubiksCube.cs
0.02MB
RandomShuffle with RecomputeValue.mp4
6.30MB

 

다음 포스팅에서는 2x2 cube skill들을 추가해보도록 하겠습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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 31
글 보관함