Повернуть объект в поле зрения камеры
Я стараюсь прояснить это как можно более ясно:
Отправная точка
Я помещаю объект в центр (0,0,0) сцены. Затем я размещаю камеру с заданным радиусом на полусфере вокруг объекта (и использую ограничения, чтобы она всегда смотрела на объект) и визуализирую изображение. Я экспортирую объект как .stl с y-up и minus-z-forward, чтобы открыть его с помощью другой библиотеки, которая использует это другое соглашение.
Проблема
Я хочу повернуть объект так, чтобы он соответствовал виду визуализированного изображения.
Подход
Углы азимута и возвышения известны. Итак, я вычисляю матрицу вращения с учетом двух углов (мне нужна однородная матрица вращения, добавляя, таким образом, 0 и 1).
def angles_to_matrix(phi, theta):
# phi describes the azimuth
azi = phi
# theta describes the inclination angle, thus:
ele = radians(90) - theta
rol = 0
e1 = cos(rol) * cos(azi) - sin(rol) * cos(ele) * sin(azi)
e2 = sin(rol) * cos(azi) + cos(rol) * cos(ele) * sin(azi)
e3 = sin(ele) * sin(azi)
e4 = -cos(rol) * sin(azi) - sin(rol) * cos(ele) * cos(azi)
e5 = -sin(rol) * sin(azi) + cos(rol) * cos(ele) * cos(azi)
e6 = sin(ele) * cos(azi)
e7 = sin(rol) * sin(ele)
e8 = -cos(rol) * sin(ele)
e9 = cos(ele)
return np.array(((e1, e2, e3, 0), (e4, e5, e6, 0), (e7, e8, e9,0 ), (0, 0, 0, 1)))
Вращение не выглядит правильным. И я чувствую, что может пойти не так, как надо:
- Я что-то пропустил по поводу смены ориентации оси?
- Можно ли вообще использовать одни и те же углы для вычисления координат сферы для вычисления вращения объекта?
У тебя есть идеи?
Ответы
Выровнять объект по камере
Это даст тот же результат, что и добавление объекта в поле обзора камеры, и использование ALIGN to VIEW
По умолчанию объект блендера смотрит на -Y и имеет Z вверх. С другой стороны, камера смотрит вниз -Z с Y вверх.
Может разложить матрицу объектов на ее расположение, поворот и масштаб, а затем перекомпоновать.
В этом случае получите вращающуюся часть мира матрицы камеры, преобразованную в -Y вперед и Z вверх, а затем перекомпонованную в объект с его исходным масштабом и перемещением.
import bpy
from mathutils import Vector, Matrix
from bpy import context
from bpy_extras.io_utils import axis_conversion
scene = context.scene
cam_ob = scene.camera
ob = context.object
A = axis_conversion(
from_forward='Z',
from_up='-Y',
to_forward='Y',
to_up='Z').to_4x4()
loc, rot, scale = cam_ob.matrix_world.decompose()
ob.matrix_world = (
Matrix.Translation(ob.matrix_world.to_translation()) @
(rot.to_matrix().to_4x4() @ A) @
Matrix.Diagonal(ob.matrix_world.to_scale()).to_4x4()
)