posted by cimple 2020. 12. 18. 01:38

최근 오래된 물건들을 하나 하나 정리를 하고 있습니다.

그 중에서도 휴대폰에는 오래된 추억들이 담겨 있는데, 그 안에 있는 내용들을 백업하고 이제는 떠나 보내주려고 합니다.

 

휴대폰 중에서 SPH-W5200 모델은 데이터 케이블을 연결하는 것만으로도 손쉽게 안에 있던 사진 등을 백업할 수 있었지만,

SPH-W2900 모델의 경우에는 이리저리 설치해야 하는 드라이버나 소프트웨어가 있었고, 무엇보다 더이상 지원이 되지 않는 소프트웨어나 드라이버가 많아서 찾는데 좀 시간이 걸렸습니다.

누군가 추억을 되살리시는데 도움이 되기 위하여 이 포스팅을 남깁니다.

 

왼쪽 휴대폰이 SPH-W5200, 오른쪽 휴대폰이 오늘의 주인공인 SPH-W2900

 

 

1. 케이블과 커넥터

 

일단 중요한 것이, 휴대폰과 컴퓨터를 연결할 케이블과 커넥터를 준비하는 것입니다. 결론부터 말씀 드리면 다음 케이블과 커넥터를 준비하셔야 합니다.

24핀 USB 데이터 전송 케이블
삼성 20핀 커넥터

- 24핀 USB 데이터 전송 케이블

- 삼성 20핀 커넥터

 

삼성 20핀 커넥터는 24핀 데이터 전송 케이블에 연결해서 사용합니다. 바로 20핀 커넥터에서 USB로 연결되는 데이터 케이블은 찾지 못했습니다. (실제로 옛날에도 그런 케이블은 못봤고, 제품 구매할때도 20핀 커넥터를 주었습니다. 24핀은 표준이었고, 삼성 20핀은 삼성 독자규격이었기에 그러지 않았을까 합니다.)

 

주의사항이, 있는데, 먼저 24핀 이고 USB가 달렸다고 해서 모두 데이터 케이블이 아니라는 것입니다. 단지 충전 기능만 있는 케이블일 수 있습니다. 그래서 꼭 '데이터 전송 케이블' 을 준비하셔야 합니다.

 

또, SPH-W2900 의 경우 충전도, 데이터 전송도 24핀에서 개량된 20핀을 사용하고 있습니다. 이 때, 20핀의 규격이 여러가지입니다. '통합 20핀', '삼성 20핀' 등등... SPH-W2900 의 경우 삼성 제품이므로 당연히 삼성 20핀을 사용하여야 하고, 통합 20핀은 규격이 맞지 않습니다.

(위)삼성 20핀과 (아래) 통합 20핀의 차이. 눈으로 봐도 안 들어가겠다는 게 확연히 보인다.

 

2. 드라이버 및 소프트웨어 준비

 

SPH-W2900 모델의 경우 더이상 삼성에서 드라이버나 소프트웨어를 지원해주지 않습니다.

그리하여 구글 검색해서 블로그에 흩어져 있던 데이터들을 줍줍해서 간신히 연결에 성공하였습니다.

 

일단, SPH-W2900 을 위해서는 'USB 드라이버' 와 'PC Manager Plus' 2가지를 모두 설치해야 한다고 합니다.

그런데 정확히 어떤 USB 드라이버인지 알 길이 없습니다. 제가 다운로드 받아 설치한 USB 드라이버는 '삼성 USB 드라이버 for 모바일' 과 'USB Driver for PC Link 2000' 이렇게 2가지였습니다. 두 드라이버중 뭐가 정확한 드라이버인지는 모르겠습니다. 그리고 'PC Manager Plus' 를 설치할때도 USB 드라이버를 설치하여, 사실 이 드라이버들이 필요 없을 수도 있습니다. 하지만 자료 백업 목적으로 모든 드라이버를 구글 드라이브에 올려놓고 링크를 걸어드리겠습니다.

 

Samsung PC Manager Plus

drive.google.com/file/d/1dcJ76av2I2DDUW7opugpSaAd8tm1xvZG/view?usp=sharing

 

