跳转到内容

artisan 数据类型

Artisan 数据类型

以下是 Artisan API 中最常用的数据类型。


Artisan API 中使用的数据类型

类型描述
AEGP_RenderLayerContextH渲染请求时的状态信息,由 After Effects 发送给 Artisan。
PR_RenderContextH定义渲染内容和方式的设置集合。
AEGP_SoundDataH用于给定图层的音频设置。
AEGP_RenderReceiptH由 Artisan 在渲染时使用。
AEGP_FrameReceiptH
AEGP_WorldH一帧像素。
AEGP_RenderOptionsH与渲染队列项相关的设置。

水平还是垂直?

After Effects 的矩阵是基于行的;OpenGL 的矩阵是基于列的。这意味着你需要做更多的工作。耶,可计费的时间!


实现与设计

Artisan 几乎是一个独立的应用程序。因为在 After Effects 5.0 的早期阶段,我们就意识到 3D 渲染中存在许多问题需要解决;例如交叉和阴影。

我们提供了一个 API,使我们和第三方(是的,我们确实使用自己的 API)可以实现任何所需的 3D 渲染方案。


3D 合成,而非建模

After Effects 不是 3D 建模应用程序。用户在响应模式下工作,仅在校对或最终输出时切换到更高质量。考虑提供至少两种质量模式,一种用于布局,另一种用于最终输出。在低质量模式下要注意渲染时间。


注册 Artisan

Artisan 是一个 AEGP,并且只有一个入口函数。Artisan 还必须注册自己的函数入口函数,并为此目的有一个特殊的回调。请参阅 AEGP_RegisterSuites5 中的 AEGP_RegisterArtisan()

此表显示了 Artisan 可以支持的函数,由 PR_ArtisanEntryPoints 定义:只有 render_func 是必需的。

Artisan 入口函数

