posted by cimple 2017. 9. 19. 18:55

thisNode = ClassName.thisMObject(self)


이렇게 하면 thisNode 에 만들어진 Maya Node 스스로를 얻어올 수 있다.

posted by cimple 2017. 9. 15. 13:30

1. Message attribute 의 개념에 대하여

Message attribute 의 개념에 대해서는 이 영상이 잘 설명해 주고 있다.

https://vimeo.com/45110586

Message attribute 가 하는 일은 "내가 누구다" 라고 inform 을 알려주는 일이 전부이다. 중요한 것은 어떠한 Data 도 실질적으로 전달되지 않는다는 것이다.


2. Message attribute 의 값 참조

Custom Node 에서 Message Attribute 를 만든 다음 getAttr() 로 들어있는 값을 참조해보려고 해도 되지 않는다. Message Attribute 에는 실질적으로 값이 들어있지는 않기 때문이다.

따라서 Maya Script 를 이용할 때도 그렇고, 노드 안에서 API 코드로 접근할 때도 그렇고 Message attribute 에 있는 값을 직접 읽어들이려고 해서는 안 된다. (API 의 경우 MDataHandle 로 attribute 를 읽어들인 후 type 체크를 해 보면 invalide 라고 뜨게 된다.)

따라서 Message attribute 에서는 connection 만을 확인해야 한다. 해당 attribute 에 무엇이 연결되어 있는지를 확인하는 용도이다.

python command 의 경우 mc.listConnections("MyMsgAttr") 하는 식으로 연결되어 있는 대상을 찾아야 한다.

API 경우 plug 에 connection 되어 있는 다른 node 들을 찾을 수 있을 것이다.


3. Message attribute 의 Array 의 활용

Message attribute 도 array 형태로 attribute 를 만들 수는 있다.

그러나 attribute editor 에서 array 형태의 message attribute 가 표시되지는 않는다. 지금 내 경우에는 src/tgt 의 정해진 갯수의 skeleton 만을 가지로 retarget node structure 를 구성하면 되므로 굳이 array 를 쓸 필요는 없을 것 같다.

posted by cimple 2017. 9. 12. 12:05
def compute_point_to_box_dist(minXYZ, maxXYZ, point):
    dx = max(minXYZ[0] - point[0], 0, point[0] - maxXYZ[0])
    dy = max(minXYZ[1] - point[1], 0, point[1] - maxXYZ[1])
    dz = max(minXYZ[2] - point[2], 0, point[2] - maxXYZ[2])
    return (dx*dx + dy*dy *dz*dz)**0.5


위 함수를 이용하면 axis-align 된 bondong box 와 point 사이의 distance 를 간단하게 구할 수 있다.

참고 : https://stackoverflow.com/questions/5254838/calculating-distance-between-a-point-and-a-rectangular-box-nearest-point

posted by cimple 2017. 9. 8. 11:12

다음과 같은 상황에 python 의 re(regex) 라이브러리를 활용하였다.


"pPlane1.v[10]"


이라는 string 정보를 Maya 로부터 입력받았을 때, 나는 여기에서 10 이라는 vertex 의 index 만 int 형태로 받고 싶다.

find 같은 명령어를 써서 10을 찾을 수도 있겠지만 re 라이브러리를 사용하면 1줄이면 가능하다.


import re

vtx_index = int(re.findall(r'\b\d+\b', "pPlane1.v[10]")[0])


자세한 사용법은 추후에 더 공부



posted by cimple 2017. 6. 19. 16:09

PyCharm 에서 Maya API 및 Script 의 Autocompletion 이 가능하게 하는 셋팅이다.

다음 링크를 참조하였다.


https://stackoverflow.com/questions/39072433/how-to-reference-maya-commands-in-pycharm

https://forums.autodesk.com/t5/maya-programming/maya-python-api-2-0-ide-code-complete/td-p/6239681