Samsung_PC_Manager_Plus_1.1.1.12042.zip

 

drive.google.com

 

Samsung USB Driver for Mobile Phone

drive.google.com/file/d/1oWB041cE8iYCBqzyINILQdzbD9ni2xb0/view?usp=sharing

 

SAMSUNG_USB_Driver_for_Mobile_Phones.zip

 

drive.google.com

Samsung USB Driver PC Link 2000

drive.google.com/file/d/144Spd1j-p9SdtWxdBcUWiykYCxPBmdjE/view?usp=sharing

 

Setup_USBDriver_PCLink2000.zip

 

drive.google.com

 

3. 데이터 백업

저는 Windows 10 버전 2004 에서 위 드라이버 및 소프트웨어를 설치하였고 정상적으로 휴대폰에 접속해서 데이터를 다운로드 받을 수 있었습니다.

컴퓨터 우측 하단에 표시되는 PC Manager Plus 의 Quick Menu

PC Manager Plus 를 활용하면 카메라 뿐만 아니라 폰에 저장해놓고 듣던 음악, 오래된 전화번호부, 주고받던 문자 메시지까지 모두 백업이 가능합니다.

전자 다이어리에는 제가 휴대폰으로 끄적였던 메모들까지 고스란히 남아 있더군요. 잘 백업해 두었습니다.

 

이 포스팅이 누군가의 추억을 되살리는데 도움이 되기를 희망합니다.

 

감사합니다.

 

 

posted by cimple 2019. 9. 2. 17:52

Maya API 에서 기본적으로 Mesh 를 다루는 class 는 MFnMesh 이다.

또한 Maya 는 polygon, edge, vertex 등 특별한 component 를 대상으로 iterator 를 제공한다. MItMeshPolygon, MItMeshEdge, MItMeshVertex.

만약 mesh vertex 를 에디팅하고 싶다면, 다음 두 가지 방식은 같은 일을 수행한다.

mesh_fn = om.MFnMesh(mesh_obj)
num_vtx = mesh_fn.numVertices
for ids in range(num_vtx):
	mesh_fn.setPoint(idx, om.MPoint([0., 0., 0.]))    
mesh_vtx_it = om.MItMeshVertex(mesh_obj)
mesh_vtx_it.reset()
while not mesh_vtx_it.isDone():
	mesh_vtx_it.setPosition(om.MPoint([0., 0., 0.]))
    mesh_vtx_it.next()

그래서 이 때, 왜 iterator 가 필요한지, 그리고 속도는 무엇이 더 빠른지에 대한 궁금함이 있을 수 있다.

결론적으로, Python API 에서는 for i in range(x) 형식의 loop 를 도는 것 보다. iterator 를 사용하는 것이 더 빠르다고 알려져 있다.

또한, 꼭 Maya API 의 iterator 뿐만 아니라, 기본적으로 iterator 를 사용하는 철학에 담긴 장점들이 곧 Maya API 의 iterator 를 사용하는 장점이라고 할 수 있다. 

iterator 는 컨테이너 안에 담긴 요소들에 대한 연산을 안정적이면서 효율적으로 수행하기 위한 여러 장점들을 가지고 있다. 가장 간단하게는 자료의 크기를 잘못 참조 (out of range) 할 염려가 없다는 것에서부터, 자료구조와 그 자료구조를 탐색하는 영역을 분리시킴으로써 보다 안전한 코드 작성이 가능하다는 등의 장점이 그것이다. 

posted by cimple 2019. 9. 2. 17:17

Maya 의 node attribute data 에 접근할 때, MPlug 와 MDataHandle 을 사용하는 방법이 있다. 언뜻 보면 두 방법 다 동일해 보인다. 

하지만 두 방식을 선택할 때에는 주의할 사항이 있다.

한 가지 기억해야 할 Rule 은, Custom node 의 MPxNode::compute() function 안에서 연산이 이루어질 떄에는 compute() 에 넘겨진 MDataBlock 으로부터 만들어진 MDataHandle 을 통해서 접근해야 한다는 것이다. 이 밖에는 MPlug() 를 사용해야 한다.

