待看
烘焙烟雾贴图 https://zhuanlan.zhihu.com/p/611506997?share_code=ymI6kpuPn5Aw&utm_psn=2007510493888279066
中键按节点 显示 Information
切换选择模式 非工具则是切换视口模式 1234
选择缩放旋转平移 STRE
重做上个步骤 Q仅创建节点、S创建节点并保持参数
四格视图 按 Space + B
切换视图快捷键 按 Space + 1 2 3 4 5
预览环选 按住 SHIFT + A
图表剪刀 Y
视口设置 D
调整坐标系 M
捷径菜单 C
视口捷径菜单 V
切换线框显示 W
全选 N
K关键帧 按 K
平滑预览类似Maya的3 按 Shift++ 或 Shift+-。
在Enter模式下平移旋转缩放 按Y,很重要!
增选减选 按 Shift+PgUp/PgDown,Home和End也有但不知道什么是Sibling。
动画操作热键
https://www.sidefx.com/docs/houdini/character/kinefx/animatestate.html
选父类 按键 PageUp
选子类 按键 PageDown
选左/右控制 按键 Home/End
在世界空间移动/旋转 按住 Shift+Ctrl 再旋转或位移,这个旋转很适合做动画!
↑旋转 默认多选旋转是以大家自身旋转,按住后是大家按照转轴旋转!
零点直接创建物体 按住 CTRL 点工具栏图标
移动节点包括所有子节点 按住 SHIFT 拖拽节点
移动节点包括所有父节点 按住 CTRL 拖拽节点
Graph 剪刀工具 按住 Y 拽鼠标
关注已选物体 按住 空格 再按 F
Context 洁净菜单 Graph 中按 P
让节点Instance化 对节点按右键,创建 ReferenceCopy
整理节点 按 L
调试表达式 节点 AttributeWrangle,使用 print("%s", 表达式);
细分线段 节点 Sample
曲线变实体 节点 PolyWire,做电线用。
噪点扰乱位置 节点 PointJitter,同 AttribNoise。
为线段增加方向Attribute 节点 OrientationAlongCurve,自动添加up和N,便于CopyToPoints
从边提取Curve 节点 CurveFromEdge
静态缓存几何体 节点 Stash,同Cache节点但更快速,是Instance的,可以缓存某一帧的结果,缓存以后可以断开输入 不会影响输出。
按长度左右切割曲线 节点 Carve
在线段点上生成 节点 CopyToPoints (需要用名为 N 的 Attribute 指定'正方向'或Z,up 指定'上方向'或Y)
像 StackTool 一样生成 节点 CopyAndTransform
梯度蒙板、测体积、测中心坐标、测斜率、测面积 节点 Measure 的 Gradient 模式,返回值长度越大则被观测数据变化越大,每个点的返回值是切向量 并且指向增长方向,返回是局部向量
测重心坐标 节点 ExtractCentroid。
程序化选择点线面 节点 GroupByRange,设定Start和End和Offset,按点顺序自动选择;使用 RangeFilter 可以均匀剔除,如剔除二分之一个点。
手动选择点线面 节点 Group 点击 BaseGroup 右侧的鼠标指针,然后在视口中直接选择;还可以根据法线等信息对已有Group进行Subtract操作!
根据几何体选择点线面 节点 Group,使用 KeeyInBoundingRegions 功能,Toucan 中用这个功能实现剔除相机外的场景。
随机选取东西 节点 Group,使用 KeepByRandomChange 功能。
按指定的Bound选取Group 节点 CreateGroup,勾选 KeepInBoundingRegions,即可使用其他物体的Bound当作蒙板来创建Group。
创建 Attribute 节点 CreateAttribute
随机填充或修改 Attribute 节点 AttributeRandomize,好玩!
改名 Attribute 节点 AttributeRename
转换 Attribute 如Point转Primitive 节点 AttributePromote
不同模型之间传输 Attribute 节点 AttributeTransfer,会自动映射;AttributeCopy是用于相同模型的。
模糊Attribute的值 节点 AttributeBlur,和Smooth有点像。
转换 Group,同上 节点 GroupPromote
扩张 Group,类似扩张选择、软选择 节点 GroupExpand,基于面去选择,无法基于点选择 你需要给它面!
绘制 Attribute 蒙板 节点 AttributePaint,基于顶点绘制,不需要UV,分辨率基于顶点数
绘制贴图蒙板 节点 TextureMaskPaint,前者基于顶点绘制,这个是基于体积(贴图)绘制。需要有 VertexUV 而不是 PointUV、分辨率基于贴图分辨率;可使用 HeightFieldOutput SOP 进行导出贴图,需要将mask名改成 height;该SOP可搭配 ScatterInTextureMask 使用;它的输出虽带有体积字样但它不是体积而是贴图。 http://127.0.0.1:48626/nodes/sop/texturemaskpaint 。
生成散点遮罩 节点 ScatterInTextureMask,可先用TextureMaskPaint画范围,再用它生成散点。
贴图蒙板转 Attribute 数据 节点 AttributeFromMap,用 AttributePaint 的第二输出连它的第二输入
移除点线面 节点 Dissolve,可保持面结构不出现 Hole
移除点线面 节点 Blast,直接删点线面,会出现 Hole,可选删除垃圾 Group;可用于隔离某一部分!
区分Elements并可能改变拓扑结构 节点 Assemble,可为每个element赋予name,可修复破碎物体的artifical。
区分Elements 节点 Connectivity,不会对原几何体做任何变化。
打包Packaged Prim和解包 节点 Pack 和 Unpack,Packaged Prim似乎没有UV,但解包后可重现。
遍历 Elements 节点 For-Each Connected Pieces
添加循环边、插入顶点 节点 PolySplit,按 Enter 进入选择模式
创建Frame Attribute 节点 PolyFrame
添加或提取点线面、画曲线、删面留点 节点 Add,选择 ByGroup 时可将点连接到一起
根据Attribute切割点线面 节点 PolyCut,输入 * 可表示全部,可用作切割样条线
根据平面切除 节点 Clip
合并、分离顶点?貌似可以做LOD 节点 Facet,可合并 Consolidate 或分离 Unique 顶点
合并或吸附顶点 节点 Fuse
合并模型 节点 Merge
合并或引用对象 节点 ObjectMerge,可以直接引用其他节点中的模型!!!!!!!!!!!!!!!
沿法线移动顶点 节点 Peak,可沿法线挤出或缩入
挤出模型 节点 ExtrudePoly。
细分模型 Smooth 节点 Subdivision
细分模型 不改变结构 节点 Divide,勾选 ComputeDual 可做六边形足球结构、地砖结构
VDB 体积的布尔运算 节点 VDB Combine,可选布尔模式
VDB 体积转换多边形 节点 VDB Convert
VDB 多边形转体积 节点 VDB FromPolygon,记得先 PolyFill 填充空面。
检查UV 节点 UV QuickShade
自动展UV 节点 UV Unwarp
根据边手动展UV,或单纯压平 节点 UV Flatten
布局UV 节点 UV Layout
正反面反转 节点 Reverse
放样曲线 节点 Sweep或Loft或Skin,Loft用于放样,Skin用于在两条线之间做面
填充洞 节点 PolyFill或 PolyCap,Cavity=空腔,新建的面叫 Patch 补丁
重新拓扑模型 节点 TetConform,生成四面体模型,四面体可随意Clip切割不会留洞,可做断肢断面或CaptureGeoetry
在别的Geo里引用Null 左上角 Modify - Extract
运算帧偏移,快一帧计算 节点 TimeShift,可让下面节点直接取Frame帧的结果
晶格变形 节点 Lattice,使用 BoundSOP 创建晶格,将其赋给Rest,再把变换后的晶格赋给输入3。
提取模型中心点 节点 ExtractCentroid,Piece可用Connectivity生成,可用来做绑定的骨骼生成点。
挤出厚度 节点 Thicken,直接沿着平均法线挤出。
模型居中 节点 MatchSize,等价于&XMIN,Size意为Bound;可以Match别人的Bound
平滑模型布线 节点 Smooth,用于做完布尔以后重新整理面;既可以不改变拓扑只改顶点布局也可以改变拓扑就像只TurboSmooth但不加面,很灵活!
混合形状 节点 SequenceBlend 或 BlendShape,建议两边模型面数相同。可用来控制曲线路径变化。
只加很多顶点但不改变形状 节点 Refine。
获取单位化样条线的Time或重采样 节点 Resample,勾选输出 CurveU,它会生成 CurveU!!!!!!!!
将Bound转换为几何体 节点 Bound。
插入更多线 类似Connect 节点 EdgeDivide。
柏拉图规则形状 如足球、茶壶、八边形等 节点 PlatonicSolids。
合并并重拓扑多个相接模型 好玩! 节点 RemeshToGrid,原理是先转成VDB再转回Polygon,需要勾选 TransferSurfaceAttributes 才能保留UV等信息;之后四边化就会很好看。
计算速度、加速度或制作模型拖尾 节点 Trail。
磁铁塑形或类似软选择、水滴融合 节点 Bluge,可像磁铁一样吸或排斥模型,可做凸起动画。
几何转粒子 节点 PopNetwork
粒子碰撞 节点 PopCollisionDetect,在PopNetwork中的Merge处插入
粒子消杀 节点 PopKill,在PopNetwork中的popsolver前插入
长粒子Spark效果 节点 SparkTrail,在PopNetwork后插入
给予Fracture物体速度(非受力) 调整 solver 以前 ProxyGeometry 的 Attribute v 值
为 PyroSolver 添加其他物体的碰撞 在 PyroSolver 右上角 QuickSetup 中选择 SetupSDFCollision,然后输入 VDB 数据即可;v 属性表示速度
RBD解包 先 RBDUnpack,再 Unpack,即可回归 Polygon
物体碰撞优化 Polygon 状态下,使用 Peak 扩张模型,再转换为 VDB 体积去计算
分支判断 节点 Switch,同 Branch!
给每个Primitive或Point一个Index 节点 Enumerate。
散点分布不同几何体 节点 AttributeFromPieces,待了解 https://youtu.be/usayYrow9Mo?t=357
散点分布并赋予方向 节点 ScatterAlign,原节点只负责散点,该节点在散点基础上增加了方向属性,适合铺植被。
在体积内散点 节点 PointsFromVolume,可在几何体内均匀撒点。不要使用 VDB+Scatter,因为无法撒在内部!
按条件提取东西,重要 节点 Split,条件可以是 @name=covert_*,便于做特别处理。简写参考表
NetworkBox 节点注释框 Shift+O
OP Operator 即节点。
SOP Surface Operator,创建、修改、控制Attribute、程序化生成。
DOP Dynamics Operator,流体布料模拟。
VOP Vector Operator,着色器逻辑,图表版本的 Wrangle。使用 Bind 进行输入、BindExport 进行输出。
POP Particle Operator,粒子特效。
CHOP Channel Operator,MotionFX动画,绑定IK等。
VDB Volumetric Data Blocks,
RBD RigidBodySimulation
LOP LightingOperators,Solaris 渲染器,记得切换布局模式
COP Copernicus 材质框架,类似SD
ROP RenderOperator
AOP AttributeOperatorBuild-in Attributes 参考表
P Point的位置
N Point的法线
up 上方向,用于定义第二方向轴(N通常表示前方)
v 速度,用于运动模糊
Cd 颜色 ColorDiffuse
pscale Point的缩放信息,float类型
id 独一无二UID,如粒子特效
name 用于标识打包的Primitive、Group
orient 方向,四元数UE Attribute 参考表
N、uv、uv2...、Cd顶点色、unreal_lightmap_resolution、unreal_material、unreal_face_smoothing_mask、unreal_generated_mesh_name
导入UE模型碰撞 创建名为 rendered_collision_geo 的组即为碰撞。表达式参考
https://www.sidefx.com/docs/houdini/ref/expression_cookbook.html
SpareInput 在 Detail 面板中创建变量槽,可拖拽赋值节点引用,可使用-1 -2 -3指定插槽,很重要
$CEX 居中XYZ
$BBX 点在BB里的位置,归一化的,(0.5)表示它位于BB中心,VEX语法relbbox(0, @P).x。
&XMIN 角落X最小值,世界的
$SIZEX 尺寸XYZ
$OS 当前Node节点名,Operation String
$HIPNAME 当前项目名
bbox 返回其他节点的以上参数
^ POW开方、排除,如 spine_* 与 ^spine_5 。
^N 表达式:获取 Primitive 的 N 并转换到 Point 或 Vertex,不可在VEX中用;AttributePatternMatching中表示排除!
%tag(tagname)或#tagname 根据 Tag 获取 Group;可使用 AttributeAdjustTag 设置Tag。
$F @Frame 当前帧数
$T @Time 当前时间
$NFRAMES 总帧数
$FSTART / $FEND 起始帧和结束帧
@ptnum @primnum @vtxnum 当前顶点的Index,从0开始
@numpt 总顶点数
@P.x 当前顶点的位置
@ptnum[22] 顶点索引 if(@ptnum == 1) @Cd = {1,0,0};
@Cd.x 当前顶点的颜色
vector("[1,2,3,4]")[0] 表达式向量
set(X,Y,Z) 重中之重,在 Wrangle VEX 中根据参数生成变量,类似auto或var,如 set(XXX.x, XXX.y)!
fit01(value, min, max) 同SmoothStep
使用@选取操作符 重中之重 可在Inspector中使用 @name=xxxx 或 @size>1 来当场选取东西作为group使用,支持 * 模糊查询,可参考羽毛。自定义节点
opinput 返回节点第一个Input的名称。
opinputpath(".", 0) 返回节点第一个Input的路径,.表示自身,0表示第一个。读取虚幻输入:ObjectMerge中填写这个。
ch("../变量名") != 0 当变量名不等于0时返回true,..表示 HDA 节点。
npoints(opinputpath(".",0)) == 0 用在 SwitchIf 里,判断是否有连接物体。试试 npoints(0) > 0?
npoints(0) 返回第一个 Input 的点数。nprimitives, npointsgroup, nprimitivesgroup, nvertices
attrib(geo, targetClass, targetName, elemnum, $success) 读取 Attribute 值,读其他类型的值可参考 http://127.0.0.1:48626/vex/attrib_suite.html
point(geo, name, index) 读取Point Attribute的值,重点。
prim(geo, name, index) 读取Point Attribute的值,重点。
hasattrib 判断是否已有 AttributeVEX
`xxxxxx` 在输入框中插入 Wrangle 代码
chi("变量名") 在 Wrangle 中创建整形变量
ch 浮点变量
chv, chs 向量、字符串变量
v@AAAA 重要,在VEX中显式指定变量类型,VEX猜不出Attribute的类型。f浮点、i整形、u二维、v三维、p四维、s字符串
int[] = pointprims(0, @ptnum) 获取 pt 所占有的 prim,参数:0表示Wrangle input的第一个。
int[] = primpoints(0, @primnum) 获取 primnum 上的所有Point的index。
primpoints(geo, primnum, 0) 在 geo 上的第 primnum 个Prim上找第 0 个 Vertex 的 index;可用 primvertexcount(geo, primnum) 获取总vertex数量,或使用 npoints 快速获取数量。
vertexprimindex(geo, @vtxnum) 获取指定顶点的本地顶点 index。
ninputs() 获取 input 的数量,也有 npoints(geo) 等。
@group_xxxx 创建名为 xxxx 的组,而不是变量。使用类型修饰符无意义,如f@group_xxx。
setpointgroup 创建名为 xxxx 的组。
inprimgroup 看看xxx是不是在某个组里,是就返回1。
@group_xx=@group_xx||(yy<=0.1) 使用OR合并组。
uniquevals(0, "Point", "name") 获取 string 或 int 所有的值并返回一个数组,做羽毛超级有用!如不需要去重可以使用n版本。
p@abc = quaternion(...) 创建 Vector4 类型的 Attribute,这个 p 很罕见。
VEX代码采样
primuv(geo, "attrname", primnum, uvw) 在geo上的第primnum个Prim上的uvw位置上找名为attrname的Attribute的值,可能是插值过的。
xyzdist(geo, origin, &prim, &uv) 找出geo距离origin最近的距离,并返回该点所在的prim和uv。和上述代码可互相搭配。
VEX列表的使用 https://procegen.konstantinmagnus.de/attribute-menu-with-vexVOP
遍历模型顶点 节点 PointVOP,双击进入
沿法线偏移模型顶点 VOP 节点 DisplaceAlongNormal,
噪点 VOP 节点 AntiAliased,默认输入3D输出1D,范围-0.5~0.5骨骼绑定
Skeleton 增添或修改骨骼
Name 修改骨骼名称
BoneCaputreLine 骨骼转换到线条
RigPose 修改姿势、烘焙偏移
RigStashPose 将绑定动画的数据添加到当前动画中,便于制作 Delta 动画,左连动画,右连TPose
MatchPose + MapPoints 重定向流程毛发制作
Guide、Hair 类节点均用于毛发。
0.https://youtu.be/rVogGr7f0Cg?t=705
1.使用 AttributePaint 绘制蒙板。
2.为模型创建高精度VDB,用作毛发碰撞体。
3.新建GroomGuide对象,设置蒙皮和密度蒙板。
4.进入GroomGuide对象,创建GuideGroom节点并自动链接三条线,用于控制毛发方向。
5.在GuideGroom里调整工具绘制毛发,若要隔离选择 可使用选择工具单独选择对应头发Primitive面 再按ENTER进行绘制。
6.将毛发变得更茂密,继续创建HairGenerate节点、设置蒙板。
7.将毛发打卷成簇扰乱,继续创建HairClump节点。视频中取消勾选Output中Attribute 表示不想影响后续渲染。
8.如要播放动画,返回并创建GuideDeform对象,输入动画即可。
9.创建HairGenerate对象,以继续丰富毛发。
10.进入上述对象,创建Color节点为头发着色。可根据Resample节点输出的CurveU去着色头发。
11.继续创建HairClump节点制作卷毛卷发效果,可应用头顶蒙板来只为头顶创建卷毛卷发效果。
12.继续创建GuideProcess节点以应用全局数学运输,如全局模糊、噪点等功能。
13.使用GuideMask里的RandomMask可随机选取部分毛发,应用效果,如白发丝。记得取消勾选VisualizeMask。北美鸟类羽毛图集 https://www.fws.gov/lab/featheratlas/
毛发官方 https://www.sidefx.com/docs/houdini/feathers/index.html
{
1.使用 FeatherTemplate 创建羽毛样例模型。
2.使用 GuideGroom 创建并种羽毛。需要选择上述模型,可先画引导线、再使用其 Plant 笔刷大面积铺毛。若提示“Invalid skinprim”,勾选 ComputeWeightsUsingSkinCoordinates。
3.使用 HairGen 创建头发 并将上述羽毛转换为头发造型。
4.使用 GuideInterpolationMesh 为 HairGen 生成代理模型,可使总结果看起来更加柔顺圆滑自然,需要将 SkinGuideMode 设为 WeightArrayPair。
5.使用 GuideTangentSpace 让下一步的羽毛对其角色法线;也可使用OrientAlongCurve。
5.使用 FeatherTemplateInterpolate 将上述头发/引导线转换为羽毛。使用 ObjectMerge 引用多个羽毛模板。
6.使用 Mask 效果。Density右侧 NoOverride 切换为 attribute 控制或 texture控制,新建AttributePaint 设置attribute为density,然后输入输出连GuideGroom的Skin、RestSkin。
*.FeatherNoise 可实现风吹效果。
*.FeatherDeinterset 可避免互相穿插穿模情况。
}待看 https://www.youtube.com/watch?v=pOjHpX0NOi4
自己
{
超有价值,从头到尾
{
https://www.sidefx.com/docs/houdini/feathers/scattering.html#noise
看到Connecting the attribute
}
基础做毛
{
1.使用 Curve 节点描绘羽毛图,然后把每个羽毛都拆成单独的 Curve。所有毛的 BarbSegments 必须一致(文档表示合并后只会显示最高的),如需批量修改可在 Merge 后使用 FeatherResample 批量修改。
2.为每个 Curve 继续连接 FeatherShapeOrganize->FeatherTemplateFromShape,然后使用 Merge 节点将其拼接成一个整体。
3.在 FeatherTemplateFromShape 里设置每个羽毛的 Side,根据 Shaft 弯曲占比情况选择左或右,如朝左弯曲右侧空间大 则选 Left。
}
Clump 随机扰乱
{
1.在 FeatherTemplateFromShape 后接上 AttributeRandomize 和 FeatherClump,前者用于提供随机扰乱点。
2.将 FeatherClump 里的 SplitLocationMode 切换为 FromAttribute(split),然后将上一个节点的随机属性设为 split,并且把随机参数调整为“TwoValues”,A为0、B为1。这是因为FeatherClump里的Splits的值是根据0和1去分开的。
}
Clump 几何体蒙板
{
1.把 FeatherClump 中的 Amount 设为 GuideAttribute(clumpingmask),这样该值就会被对应属性的控制。
2.把 GuideMask(和球体模型) 创建并在节点前链接,将节点内两个 GroupType 都设为 Points,然后把 OutputAttribute 设为 clumpingmask,最后在 AdditionalMasks中启用 UseGeometryMask。
3.把球体移动到羽毛中间,使其自下向上呈现“炸->紧->炸”的效果,好看!!
}
Condensed 和 UnCondensed 工作流
{
FeatherTemplateFromShape默认输出Condensed虚拟羽毛。
在Uncondensed工作流下,羽毛Barbs完全由点组成,而Condensed工作流只有Shaft有顶点。
使用 Feather Uncondense 将 Condense 转换为 Uncondense;使用 Feather Match Uncondensed 将其转换回去。
}
UnCondensed 做法
{
区分羽毛区域:在 Feather Uncondense 中勾选 CreateBarbGroups,就可以单独提取对应部分。默认情况左右 Barbs 会被合并到一个组,若要分离,右键 RightBarbsGroup,点 DeleteChannels。
隔离羽毛区域:使用 Blast,把除 barb 组以外的所有东西删除。
设置羽毛宽度:使用 FeatherWidth,曲线类型设为 B-Spline,调整 Shaft 下粗上细的形状为 https://www.sidefx.com/docs/houdini/images/feathers/splitting_shaftwidth.jpg
最后使用 Merge 合并。
转换后,会丢失 barborient Attribute,导致刷毛方向可能存在问题,解决办法是使用 AtributeAndGroupCopy,把 FeatherTemplateFromShape 的对应属性重新赋给 Uncondense 羽毛。
Orient 是 四元数方向,而非向量。转换代码:p@orient = dihedral(上方向{0,0,1}, @N);、@N = qrotate(p@orient, {0,0,1});
}
羽毛模拟
{
https://www.sidefx.com/docs/houdini/feathers/simulating.html
}
毛发大形处理
{
https://www.sidefx.com/docs/houdini/feathers/guiding.html
GuideProcess + FeatherNoise 来给毛做随机效果,后者无法控制 Condensed Barb 只适合控制大型。
1. 在 FeatherClump 后链接 GuideProcess,用于批量处理引导线,使用 FeatherBarbs 模式可以独立调节左右 Vanes 的长度或其他参数,可用使用“设置长度”“修改方向”“波形处理”等操作。
2. 在 GuideProcess 使用 Randomize 调整 Vanes 长度。
3. 为了避免毛尖被上述步骤弄得太长,可在GuideProcess 里的 Mask 使用 CurveMask,非常好用;或用 GeometryMask。
}
毛发压平到平面
{
https://www.sidefx.com/docs/houdini/feathers/blending.html
使用 FeatherSurfaceBlend节点实现。
}
毛根炸开
{
使用 FeatherNoise,用Ramp将作用范围限制在毛根。
}
羽毛采样图片纹理 重点
{
0.把羽毛 Uncondense 掉,否则没有顶点数据。
1.使用 AttributeVOP,Input1作为羽毛、2作为羽毛贴图Atlas。
2.使用 XYZDist 和 PrimUV 节点输出映射后的UV值,并使用 Bind 节点将前者应用到 uv Attribute上。
3.PrimUV 是根据 UV 位置返回该位置的Attribute值,XYZDist可以用来获取距离自己最近的一点,它是映射过程的重要组成部分。
0.以上 AttributeVOP 也可以使用 FeatherRay 代替,更加易懂。
1.详见 https://www.sidefx.com/docs/houdini/feathers/texturing.html#project
}
散点毛
{
https://www.sidefx.com/docs/houdini/feathers/scattering.html
FeatherTemplateInterpolate的Group查找模式,需要用@name=xxx来选取指定羽毛。
}
}VEX旋转物体
也可用rotate函数旋转矩阵 该函数接收弧度 可用radians将角度转弧度
c
// 1. Define your current local forward axis (usually Z)
vector current_dir = {0, 0, -1};
// 2. Define where you want it to point, world space (e.g., a custom vector)
vector target_dir = normalize(chv("target_direction"));
// 3. Create the rotation matrix
matrix3 m = dihedral(current_dir, target_dir);
// 4. Apply to geometry, a vector multiple with the matrix can be regard as Dot Product which the length of matrix vector is 1, the matrix is consist with 3-vector, mean new XYZ.
@P *= m;