1) Maya Python Interpreter 연결하기

Pycharm 의 Python 인터프리터를 Maya Python 인터프리터로 연결한다.

물론 Maya 가 하는 기능을 모두 하지는 못하지만, 오류가 발생하는 것을 막을 수 있다.


Setting > Project Interpreter 들어가서

톱니바퀴 > More... > Project Interpreter 를 Maya 의 것으로 선택한다.

현재 내 리눅스 Maya2015 버전의 경우 다음과 같다.


/usr/autodesk/maya2015-x64/bin/mayapy


2) Maya autocompletion 연결하기

이 경우 좀 직관적이지 않은데, 다음과 같이 수행한다.

- 위의 Project Interpreters 메뉴에서 사다리 계층구조 모양 아이콘 클릭

- /usr/autodesk/maya2015-x64/lib/python2.7/site-packages 를 지움

- /..../devkit/other/pymel/extras/completion/py

를 추가한다.

그런데 현재 내 maya2015 devkit 의 경우 추가했을 때 MPxNode 를 인지못하는 버그가 있다. 이유불명.

그래서 인터넷에서 Maya2017 Devkit 을 다운로드 받은 뒤 해당 autocompletion 을 추가하였다.


.../site-packages 를 지우는 과정이 좀 직관적이지 않은데, 지우지 않을 경우 제대로 autocompletion 이 되지 않는다.

그러나 이 경우 numpy 와 같은 external library 들을 설치했을 경우 해당 라이브러리의 autocompletion 이 어떻게 이루어지는가는 지켜 보아야 할 것 같다.


posted by cimple 2017. 6. 16. 11:17

참고링크 :

http://discourse.techart.online/t/undo-in-maya-mel-python-execution/2431/7


Maya 의 Undo 는 Queue 에 순차적으로 작업을 쌓는다. 그런데 Undo 를 수행했을 때 Undo 를 여러번 누르는 것이 아니라 Ctrl+Z 한번에 Undo 되기를 원하는 작업이 있을 수 있다. 예를 들어 오브젝트를 한 백개쯤 복사했다던가.... 이럴 때 Undo 를 100번을 눌러야 한다면 그닥 유쾌한 일이 아닐 것이다.


Maya command 의 undoInfo() 가 해당 기능을 가지고 있다.

import maya.cmds as mc
mc.undoinfo(openChunk=True)
#Code Code Code
mc.undoinfo(closeChunk=True)

위 #Code Code Code 에 해당하는 부분을 한방에 Undo 시켜 주는 것이다.

그런데 openChunk 기능은 maya 의 UndoQueue 를 직접 건드리는 상당히 위험한 기능이기 때문에 안전하게 사용할 필요가 있다. 그래서 열고 닫기가 확실하게 진행될 수 있도록


mc.undoInfo(openChunk=True)
try:
    #CODE CODE CODE
finally:
    mc.undoInfo(closeChunk=True)

위와 같은 방식으로 작성하는 것이 안전하다.

또는 다음과 같이 context class 를 만들어서


class UndoContext(object):
    def __enter__(self):
        mc.undoInfo(openChunk=True)
    def __exit__(self, *exc_info):
        mc.undoInfo(closeChunk=True)

with UndoContext():
    ... your code here....

UndoChunk 가 안전하게 열고 닫히도록 할 수도 있다.

posted by cimple 2016. 12. 13. 17:55

Maya 에서 Object 들의 Transform 을 얻어오는 방식에 대해서 정리한다.

이것이 중요한 이유는 어플리케이션을 만들 때 get 하는 일이 많이 있는데, 만약 애니메이션 전체에 대해서 빈번하게 발생할 경우 효율적인 계산이 필요하기 때문이다.



Maya Command

xform : 대부분의 transform 정보를 가져올 수 있으나, '현재' 오브젝트에만 접근 가능하다. 즉, 애니메이션 오브젝트의 정보를 가져오려면 currentTime 커맨드와 함께 사용해야만 하는 단점이 있다. 이러면 많이 느려진다.

