Blender V4.3
usd_writer_camera.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2019 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
6
7#include <pxr/usd/usdGeom/camera.h>
8#include <pxr/usd/usdGeom/tokens.h>
9
10#include "BKE_camera.h"
11#include "BLI_assert.h"
12
14
15#include "DNA_camera_types.h"
16#include "DNA_scene_types.h"
17
18namespace blender::io::usd {
19
21
23{
24 const Camera *camera = static_cast<const Camera *>(context->object->data);
25 return camera->type == CAM_PERSP;
26}
27
28static void camera_sensor_size_for_render(const Camera *camera,
29 const RenderData *rd,
30 float *r_sensor,
31 float *r_sensor_x,
32 float *r_sensor_y)
33{
34 /* Compute the final image size in pixels. */
35 float sizex = rd->xsch * rd->xasp;
36 float sizey = rd->ysch * rd->yasp;
37
38 int sensor_fit = BKE_camera_sensor_fit(camera->sensor_fit, sizex, sizey);
39 float sensor_size = BKE_camera_sensor_size(
40 camera->sensor_fit, camera->sensor_x, camera->sensor_y);
41 *r_sensor = sensor_size;
42
43 switch (sensor_fit) {
45 *r_sensor_x = sensor_size;
46 *r_sensor_y = sensor_size * sizey / sizex;
47 break;
49 *r_sensor_x = sensor_size * sizex / sizey;
50 *r_sensor_y = sensor_size;
51 break;
53 BLI_assert_msg(0, "Camera fit should be either horizontal or vertical");
54 break;
55 }
56}
57
59{
60 pxr::UsdTimeCode timecode = get_export_time_code();
61 pxr::UsdGeomCamera usd_camera = pxr::UsdGeomCamera::Define(usd_export_context_.stage,
63
64 const Camera *camera = static_cast<const Camera *>(context.object->data);
66
67 usd_camera.CreateProjectionAttr().Set(pxr::UsdGeomTokens->perspective);
68
69 /*
70 * For USD, these camera properties are in tenths of a world unit.
71 * https://graphics.pixar.com/usd/release/api/class_usd_geom_camera.html#UsdGeom_CameraUnits
72 *
73 * tenth_unit_to_meters = stage_meters_per_unit / 10
74 * tenth_unit_to_millimeters = 1000 * unit_to_tenth_unit
75 * = 100 * stage_meters_per_unit
76 */
77 const float tenth_unit_to_mm = 100.0f * scene->unit.scale_length;
78
79 float sensor_size, aperture_x, aperture_y;
80 camera_sensor_size_for_render(camera, &scene->r, &sensor_size, &aperture_x, &aperture_y);
81
82 usd_camera.CreateFocalLengthAttr().Set(camera->lens / tenth_unit_to_mm, timecode);
83 usd_camera.CreateHorizontalApertureAttr().Set(aperture_x / tenth_unit_to_mm, timecode);
84 usd_camera.CreateVerticalApertureAttr().Set(aperture_y / tenth_unit_to_mm, timecode);
85 usd_camera.CreateHorizontalApertureOffsetAttr().Set(
86 sensor_size * camera->shiftx / tenth_unit_to_mm, timecode);
87 usd_camera.CreateVerticalApertureOffsetAttr().Set(
88 sensor_size * camera->shifty / tenth_unit_to_mm, timecode);
89
90 usd_camera.CreateClippingRangeAttr().Set(
91 pxr::VtValue(pxr::GfVec2f(camera->clip_start, camera->clip_end)), timecode);
92
93 /* Write DoF-related attributes. */
94 if (camera->dof.flag & CAM_DOF_ENABLED) {
95 usd_camera.CreateFStopAttr().Set(camera->dof.aperture_fstop, timecode);
96
97 float focus_distance = BKE_camera_object_dof_distance(context.object);
98 usd_camera.CreateFocusDistanceAttr().Set(focus_distance, timecode);
99 }
100
101 auto prim = usd_camera.GetPrim();
102 write_id_properties(prim, camera->id, timecode);
103}
104
105} // namespace blender::io::usd
Camera data-block and utility functions.
float BKE_camera_sensor_size(int sensor_fit, float sensor_x, float sensor_y)
float BKE_camera_object_dof_distance(const struct Object *ob)
int BKE_camera_sensor_fit(int sensor_fit, float sizex, float sizey)
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:57
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
@ CAMERA_SENSOR_FIT_HOR
@ CAMERA_SENSOR_FIT_AUTO
@ CAMERA_SENSOR_FIT_VERT
@ CAM_PERSP
@ CAM_DOF_ENABLED
pxr::UsdTimeCode get_export_time_code() const
void write_id_properties(const pxr::UsdPrim &prim, const ID &id, pxr::UsdTimeCode=pxr::UsdTimeCode::Default()) const
const USDExporterContext usd_export_context_
USDCameraWriter(const USDExporterContext &ctx)
virtual bool is_supported(const HierarchyContext *context) const override
virtual void do_write(HierarchyContext &context) override
static void camera_sensor_size_for_render(const Camera *camera, const RenderData *rd, float *r_sensor, float *r_sensor_x, float *r_sensor_y)