c # — opencv: установить положение модели, используя вектор поворота и перемещения

У меня есть 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 точечные соответствия?

1

Решение

Посмотрите на Документация Unity для вычислений Эйлера-Кватерниона

Quaternion quat = Quaternion.Euler(new Vector3(rvec.x, rvec.y, rvec.z))
0

Другие решения

если 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.

0

По вопросам рекламы [email protected]