MPlug 로 compute() function 과 같은 곳에서 데이터에 접근하는 것은 DG가 정확하게 업데이트 되지 않을 수 있다는 위험성을 가지고 있다. 

반대로 compute() function 바깥에서는 MPxNode::forCache() 와 같은 함수를 이용해서 MDataBlock/MDataHandle 을 사용할 수 있는데, 이 경우 plug 가 dirty 되더라도 update 된 데이터를 보장하지 않을 수 있다.

 

간단하게 두 방식을 요약하면 다음과 같다.

MPlug 의 장점:

1. 모든 dirty propagation 을 제공한다.

2. 필요한 노드 업데이트 연산을 자동으로 수행한다.

3. multi element 가 필요할 때 자동으로 생성한다.

MDataBlock/MDataHandle 의 장점:

1. MPlug 보다 빠르다.

2. dirty plug 의 현재 값을 노드 업데이트를 force 하지 않고도 가져올 수 있다.

 

 

이 글은 다음 글에 기반하여 작성되었다.

https://around-the-corner.typepad.com/adn/2015/03/evaluating-node-attribute.html

 

posted by cimple 2019. 8. 29. 12:18

Maya Instance 는 서로 다른 Transform node 가 하나의 shape node 를 공유하는 개념이다.

손쉽게 만드는 방법은 Maya 의 Edit > Duplicate Special 에서 Geometry type 을 Instance 로 바꾸어 준 뒤 실행하면 된다.

Outliner 에서 확인하면 서로 다른 transform 에 동일한 shape 이 들어 있는 것을 확인할 수 있고,

마찬가지로 shape 을 공유하기 때문에 transform 은 각각 자유롭게 움직일 수 있는데 vertex edit 모드에서 shape 을 변형시키면 모양이 함께 바뀌는 것을 확인할 수 있다.

Maya command 에서는 간단하게 다음 명령어로 인스턴스를 만들 수 있다.

import maya.cmds as mc
mc.instance('pSphere1')

이렇게 만들어진 instance 의 관계를 알아보면, 먼저 listRelatives("shape_name", p=True) 커맨드로 체크해보면 outliner 상에는 서로 다른 transform 을 parent 로 가지고 있는 것으로 나오지만 커맨드상으로는 원래 원본 transform 만을 가진다고 나온다. 

- Maya Duplicate vs Maya Instance

PolySphere 1개를 생성하는 것을 duplicate 와 instance 를 통해서 비교해 보았다.

생성 시간 test -

생성 오브젝트 개수 [100, 1000, 2000, 3000, 4000, 5000]

duplicated :[0.14700007438659668, 1.5250000953674316, 3.196000099182129, 4.937000036239624, 6.734999895095825, 9.273000001907349]

instance:
[0.12400007247924805, 2.371000051498413, 14.746999979019165, 57.71499991416931, 162.31100010871887, 361.1760001182556]

Instance 가 생성시간이 이렇게 오래 걸리는 이유에 대해서는 R&D 가 더 필요할 것 같다.

저장 용량 test -

2000 개의 sphere 를 생성했을 때, duplicate 로 생성한 scene 은 60.2MB, instance 로 생성한 scene 은 917KB 로 비교가 안 될 정도로 압도적인 용량 차이를 보여주었다. (약 65배 차이) 참고로, sphere 하나만을 저장했을 때 필요한 저장공간은 50KB 이다.

instance 는 하나 늘어날 때 마다 transform node 가 하나씩 늘어나지만 duplicate 는 mesh shape 정보가 모두 저장되므로, 만약 동일한 shape 을 가진 object 의 transform 만을 조절해서 asset 을 구성할 때에는 instance 가 압도적일 수 밖에 없음을 알 수 있다.

 

 

posted by cimple 2019. 8. 28. 15:52

Maya Blendshape Node 에 대한 분석의 결과물을 정리해 보려고 한다.

1. Blendshape node 의 생성

mesh 1, mesh 2, mesh 3 을 차례로 선택하고 blendshape 을 생성하면, 가장 마지막에 선택한 mesh 3 이 base mesh(neutral shape) 이 되면서 blendshape node 가 생성된다.

