Повернуть объект в поле зрения камеры

Aug 20 2020

Я стараюсь прояснить это как можно более ясно:

Отправная точка

Я помещаю объект в центр (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)))

Вращение не выглядит правильным. И я чувствую, что может пойти не так, как надо:

  • Я что-то пропустил по поводу смены ориентации оси?
  • Можно ли вообще использовать одни и те же углы для вычисления координат сферы для вычисления вращения объекта?

У тебя есть идеи?

Ответы

1 batFINGER Aug 25 2020 at 21:33

Выровнять объект по камере

Это даст тот же результат, что и добавление объекта в поле обзора камеры, и использование 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()
    )