Ruota un oggetto per visualizzare la telecamera
Cerco di renderlo il più chiaro possibile:
Punto di partenza
Posiziono un oggetto al centro (0,0,0) della scena. Quindi posiziono una telecamera con un raggio fisso su un emisfero attorno all'oggetto (e uso Vincoli per far sì che guardi sempre l'oggetto) e renderizzo l'immagine. Esporto l'oggetto come .stl con y-up e meno-z-forward, per aprirlo con un'altra libreria che utilizza questa diversa convenzione.
Problema
Vorrei ruotare l'oggetto in modo tale che corrisponda alla vista dell'immagine renderizzata.
Approccio
Gli angoli per l'azimut e l'elevazione sono noti. Quindi calcolo la matrice di rotazione dati i due angoli (ho bisogno di una matrice di rotazione omogenea, aggiungendo quindi 0 e 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 rotazione non sembra corretta. E sento che potrebbero esserci diverse cose che non vanno:
- Mi sono perso qualcosa riguardo al cambio di orientamento degli assi?
- È anche possibile utilizzare gli stessi angoli per calcolare le coordinate della sfera per calcolare la rotazione dell'oggetto?
Hai qualche idea?
Risposte
Allinea l'oggetto alla fotocamera
Ciò darà lo stesso risultato dell'aggiunta di un oggetto nella vista della telecamera e dell'utilizzo di ALIGN to VIEW
Per impostazione predefinita, un oggetto frullatore è rivolto verso -Y e ha Z in alto. La fotocamera invece guarda in basso -Z con Y in alto.
Può scomporre una matrice di oggetti nella sua posizione, rotazione e scala e quindi ricomporre.
In questo caso si ottiene la parte di rotazione del mondo della matrice della telecamera, trasformata in -Y in avanti e Z in alto quindi ricomposta nell'oggetto con la sua scala e traslazione originali.
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()
)