PR_ArtisanEntryPoints
global_setup_func0仅在 GP_Main 之后调用一次。全局数据在所有插件实例之间共享。
如果在全局设置期间分配了内存,则必须在 global_setdown_func 期间释放它。
<pre lang="cpp">PR_GlobalSetupFunc(const PR_InData \*in_dataP, PR_GlobalContextH global_contextH,“ PR_GlobalDataH *global_dataPH);</pre>
global_setdown_func0释放你分配的任何全局数据。
<pre lang="cpp">PR_GlobalSetdownFunc(const PR_InData \*in_dataP, PR_GlobalContextH global_contextH,“ PR_GlobalDataH global_dataH);</pre>
global_do_about_func0向世界介绍你自己!使用 in_dataP>msg_func 显示你的对话框。
<pre lang="cpp">PR_GlobalDoAboutFunc(const PR_InData \*in_dataP, PR_GlobalContextH global_contextH,“ PR_GlobalDataH global_dataH);</pre>
setup_instance_func0分配并实例化此 Artisan 实例的特定数据。
<pre lang="cpp">PR_InstanceSetupFunc(const PR_InData \*in_dataP, PR_GlobalContextH global_contextH,PR_InstanceContextH instance_contextH, PR_GlobalDataH global_dataH,PR_InstanceFlags flags, PR_FlatHandle flat_dataH0,“ PR_InstanceDataH *instance_dataPH);</pre>
setdown_instance_func0释放并释放此 Artisan 实例的特定数据。
<pre lang="cpp">PR_InstanceSetdownFunc(const PR_InData \*in_dataP, PR_GlobalContextH global_contextH,PR_InstanceContextH instance_contextH, PR_GlobalDataH global_dataH,“ PR_InstanceDataH instance_dataH);</pre>
flatten_instance_func0在准备写入磁盘时展平你的数据。(确保它是操作系统独立的,如果你的 Artisan 是)。
<pre lang="cpp">PR_FlattenInstanceFunc(const PR_InData \*in_dataP, PR_GlobalContextH global_contextH,PR_InstanceContextH instance_contextH, PR_GlobalDataH global_dataH,PR_InstanceDataH instance_dataH, PR_FlatHandle *flatH);</pre>
do_instance_dialog_func0如果你的 Artisan 有额外的参数(通过其选项对话框访问),将调用此函数来获取和设置它们。
<pre lang="cpp">PR_DoInstanceDialogFunc(const PR_InData \*in_dataP, PR_GlobalContextH global_contextH,PR_InstanceContextH instance_contextH, PR_GlobalDataH global_dataH,PR_InstanceDataH instance_dataH, PR_DialogResult *resultP);</pre>
PR_DialogResultisPR_DialogResult_NO_CHANGEPR_DialogResult_CHANGE_MADE
frame_setup_func0执行渲染帧所需的任何设置(在渲染之前立即调用)。
<pre lang="cpp">PR_FrameSetupFunc(const PR_InData \*in_dataP, PR_GlobalContextH global_contextH,PR_InstanceContextH instance_contextH PR_RenderContextH render_contextH,PR_GlobalDataH global_dataH, PR_InstanceDataH instance_dataH,“ PR_RenderDataH *render_dataPH);</pre>
frame_setdown_func0释放 frame_setup 期间分配的任何设置数据(在渲染后立即发送)。
<pre lang="cpp">PR_FrameSetdownFunc(const PR_InData \*in_dataP, PR_GlobalContextH global_contextH,PR_InstanceContextH instance_contextH PR_RenderContextH render_contextH,PR_GlobalDataH global_dataH, PR_InstanceDataH instance_dataH,“ PR_RenderDataH render_dataH);</pre>
render_func渲染场景。
<pre lang="cpp">PR_FrameRenderFunc(const PR_InData \*in_dataP, PR_GlobalContextH global_contextH,PR_InstanceContextH instance_contextH PR_RenderContextH render_contextH,PR_GlobalDataH global_dataH, PR_InstanceDataH instance_dataH,“ PR_RenderDataH render_dataH);</pre>
query_func0Artisan 可以绘制自己的投影轴,如果需要的话。
After Effects 将调用此函数以获取合成世界与这些轴之间的变换,以及与屏幕内外预览绘制相关的许多其他函数(前者仅与交互式 Artisan 相关)。
<pre lang="cpp">PR_QueryFunc(const PR_InData \*in_dataP, PR_GlobalContextH global_contextH,PR_InstanceContextH instance_contextH PR_QueryContextH query_contextH,PR_QueryType query_type, PR_GlobalDataH global_dataH,“ PR_InstanceDataH instance_dataH);</pre>
PR_QueryType 可以是以下之一:
-PR_QueryType_NONE = 0
-PR_QueryType_TRANSFORM
-PR_QueryType_INTERACTIVE_WINDOW_DISPOSE
-PR_QueryType_INTERACTIVE_WINDOW_CLEAR
-PR_QueryType_INTERACTIVE_WINDOW_FROZEN_PROXY
-PR_QueryType_INTERACTIVE_SWAP_BUFFER
-PR_QueryType_INTERACTIVE_DRAW_PROCS
-PR_QueryType_PREPARE_FOR_LINE_DRAWING
-PR_QueryType_UNPREPARE_FOR_LINE_DRAWING
-PR_QueryType_GET_CURRENT_CONTEXT_SAFE_FOR_LINE_DRAWING
-PR_QueryType_GET_ARTISAN_QUALITY (CS6 新增)

世界是你的画布

AEGP_RenderTexture() 将图层的原始像素(未变换)提供到任意大小的缓冲区中。

AEGP_RenderLayer() 调用整个 After Effects 渲染管道,包括变换、遮罩等,提供图层在合成中的外观,并在合成大小的缓冲区中提供。

如果要渲染的图层是 3D 的,则调用默认的(标准 3D)Artisan 来执行任何 3D 几何操作。

你的 Artisan 可以使用它来渲染轨道遮罩图层,并仅以严格的 2D 方式将其应用于变换后的 3D 图层。

在渲染之前,After Effects 附带的 Artisan 会应用逆变换以获得方形像素,然后在显示之前重新应用变换。

例如,如果像素宽高比为 10/11(DV NTSC),我们乘以 11/10 以获得方形像素。我们处理和合成 3D 图层,然后重新除以以恢复原始像素宽高比。

以下套件提供了图层、合成、纹理和目标缓冲区。这是所有 Artisan 的重要套件。

AEGP_CanvasSuite8

