Putar objek ke tampilan kamera

Aug 20 2020

Saya mencoba membuat ini sejelas mungkin:

Titik pangkal

Saya menempatkan objek di tengah (0,0,0) pemandangan. Kemudian saya menempatkan kamera yang diberi radius tetap pada belahan di sekitar objek (dan menggunakan Constraints agar selalu melihat objek) dan membuat gambar. Saya mengekspor objek sebagai .stl dengan y-up dan minus-z-forward, untuk membukanya dengan pustaka lain yang menggunakan konvensi berbeda ini.

Masalah

Saya ingin memutar objek sedemikian rupa sehingga sesuai dengan tampilan gambar yang diberikan.

Pendekatan

Sudut untuk azimuth dan elevasi diketahui. Jadi saya menghitung matriks rotasi mengingat dua sudut (saya membutuhkan matriks rotasi homogen, sehingga menambahkan 0s dan 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)))

Rotasi tidak terlihat benar. & Saya merasa mungkin ada beberapa hal yang salah:

  • Apakah saya melewatkan sesuatu tentang perubahan orientasi sumbu?
  • Apakah mungkin menggunakan sudut yang sama untuk menghitung koordinat bola untuk menghitung rotasi benda?

Apakah kamu punya ide

Jawaban

1 batFINGER Aug 25 2020 at 21:33

Sejajarkan objek dengan kamera

Ini akan memberikan hasil yang sama seperti menambahkan objek dalam tampilan kamera, dan menggunakan ALIGN to VIEW

Secara default, objek blender menghadap -Y dan memiliki Z ke atas. Kamera di sisi lain melihat ke bawah -Z dengan Y ke atas.

Dapat menguraikan matriks objek menjadi lokasinya, rotasi dan skalanya, dan kemudian menyusun ulang.

Dalam hal ini dapatkan bagian rotasi dari dunia matriks kamera, diubah menjadi -Y maju dan Z ke atas kemudian dikomposisikan ulang menjadi objek dengan skala dan terjemahan aslinya.

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