getAttr: time flag가 있어서 각 애니메이션된 오브젝트들의 attribute 데이터에 빠르게 접근할 수 있다. 그러나 attribute 가 움직이지 않는 데이터(ex. IK chain에서 조인트의 translateXYZ 정보) 등은 받아올 수가 없다.

position 을 확인하기 위한 하나의 꼼수(!) 는 다른 object 에 constraint 를 걸고 이 값을 받아오는 것이다.


 import maya.cmds as mc

import time

def xform_per_frame(object, start_frame, end_frame):
posList = []
for i in range(start_frame, end_frame):
mc.currentTime(i)
pos = mc.xform(object, t=True, q=True, ws=True)
posList.append(pos)
return posList

def getAttr_test(object, start_frame, end_frame):
posList = []
for i in range(start_frame, end_frame):
posX = mc.getAttr(object+'.translateX', t=i)
posY = mc.getAttr(object+'.translateY', t=i)
posZ = mc.getAttr(object+'.translateZ', t=i)
posList.append([posX, posY, posZ])
return posList



t00 = time.time()
xform_list = xform_per_frame('locator1', 1, 100)
t01 = time.time()
getAttr_list = getAttr_test('locator1', 1, 100)
t02 = time.time()

print 'xform time : ', t01-t00
print 'getAttr time : ', t02-t01

위 코드는 xform 과 getAttr 의 시간차이를 나타내주는 코드이다. locator1 에 100프레임의 애니메이션을 주고 position 값을 얻는 동일한 기능을 수행한다.

시간 차이는

xform time :  0.328000068665

getAttr time :  0.0789999961853

로 4~5배정도 차이가 나는 것을 확인할 수 있다. scene 이 무거울수록 currentTime 으로 frame 을 변화시킬 때 발생하는 딜레이 현상은 더 심해진다. 


NOTE

그러나 getAttr 에도 중요한 버그(?) 가 있는데, 만약 해당 object 의 attribute 가 setKeyframe 이나 setAttr 등으로 인하여 변했을 경우, getAttr 을 하면 실제 attribute 가 바뀌었는데도 기존 값이 그대로 들어오는것을 볼 수 있다. 심지어 타임 슬라이더를 왔다갔다 하거나 카메라를 움직이거나 하는 등 씬을 새로고침해도 이 값이 변화하지 않음을 알 수 있다.

의아하게도 getAttr 로 다른 프레임의 값을 한번 읽은 다음 다시 내가 원하는 프레임의 값을 읽으면 정상적으로 값을 불러들여옴을 확인할 수 있다. 이건 버그성이 있는 것 같다.


keyframe: keyframe 을 가진 object 라면 keyframe 커맨드를 통해서 value 를 알아낼 수 있다. 꼭 keyframe 에 해당하는 frame 의 value 뿐만 아니라, key 가 없는 frame 의 value 도 알아낼 수 있다.

print mc.keyframe('ikHandle1.translateX', q=True, ev=True, t=(40,40)) 

getAttr 과는 다르게 중간에 값이 변화하더라도 즉각즉각 변화된 값을 잘 반환해준다.

그러나 아쉽게도 key 값이 없는 object 에 대해서는 값을 반환하지 않는다. 아마도 key 가 생기면 면 animation curve 가 생성되게 되고, keyframe 커맨드는 이 그래프의 값을 반환하는 것으로 생각된다. 


Maya API 를 활용하는 방법

http://cimple.tistory.com/428

해당 포스트를 참조


posted by cimple 2016. 3. 31. 16:57

Maya 에서 특정 프레임 f 에서 object 의 world position 을 얻는 가장 간단한 방법은 이것이다.


import maya.cmds as mc
mc.currentTime(f)  # f is specific frame
mc.xform(obj, q=True, t=True, ws=True), #obj is specific object

