Billboard 的本质是一个参考相机坐标系的物体。

直接坐标系变换

该方法本质是假装物体的本地坐标在相机坐标系下,将坐标从相机空间转到世界空间就会得到一个紧贴着相机的物体,再根据原始物体与相机的相对位置进行偏移,即可得到 Billboard。

适用于 UE 等难以直接获取矩阵的引擎

  flowchart LR
    %% 定义主要输入输出节点
    LocalPosition["Local Position"]
    TransformVector["<span style='white-space: nowrap'>Camera Space → World Space</span>"]
    ObjectPosition["Object Position"]
    Add["Add"]

    %% 定义 Convert 子图(包含内部端口和连线)
    subgraph Convert ["Convert"]
        direction LR
        In_R((X))
        In_G((Y))
        In_B((Z))
        Out_R((X))
        Out_G((Y))
        Out_B((Z))
        
        %% 内部交叉连接逻辑:R->G, G->R
        In_R --> Out_G
        In_G --> Out_R
        In_B --> Out_B
    end

    %% 外部主流程连接
    LocalPosition o--o Convert
    Convert o--o TransformVector
    TransformVector o--o Add
    ObjectPosition o--o Add

Tips

  1. 如果不反转 XY 相机看到的会是背面。
  2. 一般Billboard是没有厚度的,所以 Z 也可以不参与运算。

手动构建矩阵

Billboard示意图
相关信息参考: 手动构建矩阵的好处是可以实现固定某个轴不转动,需要固定的轴直接设置成世界空间轴即可,如固定原物体 Z 轴

$$ \begin{pmatrix} Right.x & 0 & Forward.x \\ Right.y & 0 & Forward.y \\ Right.z & 1 & Forward.z \end{pmatrix} \begin{bmatrix} y \\ x \\ z \end{bmatrix} $$

即可实现如图所示,原物体 Z 轴/相机空间的 Up 轴世界空间 Z 轴重合。

HLSL
float3x3 M;
M._m00_m10_m20 = ResolvedView.ViewRight;
M._m01_m11_m21 = float3(0,0,1);
M._m02_m12_m22 = ResolvedView.ViewForward;
return mul(M, x);
点击展开查看更多

计算位置等价于:

HLSL
float3 PositionTransform = Right * LocalPosition.y + Up * LocalPosition.x + Forward * LocalPosition.z;
float3 NewPosition = ObjectPosition + PositionTransform;
点击展开查看更多

版权声明

作者: Cheyne Xie

链接: https://chaim.eu.org/posts/bb6effdd/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键