函数用途
AEGP_GetCompToRender给定渲染时提供给 Artisan 的渲染上下文,返回合成的句柄。
AEGP_GetCompToRender(
PR_RenderContextH render_contextH,
AEGP_CompH *compPH)
AEGP_GetNumLayersToRender给定渲染上下文,返回 Artisan 需要渲染的图层数量。
AEGP_GetNumLayersToRender(
PR_RenderContextH render_contextH,
A_long *num_to_renderPL)
AEGP_GetNthLayerContextToRender用于在确定 Artisan 需要渲染的总图层数量后,构建要渲染的图层列表。
AEGP_GetNthLayerContextToRender(
PR_RenderContextH render_contextH,
A_long n,
AEGP_RenderLayerContextH *layer_indexPH)
AEGP_GetLayerFromLayerContext给定一个 AEGP_RenderLayerContextH,检索关联的 AEGP_LayerH(许多套件函数需要)。
AEGP_GetLayerFromLayerContext(
const PR_RenderContextH render_contextH,
AEGP_RenderLayerContextH layer_contextH,
AEGP_LayerH *layerPH);
AEGP_GetLayerAndSubLayerFromLayerContext允许渲染子图层(如 Photoshop 文件中的子图层)。
AEGP_GetLayerAndSubLayerFromLayerContext(
const PR_RenderContextH render_contextH,
AEGP_RenderLayerContextH layer_contextH,
AEGP_LayerH *layerPH,
AEGP_SubLayerIndex *sublayerP);
AEGP_GetTopLayerFromLayerContext当折叠几何体“开启”时,返回包含图层上下文的根合成中的图层。
当折叠几何体关闭时,这与 AEGP_GetLayerFromLayerContext 相同。
AEGP_GetTopLayerFromLayerContext(
const PR_RenderContextH r_contextH,
AEGP_RenderLayerContextH l_contextH,
AEGP_LayerH *layerPH);
AEGP_GetCompRenderTime给定渲染上下文,返回要渲染的当前(合成)时间点。
AEGP_GetNthLayerIndexToRender(
PR_RenderContextH render_contextH,
A_long *time,
A_long *time_step)
AEGP_GetCompDestinationBuffer给定渲染上下文,返回用于放置最终渲染输出的缓冲区。
AEGP_GetCompToRender(
PR_RenderContextH render_contextH,
AEGP_CompH compH,
PF_EffectWorld *dst);
AEGP_GetROI给定渲染时提供给 Artisan 的渲染上下文,返回合成的句柄。
AEGP_GetROI(
PR_RenderContextH render_contextH,
A_LegacyRect *roiPR);
AEGP_RenderTexture给定渲染上下文和图层,返回图层纹理。
所有以 ‘0’ 结尾的参数都是可选的;返回的 PF_EffectWorld 可以为 NULL。
AEGP_RenderTexture(
PR_RenderContextH render_contextH,
AEGP_LayerH layerH,
AEGP_RenderHints render_hints,
A_FloatPoint *suggested_scaleP0,
A_FloatRect *suggsted_src_rectP0,
A_Matrix3 *src_matrixP0,
PF_EffectWorld *render_bufferP);
AEGP_RenderHints 包含以下一个或多个:
- AEGP_RenderHints_NONE
- AEGP_RenderHints_IGNORE_EXTENTS
- AEGP_RenderHints_NO_TRANSFER_MODE(防止应用不透明度和传输模式;用于 RenderLayer 调用。)
AEGP_DisposeTexture释放获取的图层纹理。
AEGP_DisposeTexture(
PR_RenderContextH render_contextH,
AEGP_LayerH layerH,
AEGP_WorldH *dst0);
AEGP_GetFieldRender返回给定 PR_RenderContextH 的场设置。
AEGP_GetFieldRender(
PR_RenderContextH render_contextH,
PF_Field *field);
AEGP_ReportArtisanProgress给定渲染时提供给 Artisan 的渲染上下文,返回合成的句柄。
!!! 注意
在 macOS 上,这不是线程安全的;仅当当前线程 ID 为 0 时才使用此函数。
AEGP_ReportArtisanProgress(
PR_RenderContextH render_contextH,
A_long countL,
A_long totalL);
AEGP_GetRenderDownsampleFactor返回 PR_RenderContextH 的下采样因子。
AEGP_GetRenderDownsampleFactor(
PR_RenderContextH render_contextH,
AEGP_DownsampleFactor *dsfP);
AEGP_IsBlankCanvas确定 PR_RenderContextH 是否为空白(空)。
AEGP_IsBlankCanvas(
PR_RenderContextH render_contextH,
A_Boolean *is_blankPB);
AEGP_GetRenderLayerToWorldXform给定渲染上下文和图层(在给定时间),检索 4x4 变换以在它们的坐标空间之间移动。
AEGP_GetRenderLayerToWorldXform(
PR_RenderContextH render_contextH,
AEGP_RenderLayerContextH layer_contextH,
const A_Time *comp_timeP,
A_Matrix4 *transform);
AEGP_GetRenderLayerBounds检索 render_contextHlayer_contextH(在给定时间)的边界矩形。
AEGP_GetRenderLayerBounds(
PR_RenderContextH render_contextH,
AEGP_RenderLayerContextH layer_contextH,
const A_Time *comp_timeP,
A_LegacyRect *boundsP);
AEGP_GetRenderOpacity返回给定图层上下文在给定时间内的不透明度,在渲染上下文中。
AEGP_GetRenderOpacity(
PR_RenderContextH render_contextH,
AEGP_RenderLayerContextH layer_contextH,
const A_Time *comp_timePT,
A_FpLong *opacityPF);
AEGP_IsRenderLayerActive返回给定图层上下文在给定时间内是否在渲染上下文中处于活动状态。
AEGP_IsRenderLayerActive(
PR_RenderContextH render_contextH,
AEGP_RenderLayerContextH layer_contextH,
const A_Time *comp_timePT,
A_Boolean *activePB);
AEGP_SetArtisanLayerProgress设置渲染 Artisan 的进度信息。
- countL 是已完成的图层数量,
- num_layersL 是 Artisan 正在渲染的总图层数量。
AEGP_SetArtisanLayerProgress(
PR_RenderContextH render_contextH,
A_long countL,
A_long num_layersL);
AEGP_RenderLayerPlus类似于 AEGP_RenderLayer,但考虑了 AEGP_RenderLayerContextH
AEGP_RenderLayerPlus(
PR_RenderContextH r_contextH,
AEGP_LayerH layerH,
AEGP_RenderLayerContextH l_contextH,
AEGP_RenderHints render_hints,
AEGP_WorldH *bufferP);
AEGP_GetTrackMatteContext检索指定渲染和填充上下文的 AEGP_RenderLayerContextH
AEGP_GetTrackMatteContext(
PR_RenderContextH rnder_contextH,
AEGP_RenderLayerContextH fill_contextH,
AEGP_RenderLayerContextH *mattePH);
AEGP_RenderTextureWithReceipt将纹理渲染到 AEGP_WorldH 中,并提供操作的 AEGP_RenderReceiptH
返回的 receiptPH 必须使用 AEGP_DisposeRenderReceipt 释放。
AEGP_RenderTextureWithReceipt(
PR_RenderContextH render_contextH,
AEGP_RenderLayerContextH layer_contextH,
AEGP_RenderHints render_hints,
A_FloatPoint *suggested_scaleP0,
A_FloatRect *suggest_src_rectP0,
A_Matrix3 *src_matrixP0,
AEGP_RenderReceiptH *receiptPH,
AEGP_WorldH *dstPH);
AEGP_GetNumberOfSoftwareEffects返回给定 AEGP_RenderLayerContextH 中应用的软件效果数量。
AEGP_GetNumberOfSoftwareEffects(
PR_RenderContextH ren_contextH,
AEGP_RenderLayerContextH lyr_contextH,
A_short *num_sft_FXPS);
AEGP_RenderLayerPlusWithReceiptAEGP_RenderLayerPlus 的改进,此函数还提供了用于缓存的 AEGP_RenderReceiptH
AEGP_RenderLayerPlusWithReceipt(
PR_RenderContextH render_contextH,
AEGP_LayerH layerH,
AEGP_RenderLayerContextH layer_contextH,
AEGP_RenderHints render_hints,
AEGP_NumEffectsToRenderType num_effectsS,
AEGP_RenderReceiptH *receiptPH,
AEGP_WorldH *bufferPH);
AEGP_DisposeRenderReceipt释放 AEGP_RenderReceiptH
AEGP_DisposeRenderReceipt(
AEGP_RenderReceiptH receiptH);
AEGP_CheckRenderReceipt检查 After Effects 的内部缓存,以确定给定的 AEGP_RenderReceiptH 是否仍然有效。
AEGP_CheckRenderReceipt(
PR_RenderContextH current_contextH,
AEGP_RenderLayerContextH current_lyr_ctxtH,
AEGP_RenderReceiptH old_receiptH,
A_Boolean check_aceB,
AEGP_NumEffectsToRenderType num_effectsS,
AEGP_RenderReceiptStatus *receipt_statusP);
AEGP_GenerateRenderReceipt为图层生成 AEGP_RenderReceiptH,就好像前 num_effectsS 个效果已被渲染一样。
AEGP_GenerateRenderReceipt(
PR_RenderContextH current_contextH,
AEGP_RenderLayerContextH current_lyr_contextH,
AEGP_NumEffectsToRenderType num_effectsS,
AEGP_RenderReceiptH *render_receiptPH);
AEGP_GetNumBinsToRender返回 After Effects 希望 Artisan 渲染的 bin 数量。
AEGP_GetNumBinsToRender(
const PR_RenderContextH contextH,
A_long *num_binsPL);
AEGP_SetNthBin将给定的渲染上下文设置为 After Effects 要渲染的第 n 个 bin。
AEGP_SetNthBin(
const PR_RenderContextH contextH,
A_long n);
AEGP_GetBinType检索给定 bin 的类型。
AEGP_GetBinType(
const PR_RenderContextH contextH,
AEGP_BinType *bin_typeP);
AEGP_BinType 将是以下之一:
- AEGP_BinType_NONE
- AEGP_BinType_2D
- AEGP_BinType_3D
AEGP_GetRenderLayerToWorldXform2D3D检索变换以正确定向正在渲染的图层与输出世界。
传递 TRUEonly_2dB 以将变换限制为二维。
AEGP_GetRenderLayerToWorldXform2D3D(
PR_RenderContextH render_contextH,
AEGP_RenderLayerContextH layer_contextH,
const A_Time *comp_timeP,
A_Boolean only_2dB,
A_Matrix4 *transformP);
函数用途
AEGP_GetPlatformWindowRef获取平台特定的窗口上下文,用于绘制给定的 PR_RenderContextH
AEGP_GetPlatformWindowRef(
const PR_RenderContextH contextH,
AEGP_PlatformWindowRef *window_refP);
AEGP_GetViewportScale获取给定 PR_RenderContextH 的源到帧的下采样因子。
AEGP_GetViewportScale(
const PR_RenderContextH contextH,
A_FpLong *scale_xPF,
A_FpLong *scale_yPF);
AEGP_GetViewportOrigin获取源在帧内的原点(用于在两者之间进行转换),适用于给定的 PR_RenderContextH
AEGP_GetViewportOrigin(
const PR_RenderContextH contextH,
A_long *origin_xPL,
A_long *origin_yPL);
AEGP_GetViewportRect获取要绘制的区域的边界矩形,适用于给定的 PR_RenderContextH
AEGP_GetViewportRect(
const PR_RenderContextH contextH,
A_LegacyRect *v_rectPR);
AEGP_GetFallowColor获取给定 PR_RenderContextH 中用于休耕区域的颜色。
AEGP_GetFallowColor(
const PR_RenderContextH contextH,
PF_Pixel8 *fallow_colorP);
AEGP_GetInteractiveCheckerboard获取给定 PR_RenderContextH 的棋盘格是否当前处于活动状态。
AEGP_GetInteractiveCheckerboard(
const PR_RenderContextH contextH,
A_Boolean *cboard_onPB);
AEGP_GetInteractiveCheckerboardColors获取棋盘格中使用的颜色。
AEGP_GetInteractiveCheckerboardColors(
const PR_RenderContextH contextH,
PF_Pixel *color1P,
PF_Pixel *color2P);
AEGP_GetInteractiveCheckerboardSize获取棋盘格方块的宽度和高度。
AEGP_GetInteractiveCheckerboardSize(
const PR_RenderContextH contextH,
A_u_long *cbd_widthPLu,
A_u_long *cbd_heightPLu);
AEGP_GetInteractiveCachedBuffer获取上次用于 PR_RenderContextH 的缓存 AEGP_WorldH。
AEGP_GetInteractiveCachedBuffer(
const PR_RenderContextH contextH,
AEGP_WorldH *buffer);
AEGP_ArtisanMustRenderAsLayer确定工匠是否必须将当前的 AEGP_RenderLayerContextH 渲染为图层。
AEGP_ArtisanMustRenderAsLayer(
const PR_RenderContextH contextH,
AEGP_RenderLayerContextH layer_contextH,
A_Boolean *use_txturePB);
AEGP_GetInteractiveDisplayChannel返回交互式工匠应显示的通道。
AEGP_GetInteractiveDisplayChannel(
const PR_RenderContextH contextH,
AEGP_DisplayChannelType *channelP);
AEGP_DisplayChannelType 将是以下之一:
- AEGP_DisplayChannel_NONE
- AEGP_DisplayChannel_RED
- AEGP_DisplayChannel_GREEN
- AEGP_DisplayChannel_BLUE
- AEGP_DisplayChannel_ALPHA
- AEGP_DisplayChannel_RED_ALT
- AEGP_DisplayChannel_GREEN_ALT
- AEGP_DisplayChannel_BLUE_ALT
- AEGP_DisplayChannel_ALPHA_ALT
AEGP_GetInteractiveExposure返回给定 PR_RenderContextH 的曝光值,表示为浮点数。
AEGP_GetInteractiveExposure(
const PR_RenderContextH rcH,
A_FpLong *exposurePF);
AEGP_GetColorTransform返回给定 PR_RenderContextH 的颜色变换。
AEGP_GetColorTransform(
const PR_RenderContextH render_contextH,
A_Boolean *cms_onB,
A_u_long *xform_keyLu,
void *xformP);
AEGP_GetCompShutterTime返回给定 PR_RenderContextH 的快门角度。
AEGP_GetCompShutterTime(
PR_RenderContextH render_contextH,
A_Time *shutter_time,
A_Time *shutter_dur);
AEGP_MapCompToLayerTimeCC 新增功能。与 AEGP_ConvertCompToLayerTime 不同,此功能处理折叠或嵌套合成的时间重映射。
AEGP_MapCompToLayerTime(
PR_RenderContextH render_contextH,
AEGP_RenderLayerContextH layer_contextH,
const A_Time *comp_timePT,
A_Time *layer_timePT);