그러나, 이 방식의 경우 'currentTime()' 커맨드로 특정 프레임으로 이동한 다음 계산하므로 씬이 전체적으로 업데이트 되어야 해서 만약 다수의 프레임에 대해 처리를 해야 할 경우 속도가 매우 느리다.


'currentTime()' 커맨드를 쓰지 않고 위치정보를 받아올 수 있는 다른 방법으로는 'getAttr()' 커맨드를 이용하는 방식이 있는데, 이 방식은 말그대로 attribute 의 값을 가져올 뿐이므로, object 의 world position 같은 정보를 직접적으로 얻어올 수는 없다.


이를 위하여, 아래는 Maya Python API 2.0 을 활용하여 특정 ojbect 의 world position 을 내가 원하는 frame 에서 찾는 Python Script 이다.


import maya.cmds as mc
import maya.api.OpenMaya as om

def mayaTimeUnitTypeQuery():
    mayaTimeUnitDic = {'100fps':25, '10fps':18, '1200fps':38, '120fps':26, '125fps':27, '12fps':19, '1500fps':39, '150fps':28, '16fps':20, '2000fps':40, '200fps':29, '20fps':21, '240fps':30, '250fps':31, '2fps':12, '3000fps':41, '300fps':32, '375fps':13, '400fps':34, '40fps':22, '4fps':14, '500fps':35, '5fps':15, '6000fps':42, '600fps':36, '6fps':16, '750fps':37, '75fps':23, '80fps':24, '8fps':17, 'film':6, 'game':15, 'hour':1, 'millisec':4, 'sec':3, 'min':2, 'ntsc':8, 'ntscf':11, 'palf':10, 'pal':7, 'show':9} 
    curTimeUnit = mc.currentUnit(q=True, time=True)
    try:
        mayaTimeUnit = mayaTimeUnitDic[curTimeUnit]
    except:
        raise NameError('Invalid Maya time unit. %s is not in the Maya unit dictionary.'%(curTimeUnit))
    return mayaTimeUnit
    

def getWorldPosAtTime(obj, frame):
    sList = om.MSelectionList()
    sList.add(obj)
    dagPath = sList.getDagPath(0)
    transFn = om.MFnDagNode(dagPath)
    matrixPlugArr = transFn.findPlug('worldMatrix', 0)
    matrixPlugArr.evaluateNumElements()
    matrixPlug = matrixPlugArr.elementByPhysicalIndex(0)
    
    curTimeUnit = mayaTimeUnitTypeQuery()
    mayaTime = om.MTime(frame, unit=curTimeUnit)
    timeContext = om.MDGContext(mayaTime)
    
    plugObj = matrixPlug.asMObject(timeContext)   
    #print plugObj.apiTypeStr  #kMatrixData
    plugObjFn = om.MFnMatrixData(plugObj)
    worldMatrix = plugObjFn.transformation()
    worldPos = worldMatrix.translation(om.MSpace.kWorld)
    return worldPos

mayaTimeUnitTypeQuery() 함수는 현재 Maya 에 설정되어 있는 FPS 값을 미리 상수로 예약되어 있는 MayaTimeUnit 값으로 리턴해준다. Maya 에 예약된 모든 FPS 를 포함하는 함수이므로 유용할 것이다. 이 함수에서 오류가 난다면 버그가 있는 것이므로 제보바람.

getWorldPosAtTime() 함수가 우리가 원하는 일을 해 주는 함수인데, 위치를 알고싶은 obj 와 frame 을 입력하면 해당 frame 에서의 world position 을 반환해준다.
Object DagNode 의 worldMatrix plug 에서 matrix data 형태로 어떻게 가지고 오는지,
그리고 MTime 과 MDGContext timeContext 객체를 만들어 어떻게 특정 frame 에서의 value 를 retrieve 하는지가 주목할 만한 부분이다.



