[Cinema4D] 사이다의 포위망을 만들어 보도록 하겠습니다.
스플라인은 다각형 대상과 다른 유형의 대상이기 때문에if문구로 조건분지를 진행하므로 주의해야 한다.
예를 들어, 다각형 객체의 경우 obj입니다.유형은 IsInstanceOf(c4d.opolygon) 등을 통해 확인할 수 있습니다.
InstanceOf 브로셔
나는 이렇게 하면 IsInstanceOf(c4d.ospline)를 통해 견본 유형을 검사할 수 있을 것이라고 생각했지만, 이것은 안 된다.
스플라인 유형은 다음과 같습니다. 기타 GetType()=c4d.온라인도 가능하고 InstanceOf이면 안 돼요.
if obj.GetInfo() & c4d.OBJECT_ISSPLINE:
realSpline = obj.GetRealSpline()
if realSpline is False:
return
# Do something
원본 스플라인에서 편집할 수 있는 상태의 스플라인을 두 번째 줄의 GetRealSpline()에서 가져옵니다.GetRealSpline()
이제 다각형 객체처럼 realSpline이 준비됩니다.GetClone()에서 클론을 생성하여 역행렬과 세계 좌표에 평행하게 만든 후 각 점은 회전 행렬을 곱하여 원래 위치로 돌아갑니다.
되다
이렇게 말하고 싶지만 탄젠트의 한쪽 끝까지 둘러싸인 상자가 있습니다. 이것은 좀 좋지 않습니다. GetRad () 는 탄젠트 가장자리로 되돌아가는 반경인 것 같습니다.
따라서 클론 스플라인에 대해 "현재 상태를 개체화"를 수행하여 내부 생성의 실질적인 요점을 파악할 예정입니다. 영어는 현재 State to Object입니다. Plugincfe에서도 이 주제를 많이 찾을 수 있으니 검색해 보십시오.
객체에 대한 링크입니다.SendModeling Command를 실행하려면 모듈을 먼저 가져옵니다.
from c4d import utils
rs = obj.GetRealSpline()
if rs is False:
return
clone = rs.GetClone()
clone.SetMg(~obj.GetMg() * obj.GetMg())
settings = c4d.BaseContainer()
res = utils.SendModelingCommand(command = c4d.MCOMMAND_CURRENTSTATETOOBJECT,
list = [clone],
mode = c4d.MODELINGCOMMANDMODE_ALL,
bc = settings,
doc = doc)
c4d.EventAdd()
if res is False:
print "Something went wrong."
elif res is True:
print "Command successful."
elif isinstance(res, list):
print "Here you get the newly created object(s)."
[utils.SendModelingCommand]용 브로셔https://developers.maxon.net/docs/Cinema4DPythonSDK/html/modules/c4d.utils/index.html?highlight=sendmodelingcommand#c4d.utils.SendModelingCommandcommand은 실행할 명령입니다.
매개 변수의 대상은 목록이기 때문에 "clone"입니다.
mode는 ALL 이외에 선택 범위에 한정할 수 있습니다.
settings는 명령을 실행하는 매개변수(예: ID-)를 지정할 수 있습니다.MODELING_EXTRUDE_TOOL을 사용할 때, 50cm가 튀어나오고 싶을 때 등등.
복사된 객체를 교차하지 않으면 장면의 커브 스플라인에 명령이 실행됩니다.
또한 반환 값이 목록이기 때문에 실행 후의 대상은res[0]입니다.GetPoint Count() 등으로 액세스합니다.
함수는 다음과 같다. 매개 변수의obj는 이미 문장의 첫머리의obj에 있다.GetInfo() & c4d.OBJECT_ISSPLINE: 스플라인 객체만 제공되므로 함수에서 스플라인 여부를 확인하지 않습니다.
def createBoundingBoxFromSpline(obj):
print "Call createBoundingBox from Spline"
# もしスプラインプリミティブならスプライン状態を取得する(編集可能にした状態)
rs = obj.GetRealSpline()
if rs is False:
return
# クローンをとる
clone = rs.GetClone()
clone.SetMg(~obj.GetMg() * obj.GetMg())
# 現在の状態をオブジェクト化
settings = c4d.BaseContainer()
res = utils.SendModelingCommand(command = c4d.MCOMMAND_CURRENTSTATETOOBJECT,
list = [clone],
mode = c4d.MODELINGCOMMANDMODE_ALL,
bc = settings,
doc = doc)
c4d.EventAdd()
if res is False:
print "Something went wrong."
elif res is True:
print "Command successful."
elif isinstance(res, list):
print "Here you get the newly created object(s)."
# ポイントに元の行列を乗算してポイントだけ元の位置に戻す
if res[0].GetPointCount():
pcount = res[0].GetPointCount()
points = res[0].GetAllPoints()
for p in xrange(pcount):
res[0].SetPoint(p, obj.GetMg() * points[p])
print points[p]
res[0].Message(c4d.MSG_UPDATE)
c4d.EventAdd()
# XYZの最小,最大値を取得する
center = res[0].GetMp()
xMin = center.x + res[0].GetRad().x * -1
xMax = center.x + res[0].GetRad().x
yMin = center.y + res[0].GetRad().y * -1
yMax = center.y + res[0].GetRad().y
zMin = center.z + res[0].GetRad().z * -1
zMax = center.z + res[0].GetRad().z
print xMin
print xMax
print yMin
print yMax
print zMin
print zMax
# XYZの最小・最大値からバウンディングボックスを生成する
box = c4d.BaseObject(c4d.Opolygon)
box.ResizeObject(8,6)
box.SetPoint(0,c4d.Vector(xMin, yMin, zMin))
box.SetPoint(1,c4d.Vector(xMin, yMax, zMin))
box.SetPoint(2,c4d.Vector(xMax, yMin, zMin))
box.SetPoint(3,c4d.Vector(xMax, yMax, zMin))
box.SetPoint(4,c4d.Vector(xMax, yMin, zMax))
box.SetPoint(5,c4d.Vector(xMax, yMax, zMax))
box.SetPoint(6,c4d.Vector(xMin, yMin, zMax))
box.SetPoint(7,c4d.Vector(xMin, yMax, zMax))
box.SetPolygon(0, c4d.CPolygon(0,1,3,2))
box.SetPolygon(1, c4d.CPolygon(2,3,5,4))
box.SetPolygon(2, c4d.CPolygon(4,5,7,6))
box.SetPolygon(3, c4d.CPolygon(6,7,1,0))
box.SetPolygon(4, c4d.CPolygon(1,7,5,3))
box.SetPolygon(5, c4d.CPolygon(6,0,2,4))
doc.InsertObject(box)
tag = c4d.BaseTag(c4d.Tdisplay)
tag[c4d.DISPLAYTAG_AFFECT_DISPLAYMODE] = True
tag[c4d.DISPLAYTAG_SDISPLAYMODE] = 6
tag[c4d.DISPLAYTAG_WDISPLAYMODE] = 0
box.InsertTag(tag)
box.Message(c4d.MSG_UPDATE)
doc.AddUndo(c4d.UNDOTYPE_NEW,box)
doc.EndUndo()
c4d.EventAdd()
return
되다Reference
이 문제에 관하여([Cinema4D] 사이다의 포위망을 만들어 보도록 하겠습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Makoto-T/items/014d5a7cf3cbe9b661ba텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)