У меня есть 3D-модель в единстве. Я вычисляю вектор поворота и перемещения, используя вектор opencv solvePnP.
Теперь я пытаюсь установить положение модели с этими значениями. Мой код C # ниже:
Vector3 objPosition;
objPosition.x = gameObject.transform.position.x + tvec.x;
objPosition.y = gameObject.transform.position.y + tvec.y;
objPosition.z = gameObject.transform.position.z + tvec.z;
gameObject.transform.position = objPosition;
Quaternion quat = new Quaternion(rvec.x, rvec.y, rvec.z, 1.0f);
gameObject.transform.rotation = quat;
Но результат не соответствует действительности для меня. Как я могу использовать вращение OpenCV и вектор перевода в единстве?
РЕДАКТИРОВАТЬ
У меня есть 3d модель. Я определяю точку соответствия на объекте и модели вручную. Я хочу нанести на 2D изображение, содержащее известный объект. Я получаю отношения камеры и объекта, используя solvePnp
,
Я использую, чтобы показать 3d модель на сцене единства, вращение opencv и вектор перевода. Может быть, я должен изменить свой вопрос.
Как я могу определить положение и ориентацию объекта, используя 3d-2D точечные соответствия?
Посмотрите на Документация Unity для вычислений Эйлера-Кватерниона
Quaternion quat = Quaternion.Euler(new Vector3(rvec.x, rvec.y, rvec.z))
если rvec — это Vector3, определяющий направление, в котором должен выглядеть элемент, вы можете использовать LookRotation:
transform.rotation = Quaternion.LookRotation(rvec, Vector3.up);
Как правило, вам следует избегать работы с кватернионными значениями. Они слишком сложны, чтобы их можно было правильно обрабатывать, и вместо этого вы должны думать о направлении относительно вектора повышения, что и делает LookRotation. Я не вижу, что именно делает rvec, лучше всего было бы подать вектор направления.
Так, например, вектор вверх для вашего элемента — это вектор вверх. Вы хотите, чтобы предмет смотрел вверх справа (45, 45, 45). Тогда вы делаете:
transform.rotation = Quaternion.LookRotation(new Vector3(45,45,45),
Vector3.up);
но магия в том, что ваш объект не становится эйлером 45,45,45, потому что эйлер и кватернион не имеют отношения 1 к 1.