2014-05-08 3 views
0

6 개의 벽이 각각 다른 색으로 된 큐브를 상상해보십시오. 큐브는 중심점을 중심으로 임의의 방향으로 회전합니다. 사용자가 화면을 클릭하거나 탭하면 회전이 즉시 중지됩니다. 큐브는 임의의 위치에서 고정됩니다. 사용자가 마우스 버튼을 놓거나 손가락을 화면에서 위로 움직이면 큐브는 가능한 한 가장 작은 각도로 어떤 축을 중심으로 회전해야하며 '화면 평면'에 가장 눈에 띄는 큐브 벽을 표시하기에 충분해야합니다. 모든 모서리가 화면 모서리와 평행 한 방식입니다.반올림 3D 랜덤 큐브 회전이 90도까지 확대

순환 행렬 또는 쿼터니언 중 하나를 사용하여 '고정'위치에 액세스 할 수 있다고 가정 할 때이 가장 가까운 '직선'회전을 찾는 방법이 있습니까? 행렬의 맨 3 × 3 부분에 보는

+0

동시에 여러 축을 따라 회전하는 것이 어렵지 않은 경우, 임의의 90 ° 트윈을 사용하여 큐브를 계속 회전시킨 다음 탭하면 더 이상 트윈을 생성하지 않고 마지막 트윈이 큐브를 사용자 위치에서 끝냅니다. 필요. – opyate

답변

2

한 가지 방법은, 같은 기저 벡터의 단지 설명 점입니다 당신은 점 하나를 적용하는 경우 : 당신이 것을 적용 할 경우

[A D G] [x] [A*x + D*y + G*z]  [A]  [D]  [G] 
[B E H] [y] = [B*x + E*y + H*z] = x * [B] + y * [E] + z * [H] 
[C F I] [z] [C*x + F*y + I*z]  [C]  [F]  [I] 

즉, 행렬을 입력하면, 입력 x 축은 (A, B, C)를 따라 실행을 끝내고, 입력 y 축은 (D, E, F)를 따라 실행을 끝내고 입력 z 축은 (G, H, 나는).

내가 생각하는 것 "어느 축이 출력 z에서 가장 작은 변화가 있습니까? 즉 화면에 수직으로 가장 가깝습니다"와 동일합니까? 그래서 당신은 (C, F, I)에서 최소 크기를 가진 값을 찾아서 결정할 수 있습니다.

그런 다음 (A, B, C)와 (D, E, F)가 교차하는 제품의 z 기호를 사용하여 허용되는 것과 동일한 논리로 축을 긍정적 또는 부정적으로 바라 볼지 여부를 결정할 수 있습니다 이 테스트를 역 얼굴 제거에 사용하십시오 - 카메라가 가상으로 무한대로 뒤로 이동하면 볼 수있는 얼굴이 진실로 앞에 있습니다.

그럴 수도있는 대안 테스트를 제안합니다. 변형과 수직에 가장 가까운 얼굴 중 가장 눈에 잘 띄는 것이 가장 큰 것입니다. 램버트 라이팅 모델의 뒤에있는 논리는 얼굴이 균일 한 크기였습니다. 테스트의 장점은 오 클루 전 쿼리를 사용하여 GPU에서 직접 할 수 있다는 것입니다. 그들 중 실제로 occluded입니다.

+0

감사합니다. @ 토미! 당신은 저를 최종 해결책으로 인도했습니다 :-). 모든 "직선화 된"회전 행렬에서와 같이 항상 각 행/열에 -1 또는 1 만 존재하므로 다음 알고리즘으로 끝납니다 : (1) (C, F, I)에서 가장 큰 크기를 찾고 새로운 '주차'행렬에 대한 가치의 신호.(2) 나머지 4 개의 행렬 원소 (A, B, D, E, G, H - 단계 (1)에서 선택된 원소 위의 2가없는)에서 가장 큰 크기를 찾아 값의 부호를 새로운 ' 주차 '매트릭스. (3) 남은 값의 신호를 새로운 '주차'행렬에 저장하십시오. (4) 다른 모든 값에 0을 저장하십시오. – Voyteck

0

간단한 해결책.

1)

카메라 큐브 센터에서 2) 벡터,

3) 빌드가 dir2는하자가 DIR1하자, 필요한 벽을 찾아 벽의 중앙에 큐브 센터에서 벡터를 구축 이 벡터 사이의 쿼터니언 "rotation_arc". http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/index.htm

4) "3)"

을 찾으려면 벽에서 사원 수로 큐브를 회전 : 벽의 중심에 큐브의 중심에서 6 개 벡터를 구축 할 수 있습니다. 큐브의 중심에서 카메라까지 빌드 벡터보다. 첫 번째 벡터와 두 번째 벡터 사이의 6 개 각도를 추정하고 가장 작은 각도의 벽을 선택하십시오.

+0

감사합니다. @minorlogic. 이렇게하면 필요한 벽이 화면에 표시되지만 기본 질문 인 "필요한 벽 찾기 ** _"가 표시되지 않습니다. 또한 벽이 정면 벽에 직각인지 화면 가장자리에 평행하게 놓이는 지 확신 할 수 없습니다 (나는 무작위 각도로 표시 될지도 모르지만 그 점을 확인하지는 않습니다). – Voyteck

+0

또한 간단합니다. 큐브 중심에서 벽 중심까지 6 개의 벡터를 만듭니다. 큐브의 중심에서 카메라까지 빌드 벡터보다. 첫 번째 벡터와 두 번째 벡터 사이의 6 개 각도를 추정하고 가장 작은 각도의 벽을 선택하십시오. – minorlogic