2017-10-03 10 views
0

두 개의 동일한 개체와 두 개의 카메라가 있습니다. 내가 달성하고 싶은 것은 다음다른 개체를 기준으로 한 개체의 위치 및 회전 캡처

1), 카메라

2 상대 큐브의 위치와 회전) 큐브 B에 그 이동을 캡처 (카메라의 B에 있도록하는 I 큐브 A가 카메라에 보이는대로, 큐브 B가 정확히 보이는) 이동할 수있는

나는 다음과 같은 코드를 사용하여 위치에 있음을 일을 성공 :

positionDifference = CubeA.InverseTransformPoint(CameraA.transform.position); 

는 큐브 B에 그것을 전송하려면, 내가 할 :

cubeBpos = transform.InverseTransformPoint(CubeB.transform.localPosition);  

while (Mathf.Abs (cubeBpos.x + positionDifference.x) > 0.01f) { 
    if (cubeBpos.x + positionDifference.x > 0) { 
     CubeB.transform.position += new Vector3(-0.01f, 0, 0); 
    } 
    else if (cubeBpos.x + positionDifference.x < 0) { 
     CubeB.transform.position += new Vector3(+0.01f, 0, 0); 
    } 
    cubeBpos = transform.InverseTransformPoint(CubeB.transform.position); 
} 

어색하지만 작동합니다. 그러나 회전을 전송하려고하면 큐브 B가 원점을 중심으로 피벗을 시작합니다. 흥미롭게도 큐브 A를 월드 좌표로 이동하면 큐브 B가 로컬로 이동하고 그 반대의 경우도 마찬가지입니다. 현지에서 세계로의 좌표 번역이 문제라고 생각하지만 로테이션 코드가 순진하다고 생각합니다. 내가 먼저 다음과 같이 두 가지 방법으로 회전을 캡처하려고 :

rotationDifference = Quaternion.Inverse(CubeA.transform.rotation) * CameraA.transform.rotation; 

CubeB.transform.rotation = Quaternion.Inverse(rotationDifference); 

두 번째 시도 :

rotationDifference = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z); 

CubeB.transform.eulerAngles = rotationDifference; 

두 가지 접근법이 이상한 회전 오프셋 결과를. localPosition 및 localEulerAngles를 사용하여 시도했지만 도움이되지 않았습니다.

나는이 :) 할 수있는 현명한 방법이 바라고 있어요

편집 : 여기 프로젝트

답변

0

문제에 보관 link이다 그들은 서로 영향을 미치는 있지만 별도로 위치와 회전을 치료하는 것입니다 다른. 두 가지를 합치고 두 카메라와 두 큐브에 대한 모델 변환 (균질 행렬로 표현, 열 벡터를 가정 함)이 있다고 가정 해 보겠습니다.

TCameraA^-1 * TCubeA = TCameraB^-1 * TCubeB 

TCamera 그 모델이 카메라가 아닌 뷰 매트릭스 변환입니다 : 그럼, 우리는 것을, 큐브 B TCubeB에 대한 변환을 찾고 싶어요. 뷰 매트릭스가있는 경우에는 반대쪽을 그대로 두십시오. 우리는 즉시 TCubeB에 대해 해결할 수

:

TCameraB * TCameraA^-1 * TCubeA = TCubeB 

나는 유니티 API 너무 익숙하지 않아요하지만 당신은 직접 변환 행렬을 사용할 수없는 것처럼 보인다. 우리는 단순히 수행하여 각각의 사원 수를 계산할 수 있습니다, 우리는 회전에 대해에만 관심이있는 경우

TrCameraB * RCameraB * (TrCameraA * RCameraA)^-1 * TrCubeA * RCubeA = TrCubeB * RCubeB 
TrCameraB * RCameraB * RCameraA^-1 * TrCameraA^-1 * TrCubeA * RCubeA = TrCubeB * RCubeB 

: 그럼 회전 부분 R 및 병진 부분 Tr의 변환 행렬 T을 분할 할 수

QCameraB * QCameraA^-1 * QCubeA = QCubeB 

번역이 조금 더 어려워집니다.

의사 코드에서
TrCameraB * RCameraB * RCameraA^-1 * TrCameraA^-1 * TrCubeA * RCubeA * RCubeB^-1 * (0, 0, 0, 1) 

,이 귀결 : 우리는

TrCameraB * RCameraB * RCameraA^-1 * TrCameraA^-1 * TrCubeA * RCubeA * RCubeB^-1 = TrCubeB 

간단히 왼쪽에 원점을 곱하면, 변환 벡터를 찾으려면 있도록, 번역 변환을 찾을 필요 나는 거의 유니티 API를 알고, 다시

Vector4 translation = (0, 0, 0, 1) 
translation += TrCubeA 
translation -= TrCameraA 
translation = RCameraA.Inverse().Transform(translation) 
translation = RCameraB.Transform(translation) 
translation += TrCameraB 

을 그리고 내가 TRANSFORMA에 (규칙을보다 몇 가지 다른 규칙을 사용할 수 있습니다 : (나타나는 행렬은 각각의 변환 벡터 스탠드) 수학은 특히 까다 롭습니다.) 그러나 뭔가 잘못되었을 때 위의 파생어를 적용 할 수 있다고 확신합니다.

+0

고맙습니다. 니코! 내가 유니티에 적응하는 방법을 잘하지 않았다,하지만이 함께 결국, 내가 원하는 것을 수행합니다 \t \t'Vector3 번역 = 새로운 Vector3 (0, 0, 0)' \t \t'번역 + = cubeA.transform.position;' \t \t '번역 - = cameraA.transform.position,'' \t \t = cameraA.transform.InverseTransformPoint 변환 (번역)'' \t \t 번역 = cameraB.transform.TransformPoint (번역/2); \t \t'cubeB.transform.position = translation; ' \t \t'쿼터니언 회전 = Quaternion.identity,' \t \t'회전 = Quaternion.Inverse (cameraA.transform.rotation)' \t \t'cubeB.transform.rotation = 회전,' –

0

니코의 큰 대답은 내 문제를 해결하지만, 코드 서식 코멘트 섹션에서이 위해 만들어진되지 않았습니다 때문에, 여기에 내가 니코의 답변에 따라 통일을 위해 쓴 코드입니다 :

Vector3 translation = new Vector3(0,0,0); 
    translation += cubeA.transform.position; 
    translation -= cameraA.transform.position; 
    translation = cameraA.transform.InverseTransformPoint(translation); 
    translation = cameraB.transform.TransformPoint(translation/2); 

    cubeB.transform.position = translation; 

    Quaternion rotation = Quaternion.identity; 
    rotation = cameraB.transform.rotation * Quaternion.Inverse(cameraA.transform.rotation) * cubeA.transform.rotation; 

    cubeB.transform.rotation = rotation; 

그것은 일이 아니다 내가 원했던 것을 달성했다. 큐브 A가 고정되어 있고 카메라 A가 그 주위를 움직인다면, 큐브 B는 카메라 B와 관련하여 큐브 A와 큐브 B가 항상 똑같은 위치와 각각의 카메라와 관련된 회전.

+0

난 당신이 줄을 제거해야한다고 생각 'translation - = cameraA.transform.position'입니다. 이것은 이미 다음 역수의 일부이기 때문입니다. 어쩌면 이것이 마지막 줄에'translation/2 '을 가지고있는 이유일까요? 그렇지 않으면 올바르게 보입니다. 천만에요. –