基于houdini理解Billboard算法
2026-1-12
| 2026-1-12
Words 982Read Time 3 min
type
status
date
slug
summary
tags
category
icon
password
较为简单的矩阵计算,但是温故以下:

前言

这个算法其实直观性较差,尝试用houdini进行拆建:
在houdini中,我们常常要让copytopoints的对象(位置不同 )同时面向 另一个一个对象,并且是随动的
这个和bb的是一样的,我们的做法是:
计算目标中心 和 目标对象(以下简称R对象)的归一化向量
基于这个归一化向量创建一个矩阵
然后通过 点坐标*矩阵的 方式 来改变点的位置。我们在shader中实现一下:

最垃圾链路(局部空间完成旋转)

这贼垃圾,纯脑洞,得把摄像机转到局部空间,纯闲的
并且你需要自己建立矩阵,用cross的方式

常规链路(view空间完成旋转)

这个是unity 等引擎用的
步骤 1:面片局部坐标→View 空间
P_view = P_l × world矩阵 × view矩阵(先转世界,再转 View 空间)。
 
步骤 2:在 View 空间构建 “朝向相机的旋转矩阵 R_view”
View 空间中相机在原点(0,0,0),且:
相机前向是 View 空间的-Z轴(forward_view = (0,0,-1),固定不变);
相机右向是 View 空间的X轴(right_view = (1,0,0));
相机上向是 View 空间的Y轴(up_view = (0,1,0));→ 旋转矩阵R_view = [right_view, up_view, forward_view](单位矩阵,甚至可以省略旋转,直接用 View 空间的 X/Y 轴偏移)。
步骤 3:View 空间旋转 + 转裁切空间
View 空间旋转:P_view_rot = P_view × R_view(对 View 空间的面片顶点旋转,本质是对齐相机 X/Y 轴);
View→裁切:P_clip = P_view_rot × proj矩阵。

优化后链路(NX用世界空间+世界空间旋转偏移)

步骤 1:局部顶点 → 局部方向向量(剥离位置,只保留偏移)
P_l = 面片中心局部坐标(0,0,0) + 局部偏移向量V_l
因为面片的中心就是(0,0,0)
所以 局部偏移向量V_l = 顶点坐标
代码里用的是(借用uv):
local_position_offset = float3((input.texcoord0.x-0.5)*2.0, 0.0, (input.texcoord0.y-0.5)*2.0);
 
步骤 2:局部偏移向量 → 世界空间旋转后的偏移向量
local_position_offset 和 旋转矩阵 进行 mul
这个旋转矩阵可以借用view矩阵进行构建:
一个是view_up ,一个是view_right,因为local_position_offset 有一个分量是0 所以没必要弄第三个
world_camera_facing_offset = (local_position_offset.x * view_up + local_position_offset.z * view_right) × s
(这里不用mul 直接用矩阵的乘法的拆开 节省这个指令)
s是scale是缩放
这一步完成了旋转和转化到世界空间(这个旋转矩阵来自view转化矩阵 view 矩阵的前 3 列(Cam_R/Cam_U/Cam_F)的空间属性是世界空间—— 因为它们描述的是 “相机的右 / 上 / 前方向在世界空间中指向哪里 即但它的列向量数据是 “世界空间的相机方向” 所以这个旋转矩阵同时把偏移转化到世界空间)
 
步骤三:世界坐标+世界空间旋转后的偏移向量
这个不难 世界坐标 + 世界坐标的偏移就是 新的坐标
 
  • 图形学
  • 渲染
  • 描边outline(屏幕空间描边)从ue5 BRDF看UE shader分支选择
    Loading...