在不同上下文之间转换

在渲染和实例上下文之间转换,并管理特定于工匠的全局数据。

AEGP_ArtisanUtilSuite1

函数用途
AEGP_GetGlobalContextFromInstanceContext给定实例上下文,返回全局上下文的句柄。
AEGP_GetGlobalContextFromInstanceContext(
const PR_InstanceContextH instance_contextH,
PR_GlobalContextH *global_contextPH);
AEGP_GetInstanceContextFromRenderContext给定渲染上下文,返回实例上下文的句柄。
AEGP_GetInstanceContextFromRenderContext(
const PR_RenderContextH render_contextH,
PR_InstanceContextH *instnc_ctextPH);
AEGP_GetInstanceContextFromQueryContext给定查询上下文,返回实例上下文的句柄。
AEGP_GetInstanceContextFromQueryContext(
const PR_QueryContextH query_contextH,
PR_InstanceContextH *instnce_contextPH);
AEGP_GetGlobalData给定全局上下文,返回全局数据的句柄。
AEGP_GetGlobalData(
const PR_GlobalContextH global_contextH,
PR_GlobalDataH *global_dataPH);
AEGP_GetInstanceData给定实例上下文,返回关联的实例数据。
AEGP_GetInstanceData(
const PR_InstanceContextH instance_contextH,
PR_InstanceDataH *instance_dataPH);
AEGP_GetRenderData给定渲染上下文,返回关联的渲染数据。
AEGP_GetRenderData(
const PR_RenderContextH render_contextH,
PR_RenderDataH *render_dataPH);