posted by cimple 2015. 12. 11. 23:11

기본적으로 Maya Python Command 는 '실행해야' 동작하는 구조를 가지고 있다. 즉, 무언가 Maya 로부터 Active 하게 기능을 실행하는 데에는 주로 Node 를 활용해야 한다는 것이다.


가장 쉬운 예로, 내가 Maya 의 Time Slider 를 이리저리 왔다갔다 했을 때, 현재 프레임이 찍히도록 하고 싶다, 라고 하면 일단 난감하다. 기본적으로 Python command 는 'maya.cmds.currentTime(q=True)' 라는 명령어를 실행해야 현재 프레임을 받아올 수 있기 때문이다.


그러나, Active 한 기능을 비교적 쉽게 구현할 수 있다. 바로 마야에서 제공하는 Callback 함수를 이용하는 것이다.


위의 쉬운 예제를 코드로 짜면 다음과 같다.


import maya.cmds as mc
import maya.OpenMaya as om
def customFtn2(msg):
    print 'currentTime : ', int(mc.currentTime(q=True))
frameCallback = om.MEventMessage.addEventCallback('timeChanged', customFtn2)


이렇게 하면 타임 슬라이더바를 움직이는 것 만으로도 스크립트를 실행할 수 있다.

그러나 여기에서 유의할 것은 한번 연결해준 콜백 함수는 마야가 꺼질때까지 동작한다. 그러므로 더 이상 이 기능을 사용하고 싶지 않으면, 내가 연결해준 콜백 연결을 해제해야 한다. 이 해제는 콜백 넘버를 통해서 할 수 있는데, addEventCallback 함수가 리턴하는 것이 바로 이 콜백 넘버이다. 

그러므로 아래와 같이 콜백 연결을 삭제할 수 있다.


om.MEventMessage.removeCallback(frameCallback)



이렇게 해 주면 된다.





Maya command 중에 scriptjob 커맨드를 사용하면 이와 유사한 효과를 낼 수 있다.

그러나 api 를 사용하는 것과 달리, 명령이 종료한 후에 효과를 발휘한다.

쉽게 말해, 위의 예제에서 타임 슬라이더바를 움직이는 동안에는 효과가 없고, 마우스 버트를 놓는 순간부터 효과가 발휘된다는 뜻이다.



posted by cimple 2014. 12. 31. 03:02

옛날 'Maya2014에서 numpy 사용하기' 라는 글에서 약간 얼렁뚱땅 Maya2014 의 Python library 사용문제를 넘어갔었는데, 결국 언젠가는 굴러굴러 문제로 닥칠수밖에 없는 일. 하루를 모두 소진해서야 문제를 해결할 수 있었다.


욕을 하지 않으려고 해도 지랄맞은(...) 마야의 Python 시스템 때문에 정말 수도없는 테스트와 테스트 끝에 해결을 하고 나니 진이 다 빠지는 느낌이지만, 정리를 하지 않으면 누군가가 또 고생할 것이고 인간은 망각의 동물이니 나도 고생할 수 있기 때문에....


단지 Maya2014 에서 python nlopt 를 사용하는 문제뿐만 아니라, python library 를 사용하는데 있어 비슷한 문제가 발생했을 때에 해결하는 단초를 찾았다는 생각이다.





시간없는 사람들을 위해


먼저 일단 차치하고 Maya2014 에서 사용할수 있는 nlopt 라이브러리


nlopt_maya2014.7z


기존처럼 C:\Program Files\Autodesk\Maya2014\Python\Lib\site-packages 에 복사해 넣으면 된다.

(물론 Numpy 도 설치되어 있어야 돌아간다. Numpy 는 위 링크글 참조...)





1. 문제의 유형 및 발생원인


Maya2012 까지는 간편하게 Numpy 와 nlopt 를 설치할 수 있다. 비공식이긴 하지만 64bit python 컴파일된 binary 를 distribute 하기 때문이다. 이걸 설치하고 Maya 의 python 의 site-package 폴더에 복사만 해주면 된다.


