MAXScript101_5.6 TreePlanter – Scene Generation using Mesh Sampling
实例:
-- 脚本使用前提:创建曲面作为大地,命名为ground; 创建一条曲线作为道路,名为为road; -- 创建一棵树,后面的实例对象,命名为masterTree -- 脚本功能:沿着道路,随机生成树,树的棵树可以自定义 -- place trees on a surface randomly along a curve numTrees = 500 for i in 1 to numTrees do ( -- step1: 随机生成沿着道路的位置 -- get random pos along the curve & tangent there local u = random 0.0 1.0, pos = lengthInterp $road 1 u, tan = lengthTangent $road 1 u -- step2: 设计树沿道路两旁栽种 -- generate perpendicular ray at random offset local offset = random 5 18 * (if i < numTrees / 2 then 1 else -1), -- 计算偏移向量 offsetVec = cross tan z_axis * offset, -- 计算曲线上的点按偏移向量走的位置 offsetPos = pos + offsetVec, treeRay = ray [offsetPos.x, offsetPos.y, 1000] [0, 0, -1] -- step3: 将树种在大地曲面上 -- intersect ray with ground surface to get tree pos, gen random -- 求与大地的交点 local treePos = (intersectRay $ground treeRay).pos, treeScale = [1, 1, 1] * random 0.2 1.1 -- instance master tree at that pos & scale instance $masterTree pos:treePos scale: treeScale name:"tree" -- update screen every 10 trees if mod i 10 == 0 then redrawViews() )
备注:
1. 有关射线(ray)
-- 一个点,一个方向确定一条射线
treeRay = ray [10,10,1000] [0, 0, -1] -- (ray [10,10,1000] [0,0,-1])
-- intersectRay 返回新的射线,它的点为参数中的射线与参数中的曲面的交点,方向为该曲面在该交点的法向
p = intersectRay $ground treeRay -- (ray [10,10,0] [0,0,1])
p.pos -- [10,10,0]
p.dir -- [0,0,1]
这里$ground是z = 0的 plane.