微笑!摄像机

获取摄像机的几何信息,包括摄像机属性(类型、镜头、景深、焦距、光圈等)。

AEGP_CameraSuite2

函数用途
AEGP_GetCamera给定图层句柄和时间,返回当前摄像机图层句柄。
AEGP_GetCamera(
PR_RenderContextH render_contextH,
const A_Time *comp_timeP,
AEGP_LayerH *camera_layerPH);
AEGP_GetCameraType给定图层,返回图层的摄像机类型。
AEGP_GetCameraType(
AEGP_LayerH aegp_layerH,
AEGP_CameraType *camera_typeP;
摄像机类型可以是以下之一:
- AEGP_CameraType_NONE = -1
- AEGP_CameraType_PERSPECTIVE
- AEGP_CameraType_ORTHOGRAPHIC
AEGP_GetDefaultCameraDistanceToImagePlane给定合成句柄,返回摄像机到图像平面的距离。
AEGP_GetDefaultCamera DistanceToImagePlane(
AEGP_CompH compH,
A_FpLong *dist_to_planePF)
AEGP_GetCameraFilmSize获取指定摄像机使用的胶片尺寸(以及用于测量该尺寸的单位)。
AEGP_GetCameraFilmSize(
AEGP_LayerH camera_layerH,
AEGP_FilmSizeUnits *film_size_unitsP,
A_FpLong *film_sizePF0);
AEGP_SetCameraFilmSize设置指定摄像机使用的胶片尺寸(以及用于测量该尺寸的单位)。
AEGP_SetCameraFilmSize)(
AEGP_LayerH camera_layerH,
AEGP_FilmSizeUnits film_size_units,
A_FpLong *film_sizePF0);

