Drehen Sie ein Objekt in die Kameraansicht

Aug 20 2020

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

1 batFINGER Aug 25 2020 at 21:33

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