简介: houdini 真是越用越好玩,最近在使用其散点功能做成 HDA 在 Unity 进行物体散布的时候遇到了几个卡点,特此记录一下
houdini版本: 2020.5
相关属性
unity_instance: point 属性,这个属性的 string 值填充要散替换的物体的路径
unity_material: point 属性,这个属性的 string 值填充要赋予的材质路径,在 unity 中使用 HDA 生成多边形后就可以赋予这个属性标记的路径的材质
pscale: point 属性,这个属性可以设置缩放数值,用来控制实际撒点的物体的缩放属性
orient: point属性,这个属性代表物体的旋转属性,可以用来控制物体的旋转
collision_geo: point 属性,这个属性的 string 值填充要赋予碰撞体网格的路径
heuassetpath: 这不是一个属性,这个是在给 HDA 创建输入参数时,可以给 string 类型的参数加上这个标签,这样这个 string 参数在 untiy 里面就会以一个 objectfield 的形式出现,这样就免去了手动输入物体路径的麻烦,可以直接拖动引用,他会自己获取路径
实际操作
- 根据输入的数据或模型进行散点
- 设置需要的 pscal 、orient、 unity_instance 属性值
- 移除重复的点(可选,多次散点有可能会有挨得很近的点)
- 导出 HDA
细节点
随机大小,可以通过控制每个点的 pscale 属性的值,来影响散布物体的大小
-
随机朝向,可以通过控制每个点的 orient 属性的值,来影响散布物体的旋转
这里注意,vex 的旋转是以弧度为单位的,360度一圈可以表示为 2PI, 如果输入的是角度值,则 输入角度/180PI 即可。
-
没有设置正确的 orient,可能散布出来的物体都是躺着的。应为坐标系是不一样的。基础代码如下
//可以将对其方向设置到 Y 方向,这个也是网上找到的,先做这么一次变换,至少可以保证,在Unity 内模型是正常站真的 @orient=quaternion(maketransform(@N,{0,1,0}));
-
旋转用到的函数详解
- maketransform 这个是构建一个变换矩阵,这里要注意他返回的是一个矩阵
- quaternion 可以根据一个变换矩阵得到计算一个旋转四元数
- 制作随机朝向的功能,可以使用如下代码
// 使用角度 和轴向进行来创建一个 四元素的旋转
vector4 oldAngle=@orient;
vector4 randomAngle=quaternion(angels,axis);
@orient=qmultiply(oldAngle,randomAngle);