关于摄像机行为的注意事项

摄像机方向在合成坐标中,旋转在图层(摄像机的图层)坐标中。

如果摄像机图层有父级,则位置是相对于父级的坐标空间。


正交摄像机矩阵

在内部,我们使用合成宽度和高度来设置 OpenGL 规范中描述的矩阵:

glOrtho(-width/2, width/2, -height/2, height/2, -1, 100);

正交矩阵描述了投影。摄像机的位置由另一个缩放矩阵描述。摄像机位置矩阵的逆提供了“眼睛”坐标。


聚焦于焦距

记住,焦距影响视野;焦距仅影响景深。


胶片尺寸

在现实世界中,胶片尺寸以毫米为单位测量。在 After Effects 中,它以像素为单位测量。将毫米转换为像素,乘以 72 并除以 25.4。

视野更复杂;

ϴ = 1/2 视野

tan(ϴ) = 1/2 合成高度 / 焦距

焦距 = 2 tan(ϴ) / 合成高度


点亮灯光

获取和设置合成中的灯光类型。

AEGP_LightSuite2

函数用途
AEGP_GetLightType获取指定摄像机图层的 AEGP_LightType
AEGP_GetLightType(
AEGP_LayerH light_layerH,
AEGP_LightType *light_typeP);
AEGP_LightType 将是以下之一:
- AEGP_LightType_PARALLEL
- AEGP_LightType_SPOT
- AEGP_LightType_POINT
- AEGP_LightType_AMBIENT
AEGP_SetLightType设置指定摄像机图层的 AEGP_LightType
AEGP_SetLightType(
AEGP_LayerH light_layerH,
AEGP_LightType light_type);

