개체를 카메라보기로 회전

Aug 20 2020

나는 이것을 가능한 한 명확하게하려고 노력한다.

출발점

장면의 중심 (0,0,0)에 개체를 배치합니다. 그런 다음 물체 주변의 반구에 고정 반경이 지정된 카메라를 배치하고 (Constraints를 사용하여 항상 물체를 바라 보도록) 이미지를 렌더링합니다. 이 다른 규칙을 사용하는 다른 라이브러리에서 열려면 개체를 y-up 및 minus-z-forward를 사용하여 .stl로 내 보냅니다.

문제

렌더링 된 이미지의 뷰에 해당하는 방식으로 개체를 회전하고 싶습니다.

접근하다

방위각과 고도에 대한 각도가 알려져 있습니다. 따라서 두 각도가 주어지면 회전 행렬을 계산합니다 (동종 회전 행렬이 필요하므로 0과 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)))

회전이 제대로 보이지 않습니다. & 몇 가지 문제가있을 수 있다고 생각합니다.

  • 축 방향 변경에 대해 놓친 것이 있습니까?
  • 물체의 회전을 계산하기 위해 구 좌표를 계산하는 데 동일한 각도를 사용할 수도 있습니까?

아이디어가 있습니까?

답변

1 batFINGER Aug 25 2020 at 21:33

카메라에 개체 정렬

이렇게하면 카메라 뷰에 개체를 추가하고 ALIGN to VIEW

기본적으로 블렌더 오브젝트는 -Y를 향하고 Z가 위로 향합니다. 반면에 카메라는 Y를 위로하고 -Z를 내려다 봅니다.

객체 매트릭스를 위치, 회전 및 크기로 분해 한 다음 재구성 할 수 있습니다.

이 경우 카메라 매트릭스 세계의 회전 부분을 가져 와서 -Y 앞으로 및 Z 위로 변환 한 다음 원래 배율 및 변환을 사용하여 개체로 재구성합니다.

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