2. Blendshape node 의 연결

- Blendshape 의 input 으로 base mesh 는 입력되지 않는다. Blendshape node 의 output geometry attribute 가 base  mesh 의 inMesh 에 연결된다. base mesh 의 기본 정보는 커맨드 형태로 Blendshape node 에 입력되는 것을 보인다.

- Blendshape 에 target mesh 들은 input 에 직접 입력된다. 이 때, BlendshapeNode.InputTarget[0].InputTargetGroup[0].InputTargetItem[6000].InputGetomTarget 이라는 복잡한 과정을 거쳐서 mesh 데이터를 입력받는다. 상위의 attribute 들은 모두 compound attribute.

-Target shape 이 늘어날 때마다, BlendshapeNode.InputTarget[0], BlendshapeNode.InputTarget[1] ... 이런 식으로 Array attribute 형태로 붙게 된다. 이 array attribute 를 직접 attribute editor 나 channel box 에서 확인할 수는 없다. 

- Array attribute 의 특성상, node 내부에 미리 정해진 저장 공간을 할당하고 거기에 target shape 들을 연결한다. 만약 initial 로 3개의 target 을 연결했다면, 3개의 target mesh 를 받을수 있는 attribute 공간이 생성되고, node 연결을 끊더라도 이 공간 크기는 유지된다. 만약 새로운 공간을 더 확보하고 싶다면 Maya 에서도 Add blendshape 버튼을 제공하듯이, node 저장공간을 더 할당하고 Blendshape node 를 꽂아넣는 과정이 필요하다.

3. Shape 의 구성

- Blendshape 을 연결하면, base mesh object 에 orig shape 이 추가로 생성된다. orig shape 은 blendshape 에만 생성되는 것은 아니고, maya deformer 를 설치하면 자동으로 생성된다.

- base mesh 의 transform 에 종속되어 포함된다. 그러나 outliner 나 viewport 에서 바로 확인할 수는 없는데, 이는 이 오브젝트가 intermediate object 이면서 hidden in outliner 속성이 적용되어 있기 때문이다. Node editor 같은 곳에서 이 orig shape 을 선택한 다음, attribute editor 에서 Intermediate object 항목을 체크 해제해 주면 viewport 상에서 해당 shape 을 볼 수 있고, Hidden in Outliner 항목을 체크 해제해주면 Outliner 에서 해당 Mesh 의 Transfrom 에 child 로 들어 있는 Orig shape 을 확인할 수 있다.

- 만약 Intermediate object 를 보고 싶어서 항목을 체크 해제하면, 해당 오브젝트의 History 를 지워서 Blendshape node 를 지운다고 해도 이 OrigShape 은 남아있게 된다. 체크가 되어 있으면 history 를 지우면 intermediate object 도 함께 사라지게 된다.

posted by cimple 2017. 9. 26. 17:15

Custom orient constrain node & command 를 구현하였다.


CustomOrientConstrain.py

setCustomOrientConstrain.py




위 파일로 다운로드 받으면 된다.



Warning


Maya 2017 에서 버그를 발견하였다. (내 버그가 아니라 Maya 버그)

노드를 생성하고 연결하는 CustomOrientConstrainCmd.py 에서,

현재 코드처럼 custom node 를 생성한 다음 MSelectionList 에서 dagPath 를 받으면 argument 가 부족하다는 에러가 뜬다.

에러 메시지를 뜯어보니 아마도 Maya Python API 1.0 에 있는 MSelectionList_getDagPath 가 호출되는 것으로 보이는데 이유는 불명이다.


그래서 순서를 일단 MSelectionList 에 dagPath 를 받은 다음 -> Custom node 를 생성하면 정상작동한다.



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. 13. 17:24

Mesh Surface 의 경우 input/output 은 inMesh / outMesh 이다.

Nurbs Surface 의 경우 input/output 은 create / local 이다.

Nurbs Surface 의 이름이 직관적이지가 않은데... 누가 처음에 이런 attribute 네이밍을 했는지 궁금할 따름이다.

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