关于灯光行为的注意事项

平行光的公式可以在 Foley 和 Van Dam 的《计算机图形学导论》(ISBN 0-201-60921-5)中找到,点光的公式也是如此。

我们使用 Jim Blinn 提出的半角变体。

假设我们有一个图层上的点,并希望用灯光对其进行着色。

设 V 为从图层点到视点的单位向量。 设 L 为指向灯光的单位向量(在平行光情况下,这是恒定的)。设 H 为 (V+L)/2(归一化)。 设 N 为图层的单位法向量。

镜面反射光的量为 S * power(H Dot N, shine),其中 S 是镜面反射系数。


我应该如何绘制?

After Effects 依赖工匠绘制 3D 图层句柄。如果您的工匠选择不响应此调用,默认工匠将为您绘制 3D 图层句柄。查询变换对于优化 After Effects 的缓存非常重要。

坐标系是正 x 向右,正 y 向下,正 z 进入屏幕。原点是左上角。旋转顺序为 x 然后 y 然后 z。对于矩阵,平移是底行,方向是四元数(首先应用),然后是任何 x-y-z 旋转。一般来说,使用方向或旋转,但不要同时使用两者。如果需要控制角速度,则使用旋转。


查询变换函数

这些函数为工匠提供了有关他们需要的信息,以便正确地将图层放置在合成中,并适当地响应 After Effects 将发送到其 PR_QueryFunc 入口函数的各种查询。

由于该入口函数是可选的,因此您的工匠对查询的响应也是可选的;但是,如果您不这样做,您的用户可能会失望,因为(在进行交互式预览绘制时)所有摄像机和灯光指示器都会消失,直到他们停止移动!工匠是复杂的野兽;如果您有任何问题,请联系我们。

AEGP_QueryXFormSuite2

