利用3DSMAX腳本產生原子運動動畫

利用3DSMAX腳本產生原子運動動畫

很久,很久以前,曾經做過一些關於分子動力學的工作,最後無疾而終,幾乎什麼都沒有留下。分子動力學(Molecular Dynamic Simulation)計算微觀原子間的相互作用,產生其運動軌跡,所有原子的運動形態最終表現爲物體宏觀的運動和變形等。

如果將這些原子的運動以動畫的形式渲染出來,無疑是非常形象的。我曾經用3DSMAX的腳本MAXScript編寫了一段程序來完成這個功能,在這裏貼出來,供有需要的參考。
以下圖中的模型爲例,上面是Au探針,壓入下面的Ni平板。原子的初始座標值(x,y,z)分別放在文本文件posau0.txt和posni0.txt;
計算過程中產生一系列的原子座標文件,這些文件以編號區別,如posau1.txt~posau100.txt;
在腳本文件中,首先讀入原子的座標信息,建立模型,每個原子對應一個球模型;
然後,在時間軸的不同時間座標上,讀入並指定每個原子的新座標。
腳本的執行我也記不清了。可以在網上搜一下。
完整的程序如下(“--”的註釋是把程序粘貼過來後補上去的,不知道有沒有什麼問題。我是在3DSMAX 5上運行的。):

--指定數組變量;
posarray = #()
postemp = #()
spAu = #()
spNi = #()
lay = #()
--字符串變量
strti = " "
--Au模型中原子個數,座標數據量
atomau = 768
dataau = atomau*3
--Ni模型中原子個數,座標數據量
atomni = 616
datani = atomni*3
--位置座標文件的個數,不含初始座標文件
framenum = 14
--原子半徑
Rau = 1.44
Rni = 1.3
--指定材質,Ni平板每一層具有不同的顏色
--textMatAu = standardMaterial diffuse:[125, 125, 255]
textMatNi = standardMaterial diffuse:[92, 216, 92]
textMat1 = standardMaterial diffuse:[126, 173, 126]
textMat2 = standardMaterial diffuse:[233, 114, 67]
textMat3 = standardMaterial diffuse:[236, 224, 92]
textMat4 = standardMaterial diffuse:[92, 92, 216]
textMat5 = standardMaterial diffuse:[60, 151, 159]
textMat6 = standardMaterial diffuse:[179, 121, 216]
--讀入Au的初始座標
filename = "F:/data/posau0.txt"
in_name = (filename)
in_file = openFile in_name

if in_file != undefined then
(
for v=1 to dataau do
(
vert = readValue in_file
posarray[v]=vert
)
close in_file
--根據原子座標建立每個原子的球模型
for v=1 to atomau do
(
ti=(v-1)*3+1
px = posarray[ti]
ti=ti+1
py = posarray[ti]
pz = posarray[ti+1]

spAu[v] = sphere radius:Rau position:[px, py, pz] segs:12 smooth:true
--判斷原子所在的層,指定不同的材質
lay = (v-1)/288 as integer
lay = lay+1
if lay == 1 then
(spAu[v].mat = textMat1 )
if lay ==2 then
(spAu[v].mat = textMat2 )
if lay ==3 then
(spAu[v].mat = textMat3 )
if lay ==4 then
(spAu[v].mat = textMat4 )
if lay ==5 then
(spAu[v].mat = textMat5 )
if lay ==6 then
(spAu[v].mat = textMat6 )

)

)

--讀入Ni的原子位置,並建立模型
filename = "F:/data/posni0.txt"
in_name = (filename)
in_file = openFile in_name
if in_file != undefined then
(
for v=1 to datani do
(
vert = readValue in_file
posarray[v]=vert
)
close in_file

for v=1 to atomni do
(
ti=(v-1)*3+1
px = posarray[ti]
ti=ti+1
py = posarray[ti]
pz = posarray[ti+1]

spNi[v] = sphere radius:Rni position:[px, py, pz] segs:12 smooth:true
spNi[v].mat = textmatNi
)

)

--開始設置座標-時間動畫
animate on (
at time 0
for tj in 1 to framenum do
( ti=tj*10
--指定新座標對應的時間
at time ti (
strti = tj as string
filename = "F:/data/posau"+strti+".txt"
in_name = (filename)
in_file = openFile in_name
if in_file != undefined then
(
for v=1 to dataau do
(
vert = readValue in_file
posarray[v]=vert
)
close in_file

for v=1 to atomau do
(
ti=(v-1)*3+1
px = posarray[ti]
ti=ti+1
py = posarray[ti]
pz = posarray[ti+1]
--設置Au原子模型的新位置
spAu[v].position = [px, py, pz]
)
)

filename = "F:/data/posni"+strti+".txt"
in_name = (filename)
in_file = openFile in_name
if in_file != undefined then
(
for v=1 to datani do
(
vert = readValue in_file
posarray[v]=vert
)
close in_file

for v=1 to atomni do
(
ti=(v-1)*3+1
px = posarray[ti]
ti=ti+1
py = posarray[ti]
pz = posarray[ti+1]

spNi[v].position = [px, py, pz]

)

)
)

)
)

--max time play

再貼一個效果圖(模擬計算結果本身可能不正確):


 
發佈了37 篇原創文章 · 獲贊 4 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章