许 伟
(陕西教育学院 计算机科学与技术系,西安 710100)
3DS Max是美国Autodesk公司开发的三维动画制作和渲染的软件,它广泛应用于广告、影视、工业设计、建筑设计、多媒体制作、游戏、辅助教学以及工程可视化等领域。但它不能解决用户应用的各个方面。软件中场景对象数据捕获与数据导入导出,就需要使用者自行设计开发。一般动画设计者对计算机软件了解甚少,不具备自主开发能力,而计算机软件开发者对动画设计和制作以及动画制作软件环境缺乏足够的认识与相关专业知识,因此很难开发出符合要求的应用模块来。本文将动画制作中所涉及到的3DS MAX中数据导入导出应对策略推介如下。
在实际操作中,有时需要使用客户提供的数据产生特定的动画效果。应用MAXScript可导入外部数据,这些外部数据可以是文本文件、word文件或Excel文件形式,利用这些数据可以精确地在3DS MAX中创建模型或生成动画,这种应用在实际工作中非常常见。
在实际应用中笔者遇到用户提供的CSV数据文件,要求根据文件中提供的数据创建特定运动轨迹的动画。CSV一种纯文本格式,数据的字段由逗号分开,程序通过读取文件重新创建正确的字段,方法是每次遇到逗号时开始新一段数据。图1为CSV的一个简单数据文件。其中每行提
供了四个数据,每个数据之间用逗号分隔开。第一个数据为动画产生的时间,第二个至第四个为Point3数据类型即[x,y,z] 形式的坐标值,下列提供的MAXScript脚本读取这个文件的数据,并按照数据文件的要求创建一个动画,生成的动画效果为物体作圆周运动。
图1 CSV数据文件样式
(
local theFilename = getOpenFileName types:"按列分隔的值 (*.CSV)|*.CSV|All Files (*.*)|*.*"
if theFilename != undef i ned do (
local theFile = openFile theFilename – 打开文件
local theObject = Sphere radius:5 showtrajectory:true
while not eof theFile do ( --循环直到数据读完
theTime = fl oor ((readValue theFile) + 0.5)--返回小于或者等于指定表达式的最大整数
with animate on
at time theTime
theObject.pos = Point3(readValue theFile) (readValue theFile) (readValue theFile)
)
close theFile --关闭文件
))
有时需要将3DS MAX场景中的物体自身构成坐标参数或运动物体的动画参数输出成特定格式的文件,以便对这些参数数据比对和分析,然后制定出最佳的匹配方案,这些应用都需要软件使用者自行开发。例如,下列脚本中使用getVert命令可获取场景中所有三维物体的每个被索引顶点所构成的顶点坐标值并将其按照point3数据类型输出为数据文件。
图2 将对象构成顶点坐标值输出为CSV数据文件
-- 创建输出文件
exFile = openFile "C:\exportData.txt" mode:"w"
-- 采集场景中的全部三维物体
for obj in geometry do (
-- Write name of object
format "对象名称 ("%"); 对象顶点总数:% "obj.name obj.mesh.numverts to:exFile
-- Write vert positions of object
for i in 1 to obj.mesh.numverts do (
vertPos = getVert obj.mesh i
format "顶 点 编 号:%; 顶 点 坐 标值 :(%,%,%) " i vertPos.x vertPos.y vertPos.z to:exFile
))
-- 关闭输出文件
close exFile
可以将场景中二维形状即曲线对象按照指定的采样插值精度求出曲线的插值点的世界坐标值并将其存储为特定格式的文本文件。3DS MAX中针对曲线有两种方法在曲线上进行插值定位计算,一种是顶点插值,另一种是长度插值。当使用顶点插值(又名路径插补),样条线被视为若干段,其中每两个顶点之间的部分是一个规范化的空间从0.0到1.0。插值过程中忽略段的两个顶点之间的距离,这意味着,如果该段的长度是不同的,沿样条线的线性插值会导致物体沿曲线运动是非匀速的。当使用长度插补,整个曲线的长度会被单位化,所以参数是0.5就是样条曲线的中间位置而并不考虑曲线的实际长度。使用0.0和1.0的单位化线性变化关系,会使物体沿此曲线运动匀速动画速度。3DS MAX中通过 interpCurve3D脚本命令来获取插值值。例如,运行下列脚本将场景中绘制的世界地图曲线按照5%的采样精度,求出其插值点的世界坐标值,如图3所示。
-- Create export fi le
expFile = openFile "C:\exportData.txt" mode:"w"
-- Loop through geometry in the scene
for obj in shapes do
(
-- Write name of object
format "曲线的名称:("%") " obj.name to:expFile
-- Write vert positions of object
if (isKindOf obj SplineShape) then
(
for i = 0.0 to 1.0 by .05 do --在曲线上获取20个采样位置的坐标值。
(
vert = interpCurve3D obj 1 i
format "采样点坐标值:(%,%), "vert.x vert.z to:expFile
) )
else
format "它是非 splineshape 对象。 "to:expFile
)
图3 世界地图曲线按5%采样精度取得的插值点坐标
close expFile -- Close export fi le
在现实中很多应用都具有针对性,其指向非常具体,不可能以一概全。作为一个优秀的动画化设计制作者,不但应具备娴熟的艺术创作技艺功底,而且也应具备软件开发知识,若具有一定的开发能力便会进一步提高技能激发创造力,就能将用户提供的精确数据直接应用于计算机动画中的具体对象,从而产生精准的动画效果,计算机动画是艺术与技术的巧妙结合。
[1] http://mathworld.wolfram.com/
[2] 3DS MAX 2011 MAXScript Reference (软件所带的脚本用户手册).
[3] 王华.3ds MAXScript 脚本语言完全学习手册[J].兵器工业出版社, 2006.
[4] Fletcher Dunn Lan Parberry, 著.史银雪.等译.3D 数学基础:图形与游戏开发(美)[M]. 清华大学出版社.
[5] John Vince.Mathematics for Computer Graphics.Second Edition[M].Springer Science+Business Media.