Drehen Sie ein Objekt in die Kameraansicht
Ich versuche dies so klar wie möglich zu machen:
Startpunkt
Ich platziere ein Objekt in der Mitte (0,0,0) der Szene. Dann platziere ich eine Kamera mit einem festgelegten Radius auf einer Halbkugel um das Objekt (und verwende Einschränkungen, damit es immer auf das Objekt schaut) und rendere das Bild. Ich exportiere das Objekt als .stl mit y-up und minus-z-forward, um es mit einer anderen Bibliothek zu öffnen, die diese andere Konvention verwendet.
Problem
Ich möchte das Objekt so drehen, dass es der Ansicht des gerenderten Bildes entspricht.
Ansatz
Die Winkel für Azimut und Höhe sind bekannt. Also berechne ich die Rotationsmatrix unter Berücksichtigung der beiden Winkel (ich brauche eine homogene Rotationsmatrix, also füge ich die Nullen und 1 hinzu).
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)))
Die Drehung sieht nicht richtig aus. & Ich habe das Gefühl, dass mehrere Dinge schief gehen könnten:
- Habe ich etwas bezüglich der Änderung der Achsenorientierung verpasst?
- Ist es überhaupt möglich, die gleichen Winkel für die Berechnung der Kugelkoordinaten zu verwenden, um die Drehung des Objekts zu berechnen?
Hast du eine Idee?
Antworten
Objekt an Kamera ausrichten
Dies führt zum gleichen Ergebnis wie das Hinzufügen und Verwenden eines Objekts in der Kameraansicht ALIGN to VIEW
Standardmäßig zeigt ein Mixer-Objekt nach -Y und hat Z nach oben. Die Kamera hingegen schaut nach unten - Z mit Y nach oben.
Kann eine Objektmatrix in ihre Position, Drehung und Skalierung zerlegen und dann neu zusammensetzen.
In diesem Fall wird der Rotationsteil der Kameramatrixwelt in -Y vorwärts und Z nach oben transformiert und dann mit seiner ursprünglichen Skalierung und Translation in das Objekt neu zusammengesetzt.
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()
)