numpy 링크

http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy


nlopt 링크

http://www.lfd.uci.edu/~gohlke/pythonlibs/#nlopt



그런데 이게 Maya2013 부터 numpy 부터 시작해서 라이브러리들이 import 가 잘 안되기 시작했는데, 그 이유가 Maya 의 Python 을 빌드한 컴파일러 문제이다. 이것을 알아보기 위해서 다음 명령어를 

import sys
print sys.version

각각 다른 버전의 Maya Script Editor 에 쳐서 확인해보면 다음과 같은 결과를 얻을 수 있다.


Maya2012


Maya2013


Maya2014


보다시피 Maya2013 부터 Python 컴파일러를 MSC v.1600, 즉 VS2010 compiler 로 컴파일했다는 사실을 알 수 있다. 


이게 아주 쓰레기같은게 뭐냐면 우리가 Python 홈페이지에서 받을 수 있는 파이선 2.x 버전들을 체크 해보면 MSC v.1500 로 컴파일되어 있다. 즉 VS2008 에서 컴파일한 버전을 배포하고 있다. v.1600 은 Python 3.x 버전 이후부터이다.


그런데 이 샹늠의 Maya 는 뭐가 잘났다고 혼자 독특하고 고고하게 VS2010 에서 컴파일한 파이선 2.x 버전을 사용하고 있다. 그것도 Maya2014 부터는 Python 2.7 버전을 사용한다. 아마도 추후에는 Python 3.x 버전으로 업그레이드를 할 목적이긴 하겠지만, 이것이 문제를 발생시키는 가장 큰 원인이었다.


이 문제 때문에 어렵사리 컴파일한 nlopt 를 사용할 수가 없었다. 가장 고생한 에러메시지는 바로 이것일 것이다.


ImportError: DLL load failed: %1은(는) 올바른 Win32 응용 프로그램이 아닙니다.


이걸 해결하기 위해서, 'Python2.7 자체를 VS2010 컴파일러로 다시 컴파일' 해야만 했다. 왜 그래야만 했는지는 아래에 설명...



2. python nlopt 컴파일하기


일단 내 입맛에 맞는 python nlopt 라이브러리의 binary 버전은 없다. 애초에 Window 에서 쓰라고 만든것도 아니고 Python nlopt 는 Wrap 해서 배포할 뿐이지 원래 c++ 라이브러리다. 직접 만들어 써야 한다고 보면 된다. 찾으려고 괜히 애쓰지 말고 컴파일 하는 것이 오히려 이득이다.


다음과 같은 순서를 따르면 된다.


1) 일단 nlopt 소스파일을 다운로드 받아서 압축을 풀어놓는다. 위치는 상관없다. 어차피 필요한건 컴파일한 다음 라이브러리 파일이다.

http://ab-initio.mit.edu/wiki/index.php/NLopt#Download_and_installation


2) 다음은 아래 페이지에서

http://ab-initio.mit.edu/wiki/index.php/NLopt_on_Windows


nlopt-2.4.2-dll64.zip (64-bit) 압축파일을 받아서 압축을 푼다. 미리 컴파일해둔 win64 용 .dll 파일이 있고 어쩌고 하는데 어차피 못쓴다. MinGW 로 컴파일한것이기 때문이다. 어차피 MSVC 로 다시 컴파일해야 한다. 이 압축파일의 용도는, nlopt 의 라이브러리파일 .lib 가 만들어지면, python 으로 컴파일할 수 있는 setup.py 파일이 포함되어 있기 때문이다.


3) 위 2) 의 링크 NLopt on Windows 페이지에서 CMake 관련파일 2개를 받는다. CMakeLists.txt 와 config.cmake.h.in 이다. 이것들을 1) 의 압축 풀어놓은 폴더에 넣는다.


