Script SOP로 많은 선 그리기

14559 단어 TouchDesigner

SOP로 선을 그리고 싶다!



oF나 Processing의 DrawLine과 같이 TouchDesigner에서도 선을 쓰고 싶었지만, 셰이더를 사용하지 않고 실현하는 정보가 없었습니다. 내용적으로는 얇지만 기록에 남겨 둡니다.

어떻게 구현?



결론은 Script SOP에서 scriptOp.appendPoly(n,closed=False),n>2입니다.

일단 결론은 잊어주고 어떻게 하면 선을 가득 채울 것입니다.
1. 우선 Copy SOP나 Leplicator+Merge SOP등을 생각해 봅니다. Line SOP를 Replicator 등으로 복제하여 시작점과 끝점을 조정하고 ... 가장 간단하지만 스케일하지 않는 것 같네요.
2. 다음에 생각해 내는 것이 instancing입니다. 기본 Line SOP은 (0,0,0), (1,0,0)을 연결하는 선이므로 Execute 등에서 Python을 쓰고 선을 그리는 두 점과 원점을 연결하는 벡터에 대한 회전 행렬에서 오일러 각도를 구한 다음 시작점까지 이동시켜 주면 완벽...의 것입니다만 계산이 맞지 않는다...단념. 이 방법이라고 토요시 모리오카의 픽셀 스톰 등과 연계시키면 고속으로 그릴 수 있다고 생각하고 있었습니다만. 다시 도전합니다.
3. 자, 본제는 여기에서입니다. Script SOP 폴리곤 걸면 선도 걸리는 것은?

우선 다각형을 하나 그려 보겠습니다.

script1_callbacks
def onSetupParameters(scriptOp):
    return

def onPulse(par):
    return

def onCook(scriptOp):
    scriptOp.clear()

    p0=scriptOp.appendPoint()
    p0.x=-1
    p0.y=0
    p0.z=0
    p1=scriptOp.appendPoint()
    p1.x=1
    p1.y=0
    p1.z=0
    p2=scriptOp.appendPoint()
    p2.x=0
    p2.y=1
    p2.z=0

    poly=scriptOp.appendPoly(3,closed=True,addPoints=False)
    poly[0].point=scriptOp.points[0]
    poly[1].point=scriptOp.points[1]
    poly[2].point=scriptOp.points[2]
    return


할 수 있었습니다.
그런 다음 (-1,0,0)과 (1,0,0)을 연결하는 선을 그립니다.
그래서 poly=scriptOp.appendPoly 이후를 다음과 같이 변경합니다.

script1_callbacks
poly=scriptOp.appendPoly(2,closed=True,addPoints=False)
    poly[0].point=scriptOp.points[0]
    poly[1].point=scriptOp.points[1]
    # poly[2].point=scriptOp.points[2]
    return


아무 것도 그려지지 않습니다

여기서 appendPoly 메서드의 인수인 closed에 주목하겠습니다. 확실히 선이라면 폴리곤이라고 해도 원래 닫히지 않는다...closed=Falsen으로 해 봅니다.

script1_callbacks
poly=scriptOp.appendPoly(2,closed=False,addPoints=False)
    poly[0].point=scriptOp.points[0]
    poly[1].point=scriptOp.points[1]
    # poly[2].point=scriptOp.points[2]
    return


왠지 선이 나왔다!

라고 하는 것은, 포인트에 대해서 appendPoly(n, closed=False)마저 해 주면, 얼마든지 점이 걸리는 것을 알 수 있습니다. 아래와 같이 숫자는 몇 개가 되어도 괜찮습니다.

script1_callbacks
import random
def onSetupParameters(scriptOp):
    return

def onPulse(par):
    return

def onCook(scriptOp):
    scriptOp.clear()

    n=10
    poly=scriptOp.appendPoly(n,closed=False,addPoints=True)
    for i in range(n):
        p=poly[i].point
        p.x=random.random()
        p.y=random.random()
        p.z=random.random()
    return



또한 하나의 Script SOP 내에서 여러 선(다각형?)으로 나누어 그릴 수도 있습니다.

script1_callbacks
import random
def onSetupParameters(scriptOp):
    return

def onPulse(par):
    return

def onCook(scriptOp):
    scriptOp.clear()

    n=3
    poly=scriptOp.appendPoly(n,closed=False,addPoints=True)
    for i in range(n):
        p=poly[i].point
        p.x=random.random()
        p.y=random.random()
        p.z=random.random()

    n=3
    poly=scriptOp.appendPoly(n,closed=False,addPoints=True)
    for i in range(n):
        p=poly[i].point
        p.x=random.random()
        p.y=random.random()
        p.z=random.random()
    return



걸었습니다! 이상입니다.
더 좋은 방법이 있으면 코멘트 받을 수 있으면 다행입니다. 잘 부탁드립니다.

좋은 웹페이지 즐겨찾기