函数用途
AEGP_QueryXformGetSrcType给定查询上下文,返回当前正在修改的变换源。
AEGP_QueryXformGetSrcType(
PR_QueryContextH query_contextH,
AEGP_QueryXformType *src_type);
查询上下文将是以下之一:
- AEGP_Query_Xform_LAYER
- AEGP_Query_Xform_WORLD
- AEGP_Query_Xform_VIEW
- AEGP_Query_Xform_SCREEN
AEGP_QueryXformGetDstType给定查询上下文,返回当前请求的变换目标。
AEGP_QueryXformGetDstType(
PR_QueryContextH query_contextH,
AEGP_QueryXformType *dst_type);
AEGP_QueryXformGetLayer如果源或目标类型是图层,则使用此函数。给定查询上下文,返回图层句柄。
AEGP_QueryXformGetLayer(
PR_QueryContextH query_contextH,
AEGP_LayerH *layerPH);
AEGP_QueryXformGetComp给定查询上下文,返回当前合成的句柄。
AEGP_QueryXformGetComp(
PR_QueryContextH query_contextH,
AEGP_CompH *compPH);
AEGP_QueryXformGetTransformTime给定查询上下文,返回变换的时间。
AEGP_QueryXformGetTransformTime(
PR_QueryContextH query_contextH,
A_Time *time);
AEGP_QueryXformGetViewTime给定查询上下文,返回关联视图的时间。
AEGP_QueryXformGetViewTime(
PR_QueryContextH query_contextH,
A_Time *time);
AEGP_QueryXformGetCamera给定查询上下文,返回当前相机图层句柄。
AEGP_QueryXformGetCamera(
PR_QueryContextH query_contextH,
AEGP_LayerH *camera_layerPH);
AEGP_QueryXformGetXform给定查询上下文,返回当前矩阵变换。
AEGP_QueryXformGetXform(
PR_QueryContextH query_contextH,
A_Matrix4 *xform);
AEGP_QueryXformSetXform给定查询上下文,返回你在 xform 中计算的矩阵变换。
AEGP_QueryXformSetXform(
PR_QueryContextH query_contextH,
A_Matrix4 *xform);
AEGP_QueryWindowRef设置要使用的窗口引用(由 After Effects 使用),针对给定的 PR_QueryContextH
AEGP_QueryWindowRef(
PR_QueryContextH q_contextH,
AEGP_PlatformWindowRef *window_refP);
AEGP_QueryWindowClear返回要清除的 AEGP_PlatformWindowRef(和 A_Rect),针对给定的 PR_QueryContextH
AEGP_QueryWindowClear(
PR_QueryContextH q_contextH,
AEGP_PlatformWindowRef *window_refP,
A_LegacyRect *boundsPR);
AEGP_QueryFrozenProxy返回给定 PR_QueryContextH 中使用的纹理是否应冻结。
AEGP_QueryFrozenProxy(
PR_QueryContextH q_contextH,
A_Boolean *onPB);
AEGP_QuerySwapBuffer在渲染和相机/灯光句柄绘制完成后发送;After Effects 返回 artisan 应绘制其输出的缓冲区。
AEGP_QuerySwapBuffer(
PR_QueryContextH q_contextH,
AEGP_PlatformWindowRef *window_refP,
AEGP_WorldH *dest_bufferp);
AEGP_QueryDrawProcs设置 After Effects 在绘制相机和灯光句柄到 artisan 提供的上下文时将调用的交互式绘制函数。
AEGP_QueryDrawProcs(
PR_QueryContextH query_contextH,
PR_InteractiveDrawProcs *window_refP);
AEGP_QueryPrepareForLineDrawing通知 After Effects 它将绘制的上下文。
AEGP_QueryPrepareForLineDrawing(
PR_QueryContextH query_contextH,
AEGP_PlatformWindowRef *window_refP,
A_LegacyRect *viewportP,
A_LPoint *originP,
A_FloatPoint *scaleP);
AEGP_QueryUnprepareForLineDrawing就 After Effects 而言,artisan 已完成线条绘制。
AEGP_QueryUnprepareForLineDrawing(
PR_QueryContextH query_contextH,
AEGP_PlatformWindowRef *window_refP);

交互式绘制函数

我们增加了 artisan 提供函数的能力,After Effects 可以使用这些函数在预览期间更新合成窗口显示,包括相机、灯光和线框预览建模。

PR_InteractiveDrawProcs

函数用途
PR_Draw_MoveToFunc
PR_Draw_MoveToFunc(
short x,
short y);
PR_Draw_LineToFunc
PR_Draw_LineToFunc(
short x,
short y);
PR_Draw_ForeColorFunc
PR_Draw_ForeColorFunc(
const A_Color *fore_colo
PR_Draw_FrameRectFunc
PR_Draw_FrameRectFunc(
const A_Rect *rectPR );
PR_Draw_PaintRectFunc
PR_Draw_PaintRectFunc(
const A_Rect *rectPR );

关于查询时间函数的说明

AEGP_QueryXformGetTransformTime()AEGP_QueryXformGetViewTime() 都是 artisan 构建要渲染的场景表示所必需的。

AEGP_QueryXformGetTransformTime() 获取变换的时间,然后传递给 AEGP_CompSuite11 中的 AEGP_GetCompShutterFrameRange()

AEGP_QueryXformGetViewTime() 获取视图的时间,用于调用 AEGP_LayerSuite9 中的 AEGP_GetLayerToWorldXformFromView()