Girar un objeto a la vista de cámara

Aug 20 2020

Intento dejar esto lo más claro posible:

Punto de partida

Coloco un objeto en el centro (0,0,0) de la escena. Luego coloco una cámara con un radio fijo en un hemisferio alrededor del objeto (y uso Restricciones para que siempre mire al objeto) y renderizo la imagen. Exporto el objeto como .stl con y-up y minus-z-forward, para abrirlo con otra biblioteca que use esta convención diferente.

Problema

Me gustaría rotar el objeto de tal manera que corresponda a la vista de la imagen renderizada.

Acercarse

Se conocen los ángulos de acimut y elevación. Entonces calculo la matriz de rotación dados los dos ángulos (necesito una matriz de rotación homogénea, agregando así los 0 y 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)))

La rotación no parece correcta. & Creo que podría haber varias cosas que salgan mal:

  • ¿Me perdí algo relacionado con el cambio de orientación del eje?
  • ¿Es posible utilizar los mismos ángulos para calcular las coordenadas de la esfera para calcular la rotación del objeto?

¿Tienes alguna idea?

Respuestas

1 batFINGER Aug 25 2020 at 21:33

Alinear el objeto a la cámara

Esto dará el mismo resultado que agregar un objeto en la vista de cámara y usar ALIGN to VIEW

Por defecto, un objeto de mezclador se enfrenta a -Y y tiene Z hacia arriba. Por otro lado, la cámara mira hacia abajo -Z con Y hacia arriba.

Puede descomponer una matriz de objetos en su ubicación, rotación y escala, y luego recomponerla.

En este caso, obtenga la parte de rotación del mundo de la matriz de la cámara, transformada en -Y hacia adelante y Z hacia arriba, luego recomponga en el objeto con su escala y traslación originales.

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()
    )