[Cinema4D] 사이다의 포위망을 만들어 보도록 하겠습니다.

6303 단어 Cinema4DPython
이전 글에서 다각형 대상은 세계 좌표에 평행하는 포위함을 만들었다 완성됐습니다. 이번에는 지난번 스크립트를 조금 늘려서Cineema4D에서 자주 사용하는 스타일 대상에서 포위함을 만들고 싶습니다.
스플라인은 다각형 대상과 다른 유형의 대상이기 때문에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.SendModelingCommand
command은 실행할 명령입니다.
매개 변수의 대상은 목록이기 때문에 "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
되다

좋은 웹페이지 즐겨찾기