Girar un objeto a la vista de cámara
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
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()
)