如何使用Python在3dMax控制网格对象?

我们以一个在3dMax中使用Python脚本在网格对象对象上创建水波变形作为例子。

首先,在3dmax创建两个对象,一个“box”对象,将长宽方向的分段设置的多一些(目的是为了后面的水波变形),一个“点”帮助对象(它将指示涟漪的中心位置)。

如何使用Python在3dMax控制网格对象?_第1张图片

脚本编写的思路是:通过循环遍历网格对象的顶点,获取它们的世界坐标位置,并将新的Z位置设置为距效果中心距离的正弦函数。

下面我们看一下代码:

import math
from MaxPlus import Factory
from MaxPlus import ClassIds
from MaxPlus import INode
from MaxPlus import TriObject
from MaxPlus import Matrix3
from MaxPlus import Point3

# Intensity:
effecr_mult = 1.0

# Effect center:
effector = INode.GetINodeByName('Point001')
effect_pos = effector.GetWorldPosition()

# Prepare object and eccess it's mesh data:
node = INode.GetINodeByName('Box001')
new_edit_mesh_mod = Factory.CreateObjectModifier(ClassIds.Edit_Mesh)
node.AddModifier(new_edit_mesh_mod)
node.Collapse(True)
node_tm = node.GetWorldTM()
node_pos = node.GetWorldPosition()
obj = node.GetObject()
triobj = TriObject._CastFrom(obj)
mesh = triobj.GetMesh()

# Process the object's vertices:
for i in range(mesh.GetNumVertices()):
     # Get vertex in world space
     vert_pos = mesh.GetVertex(i)
     vert_world_pos = node_tm.VectorTransform(vert_pos)
     vert_world_pos = vert_world_pos + node_pos
     # Get vertex distance from effect center:
     diff_vec = vert_world_pos - effect_pos 
     diff_vec.Z = 0
     dist = diff_vec.GetLength()
     # Set new vertex position:
     mesh.SetVert(i,vert_pos.X,vert_pos.Y,vert_pos.Z + math.sin(dist)*effecr_mult)

将上面代码复制到MAXScript编辑器中,然后,将当前语言设置为:Python,同时按下“Ctrl+e”执行,结果如下图:

如何使用Python在3dMax控制网格对象?_第2张图片

提示:在复制和粘贴本例中的Python脚本时,请注意缩进可能无法正确粘贴。

你可能感兴趣的:(3DMAX,python,开发语言,MAXScript,3dmax,3dmax插件)