Ruota un oggetto per visualizzare la telecamera

Aug 20 2020

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

1 batFINGER Aug 25 2020 at 21:33

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