cmake 로 VS 프로젝트를 생성-> 컴파일해서 Shared library (.dll) 생성 -> 이걸 Python 으로 컴파일 하는 것이 전체적인 얼개이다.


4) Cmake 로 해당 폴더를 Configure 하면 설정을 잘 잡아주는데, 주의해야 할 것은 

BUILD_SHARED_LIBS 옵션을 체크해 주어야 한다는 것이다. 여기서 컴파일된 .dll 파일을 가지고 python 에서 다시 컴파일한다.


5) Cmake 에서 Generate 하면 VS2010 프로젝트가 생성된다. 열어서 빌드하면 nlopt-0.dll 이라는 dll 이 생성될 것이다.


6) 이제 이것을 2) 에서 받았던 폴더에 넣는데, 원래 있던 dll 인 libnlopt-0.dll 을 지우고 그 이름으로 넣는다.


7) 이제 dll 을 가지고 lib 를 만들 차례이다. (사실 컴파일 자체는 해당 폴더의 README-WINDOWS 를 읽으면 있는 내용이다.) 명령 프롬프트를 써야 하는데, Visual Studio Win64 명령 프롬프트(x64) 를 실행시킨 다음 해당 폴더로 찾아들어간다. 그리고 아래 명령어 입력.


lib /def:libnlopt-0.def


8) 그럼 libnlopt-0.lib 파일이 만들어진다. 이제 python 으로 컴파일한다.


python setup.py build_ext --inplace


위 명령어로 컴파일하면 되는데, 여기가 지랄맞다!!!! 그 이유는, 여기서 python 으로 컴파일하는 것은 내가 환경변수에 등록된 python 으로 컴파일하는데, 이 python 이 처음에 말했지만 흔히 배포되는 Python2.x 의 MSC v.1500 컴파일된 python 을 사용하면 maya 에서 이 nlopt 를 쓸 수가 없다.


따라서 MSC v.1600 으로 컴파일된 python 으로 이 라이브러리를 빌드해야 한다. 그러기 위해서는 VS2010 에서 컴파일된 python2.x 버전을 사용해야 하는데, 나를 도와준 고마운 링크는 아래...


http://www.p-nand-q.com/python/building-python-27-with-vs2010.html


그냥 여기서 주는 python2.7 다운받아 썼다....지만 근데 site-package 를 뭔 이렇게 쓸데없이 깔아서 배포했는지 너무 무겁다; python 직접 컴파일하셔도 됨. 시간많으시면.


어쨌든 이 MSC v.1600 으로 컴파일된 python 으로 위 명령어를 통해 python 으로 컴파일하면, _nlopt.pyd 파일이 생성된다.


9) _nlopt.pyd, nlopt.py, nlopt-0.dll 3개의 파일을 maya 의 site-package 폴더에 넣으면 Maya 에서 잘 돌아가는 nlopt 를 감상할 수 있다.






써놓고 보니 간단해 보이는데 정말 python/라이브러리/심지어 Maya2014 까지 다시깔고, 컴파일 이런 저런 옵션 찾아가며 또해보고, document 읽고 또 읽고... 


해결은 했지만 이거 정말 Maya 문제 있다는 생각이다....





덧붙임1. NLopt 의 installation guide 에서 python_plugin 파트를 읽어보면


http://ab-initio.mit.edu/wiki/index.php/NLopt_Installation#Python_plugins


'Shared library 로 컴파일을 하면 자동으로 python plugin 을 설치해 줍니다!' (오오??) 라고 하는데 Windows 사용자들은 헛된기대 하지 말자... Linux make 파일에서 제공해주는 설정들이다. 실제로 make 파일과 configure 파일을 뜯어보면 python version 의 site-package 에 설치해주는 부분들이 있어서 한참 들여다봤지만 결국 Windows 에서 CMake 로 만든 VS Project 로 컴파일하는 유저들에게는 그런거 없는거로.....