본문 바로가기
College Study/Maya (KR,ENG)

[Maya] 파이썬으로 모델링하기 (애니메이션 : 키프레임 설정, 숨 쉬는 트리) Modeling with Python (Animation : Setting Keyframe and Giving Breath)

by 2den 2020. 11. 7.
728x90

2019. 3. 13. 10:39

 

일단 pymel 코드를 cmds로 변환시켰다. (애니메이션을 설정하기 편리하기 때문이었던 것 같다.)

First, I converted pymel code to cmds.

import maya.cmds as cmds
import random

myPyramids = []

#make pyramids
for n in range (2872):
    myPyramids.append(cmds.polyPyramid())
      
count = 0
for x in range (20):
    yran = 20 - x
    for y in range (yran):
        zran = 20 - y
        for z in range (zran):
            cmds.select(myPyramids[count])
            cmds.move(0.05*x*x, y, 0.05*z*z) #curve
            cmds.scale(0.5, 0.5, 0.5)
            rg = int(random.random()*10)%2 #red or green?
            if (rg): #green
                cmds.polyColorPerVertex(colorRGB=[0, 1-random.random(), 0], colorDisplayOption=True)
            else: #red
                cmds.polyColorPerVertex(colorRGB=[1-random.random(), 0, 0], colorDisplayOption=True)
            cmds.polyMirrorFace(direction=0, mergeMode=1)
            cmds.polyMirrorFace(direction=4, mergeMode=1)
            #cmds.rotate(x*10.0, y*10.0, z*10.0)
            count = count + 1

#star 1
cmds.select(myPyramids[count])
cmds.move(0, 20.1, 0.2)
cmds.scale(1, 1, 1)
cmds.rotate(90, 0, 0)
cmds.polyColorPerVertex(colorRGB=[1,1,0], colorDisplayOption=True)
count = count + 1

#star 2
cmds.select(myPyramids[count])
cmds.move(0, 20.1, -0.2)
cmds.scale(1, 1, 1)
cmds.rotate(270, 0, 45)
cmds.polyColorPerVertex(colorRGB=[1,1,0], colorDisplayOption=True)

 

그 다음 별을 빙글빙글 돌려주기 위한 키프레임을 설정했다.

Then I set keyframe to spin the star.

import maya.cmds as cmds
import random

myPyramids = []

#make pyramids
for n in range (2872):
    myPyramids.append(cmds.polyPyramid())
      
count = 0
for x in range (20):
    yran = 20 - x
    for y in range (yran):
        zran = 20 - y
        for z in range (zran):
            cmds.select(myPyramids[count])
            cmds.move(0.05*x*x, y, 0.05*z*z) #curve
            cmds.scale(0.5, 0.5, 0.5)
            rg = int(random.random()*10)%2 #red or green?
            if (rg): #green
                cmds.polyColorPerVertex(colorRGB=[0, 1-random.random(), 0], colorDisplayOption=True)
            else: #red
                cmds.polyColorPerVertex(colorRGB=[1-random.random(), 0, 0], colorDisplayOption=True)
            cmds.polyMirrorFace(direction=0, mergeMode=1)
            cmds.polyMirrorFace(direction=4, mergeMode=1)
            #cmds.rotate(x*10.0, y*10.0, z*10.0)
            count = count + 1

#star 1
cmds.select(myPyramids[count])
cmds.move(0, 20.1, 0.2)
cmds.scale(1, 1, 1)
cmds.rotate(90, 0, 0)
for i in range (80):
    cmds.setKeyframe(v=i*45, at='rotateZ', t=i*5)
cmds.polyColorPerVertex(colorRGB=[1,1,0], colorDisplayOption=True)
count = count + 1

#star 2
cmds.select(myPyramids[count])
cmds.move(0, 20.1, -0.2)
cmds.scale(1, 1, 1)
cmds.rotate(270, 0, 45)
for j in range (80):
    cmds.setKeyframe(v=(j+1)*45, at='rotateZ', t=j*5)
cmds.polyColorPerVertex(colorRGB=[1,1,0], colorDisplayOption=True)

 

그리고 나서 피라미드들(잎)에 위아래로 오르내릴 수 있는 키프레임을 설정하여 트리가 숨 쉬는 것처럼 보이게 해주었다.

(일차함수 직선 상 위치와 이차함수 곡선 상 위치를 키프레임으로 사이를 이동)

And I set keyframes for the pyramids to make them move up and down, so that the tree seems to be breathing.

import maya.cmds as cmds
import random

pyramid_list = []

#make pyramids
for n in range (2872):
    pyramid_list.append(cmds.polyPyramid())
    
#make a tree
count = 0
for x in range (20):
    yran = 20 - x
    for y in range (yran):
        zran = 20 - y
        for z in range (zran):
            cmds.select(pyramid_list[count])
            cmds.move(x, y, z)
            cmds.move(0.05*x*x, y, 0.05*z*z) #curve
            
            #animation - breath
            for k in range (20):
                if not k % 2:
                    cmds.setKeyframe(v=y, at='translateY', t=k*20)
                else:
                    cmds.setKeyframe(v=0.05*y*y, at='translateY', t=k*20)
                    
            cmds.scale(0.5, 0.5, 0.5)
            rg = int(random.random()*10)%2 #red or green?
            if rg: #green
                cmds.polyColorPerVertex(colorRGB=[0, 1-random.random(), 0], colorDisplayOption=True)
            else: #red
                cmds.polyColorPerVertex(colorRGB=[1-random.random(), 0, 0], colorDisplayOption=True)
            cmds.polyMirrorFace(direction=0, mergeMode=1)
            cmds.polyMirrorFace(direction=4, mergeMode=1)
            #cmds.rotate(x*10.0, y*10.0, z*10.0)
            count = count + 1

#star 1
cmds.select(pyramid_list[count])
cmds.move(0, 20.1, 0.2)
cmds.scale(1, 1, 1)
cmds.rotate(90, 0, 0)
for i in range (80):
    cmds.setKeyframe(v=i*45, at='rotateZ', t=i*5)
cmds.polyColorPerVertex(colorRGB=[1,1,0], colorDisplayOption=True)
count = count + 1

#star 2
cmds.select(pyramid_list[count])
cmds.move(0, 20.1, -0.2)
cmds.scale(1, 1, 1)
cmds.rotate(270, 0, 45)
for j in range (80):
    cmds.setKeyframe(v=(j+1)*45, at='rotateZ', t=j*5)
cmds.polyColorPerVertex(colorRGB=[1,1,0], colorDisplayOption=True)

 

끝!

It's the end!

 

728x90

댓글