2012-04-04 5 views
16

사람이 나에게 어떤 조언이나 제안을 줄 수운동 2D에서 3D

나는 사진의 개체 한 위치에서 다른 위치로 이동이 얼마나 찾을 필요

(물론 실제로 나는 카메라가 얼마나 많은 계산해야 2 개의 이미지 사이를 움직였습니다. 그러나 물체가 정지 상태로 유지되고 Y 축에서 회전하기 때문에 이미지를 더 쉽게 움직일 수 있습니다). 이 예제와 거의 비슷하지만 복잡하지는 않습니다. enter image description here

그래서 내가 여기 enter image description here 의 예에 따라 큐브에 4 점을 rubiks 큐브의 첫 번째 사진을 촬영하고 선택한 이미지는 Texture2D과 파란색 동그라미의 전면의 4 점을 나타내는 것입니다 큐브를 선택합니다. 이 4 점은 목록에 저장되고 다음 이미지는 다음과 같이로드됩니다. enter image description here 다시 사용자는 이전과 동일한 얼굴의 4 개 점 (흰색면)을 선택해야합니다. 그런 다음이 4 점이 새 목록에 저장됩니다.

그래서 지금은 두 개의 목록을 가지고 enter image description here

하지만 더 중요한 것은 다음과 같이 나는 이미지 2 이미지 1에서 "전체 전면는"(/ 크기/회전 변환) 이동 얼마나 많은 계산해야 , 3D로이 운동을 계산해야합니다! 따라서 첫 번째 이미지의 경우 z- 구성 요소 = 0이라고 가정합니다. 예를 들어 이미지 1의 왼쪽 상단을 가정합니다. (10, 10, 0).

이미지 2의 얼굴이 3D 공간에서 움직일 수있는 특정 방식으로 회전/확대/축소 된 경우 "가정"할 수있는 방법이 있습니까? 따라서 이미지 2의 왼쪽 상단이 이미지 1 (시작 이미지)의 왼쪽 상단에있는 경우 카메라가 오른쪽으로 이동해야합니다. 그리고 같은 점이 포인트의 위 또는 아래로 갈 것입니까? 회전에 관해서는 이미지 1의 점과 이미지 2의 점 사이의 각도를 계산할 수 있을까요? 그리고 카메라가 얼마나 회전했는지 계산할 수 있습니까?

제 코드의 경우 이런 식으로 생각하고 있었습니까? 운동

// Image 1 coordinates for the front face 
// Assume z = 0 
cube1 = new List<Vector3>(); 
cube.Add(new Vector3(10, 10, 0)); 
cube.Add(new Vector3(20, 10, 0)); 
cube.Add(new Vector3(10, 20, 0)); 
cube.Add(new Vector3(20, 20, 0)); 

// Get image 2 coordinates 
cube2 = new List<Vector3>(); 
cube.Add(new Vector3(newX, newY, ?)); // Keep Z = 0? 
cube.Add(new Vector3(newX, newY, ?)); 
cube.Add(new Vector3(newX, newY, ?)); 
cube.Add(new Vector3(newX, newY, ?)); 

*이 ....

// Rotation 
Matrix rotation = Matrix.CreateFromAxisAngle( 
Vector3.Normalize(new Vector3(?, ?, ?)), MathHelper.ToRadians(?)); // Not sure here 
List<Vector3> imageAfterRotation = transformListOfVertices(cube, rotation); 
+1

포인트는 규칙을 준수해야합니까? 그들은 모두 같이 있어야합니다처럼? – MerickOWA

+0

그래, 응용 프로그램의 목적을 위해 모든 지점은 동일 평면에있는 것으로 간주됩니다. 따라서 사용자는 큐브의 한 면만 선택할 수 있으며 모든 점은 하나의 평면에 있다고 간주됩니다 – heyred

답변

2

월드 행렬을 왼쪽 또는 오른쪽으로 단지 각 지점은

//Translation 
Matrix translating = Matrix.CreateTranslation(new Vector3(amountMovedX, amountMovedY, 0)); 
List<Vector3> imageAfterTranslating = transformListOfVertices(imageAfterScaling, translating); 

그리고 스큐에 대한 (임 조금 붙어)

이동 얼마나 많은 계산 뷰 매트릭스 (카메라의) * 투영 (카메라의) = 변환 매트릭스

cube1 = 초기 위치라고 가정합니다. 동안 무엇을 렌더링 일이 발생
은 다음과 같습니다 cube1 * transformMatrix = 출력 매트릭스

난 당신이 올바른 이해한다면 : 귀하의 의견은 사용자가 카메라 매트릭스 (보기) 만
(카메라 =보기 * 프로젝션) 을 변경할 수 있습니다 그리고 카메라를 업데이트 한 후에 큐브의 새로운 변형을 찾고 싶습니다.

그래서 당신이 반전 작업을 수행해야합니다

outputmatrix/transformMatrix = cube1 매트릭스는 각도, 움직임을 추출 할 수 있습니다 새로운 cube1 결과 매트릭스에서 (당신이 필요합니다 새)

따라서 문제는 구현할 대상이 아니라 "구현 대상"과 관련이 있습니다.
(내가 원하는 명령과 코드로 familir을 보았습니다)

이 정보가 도움이되기를 바랍니다.