y 축이 제공된 벡터를 따라 원 모양을 회전시키는 방법은 무엇입니까? 이 샘플 스크립트의 벡터는 장면의 두 위치 지정자를 사용하여 작성됩니다. 코드는 세 부분으로 나뉩니다. 첫 번째 섹션에서는 테스트 장면을 만듭니다. 두 번째 부분은 벡터를 수집합니다. 세 번째 부분은 벡터를 사용하여 원의 회전을 조정하여 Y 축이 수집 된 벡터를 따라 가리키는 방법을 찾는 데 도움이 필요한 부분입니다. 고마워.python + maya : Y 축을 벡터 방향으로 회전
import maya.cmds as cmds
import random
import math
cmds.select(all=True)
cmds.delete()
#------------------------------TEST SCENE SETUP
def genPos():
x = random.uniform(-5,5)
y = random.uniform(0,5)
z = random.uniform(-5,5)
return (x, y, z)
a = cmds.spaceLocator(n='ctrl_00')
b = cmds.spaceLocator(n='ctrl_00')
cmds.xform(a, t=(genPos()))
cmds.xform(b, t=(genPos()))
cmds.createDisplayLayer(name="Ctrls")
cmds.editDisplayLayerMembers('Ctrls', a, b)
cmds.setAttr('Ctrls.color' ,14)
cmds.select(clear=True)
#-----------------------THE SCRIPT
def normlizedVector(vecA,vecB,offset):
nX = vecB[0] - vecA[0]
nY = vecB[1] - vecA[1]
nZ = vecB[2] - vecA[2]
#vectorLength = distance vecA vecB
# find the distance between the two supplied point3 values
distX = pow((vecA[0] - vecB[0]) , 2.0)
distY = pow((vecA[1] - vecB[1]) , 2.0)
distZ = pow((vecA[2] - vecB[2]) , 2.0)
vecLength = math.sqrt(distX + distY + distZ)
# the normalized vector is calculated by dividing the X, Y and Z coordinates by the length
calcX = nX/vecLength
calcY = nY/vecLength
calcZ = nZ/vecLength
# project point along vector, offset by a given value
ptX = vecB[0] + (calcX * offset)
ptY = vecB[1] + (calcY * offset)
ptZ = vecB[2] + (calcZ * offset)
return (ptX, ptY, ptZ)
posA = cmds.xform(a,q=1,ws=1,rp=1)
posB = cmds.xform(b,q=1,ws=1,rp=1)
pt = normlizedVector(posA,posB,10)
#--------MOVE AND ALIGN CIRCLE
cir = cmds.circle(nr=(0, 0, 1), c=(0, 0, 0))
cmds.xform(cir, t=posB)
코드에서 어려운 수학을 다시 작성하는 것보다 제약 조건을 사용하는 것이 훨씬 더 좋습니다. 귀하의 경우 목표 제한이 옵션입니까? 내가 그 길로 가면 – mhlester
. 더미 로케이터를 만들어 제약 조건을 사용하여 정렬하고 실제로 원을 그리는 것을 피합니다. 그런 다음 원의 변형을 더미에 맞 춥니 다. 그런 경우에 한 노드를 다른 노드로 정렬하는 것이 현명하고 신속한 방법일까요? – JokerMartini
@mhlester 그것의 어려운 수학, 꽤 사소한 사실. 어쨌든 wirte 기본 벡터 함수를 직접 사용하지 마십시오. 그 (것)들을 얻으십시오 unpackcesrily 불발성 인 과실의 다만 근원을 약간 포장하십시오. – joojaa