J'ai deux objets identiques et deux caméras. Ce que je voudrais obtenir est la suivante:Position de capture et rotation d'un objet par rapport à un autre objet
1) Capturer la position et la rotation du cube A par rapport à la caméra A
2) Transfert à un cube que B, de sorte que dans l'appareil photo B (que je ne peut pas se déplacer), Cube B ressemble exactement comme Cube A regarde dans la caméra Un
j'ai réussi le faire avec la position avec le code suivant:
positionDifference = CubeA.InverseTransformPoint(CameraA.transform.position);
Pour le transférer sur Cube B, je fais:
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);
}
C'est maladroit, mais cela fonctionne. Cependant, lorsque j'essaie de transférer des rotations, le cube B commence à pivoter autour de l'origine. Fait intéressant, lorsque je déplace le cube A en coordonnées mondiales, le cube B se déplace en local, et vice versa. Je suppose que la traduction de coordonnées de local à monde est un problème, mais je pense aussi que mon code de rotation est naïf. J'ai essayé de capturer la rotation de deux manières, d'abord comme ceci:
rotationDifference = Quaternion.Inverse(CubeA.transform.rotation) * CameraA.transform.rotation;
CubeB.transform.rotation = Quaternion.Inverse(rotationDifference);
Deuxième tentative:
rotationDifference = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z);
CubeB.transform.eulerAngles = rotationDifference;
Les deux approches ont donné lieu à des décalages de rotation étranges. J'ai essayé d'utiliser localPosition et localEulerAngles, n'a pas aidé.
J'espère qu'il ya une façon plus intelligente de le faire :)
EDIT: Voici un Dropbox link au projet
Merci beaucoup Nico! Je ne savais pas comment l'adapter à l'unité, mais j'ai fini avec cela, il fait ce que je voulais: \t \t 'traduction Vector3 = new Vector3 (0,0,0),' ' \t \t Traduction + = cubeA.transform.position; '' \t \t traduction - = cameraA.transform.position; '' \t \t traduction = cameraA.transform.InverseTransformPoint (traduction); '' \t \t traduction = cameraB.transform.TransformPoint (traduction/2); ' \t \t' cubeB.transform.position = traduction; ' \t rotation \t 'Quaternion = Quaternion.identity,' ' \t \t rotation = Quaternion.Inverse (cameraA.transform.rotation)' ' \t \t cubeB.transform.rotation = rotation;' –