VPython에서 제공하는 3D 오브젝트의 목록이다.
'label', 'text' 등은 3D 오브젝트이지만 입체도형은 아니다.
입체도형 특징상 많은 입체도형 오브젝트 생성 시에 자주 들어가는 요소들이 있다.
pos (오브젝트가 생성되는 위치의 벡터)
axis (오브젝트가 뻗어나가는 방향과 그 크기를 담은 벡터)
size (오브젝트의 크기값이 담긴 벡터)
위 세 속성이 대체적인 완전 필수는 아니지만 그래도 입체도형 구실을 하기 위해서 필수 속성이다.
다 벡터 데이터이고, axis나 size는 대체 가능할 수도 있다.
color나 make_trail 속성 같은 경우도 거의 모든 입체도형에 사용할 수 있지만,
default 값으로 설정 되어 있고, 필수 속성이 아니니 제외하겠다.
아래는 하나하나 입체도형 생성법을 살펴보겠다.
pointer = arrow(pos=vector(0,2,1), axis=vector(5,0,0), shaftwidth=1)
# length, height, width 를 이용한 방식
mybox = box(pos=vector(x0, y0, z0),
length=L, height=H, width=W)
# axis와 size를 이용한 방식
mybox = box(pos=vector(x0, y0, z0), axis=vector(a, b, c),
size=vector(L, H, W))
# up 벡터를 추가한 방식
mybox = box(pos=vector(x0, y0, z0),
axis=vector(a, b, c), length=L,
height=H, width=W, up=vector(q, r, s))
cone(pos=vector(5,2,0),
axis=vector(12,0,0),
radius=1)
c = curve(vector(-1,-1,0), vector(1,-1,0))
# 꺾은선 추가
c.append(vector(1,1,0), vector(-1,1,0), vector(-1,-1,0))
# 꺾은선 속성 설정
c = curve(pos=[v1,v2], color=color.cyan, radius=0.3)
# dict를 이용한 방법 1
p1 = dict(pos=v1, color=color.red, radius=0.1)
p2 = dict(pos=v2, color=color.blue, radius=.3)
curve(p1,p2)
# dict를 이용한 방법 2
p1 = {'pos':v1, 'color':color.red, 'radius':0.1}
p2 = {'pos':v2, 'color':color.blue, 'radius':0.3}
curve(p1,p2)
# 점 개수 제한 설정
c = curve(retain=150)
rod = cylinder(pos=vector(0, 2, 1), axis=vector(5, 0, 0), radius=1)
myell = ellipsoid(pos=vector(x0, y0, z0),
axis=vector(a, b, c),
length=L, height=H, width=W)
# Sample Code 1
extrusion(path=[vec(0, 0, 0), vec(0, 0, -5)],
color=color.orange,
shape=[shapes.circle(radius=3),
shapes.triangle(length=2),
shapes.trapezoid(pos=[0, 2], width=4,
height=1, top=2)])
# Sample Code 2
extrusion(path=paths.arc(radius=2,
angle1=-pi/3, angle2=pi+pi/3), color=color.cyan,
shape=[ [shapes.triangle(length=2),
shapes.circle(pos=[0,.5], radius=0.2),
shapes.trapezoid(pos=[0,-0.2],
width=0.6, height=0.4)],
[shapes.rectangle(pos=[0,1.8],
width=1,height=0.3)] ])
말로 설명하기에는 복잡하기 때문에 아래 링크에서 자세한 설명을 읽어보는 것을 추천한다.
요약하자면,
path는 입체도형을 설치할 위치를 의미하고,
shape는 그 입체도형의 단면에서 도형을 이루는 부분과 깎아내는 부분을 같이 담은 배열을 의미한다.
호떡으로 비유했을 때
path는 호떡의 중심에 꽂은 이쑤시개,
shape는 이쑤시개에 꽂은 호떡으로 비유할 수 있다.
shape는 다음과 같은 배열을 인자로 전달하여 주어야 한다.
s =[ [O, I, I], [O], [O, I], ... ]
각 내부 배열의 첫 번째 원소는 O이고, 나머지는 I임을 알 수 있는데,
O는 살을 입히는 부분이고 I는 그 살에서 깎아낼 부분이다.
spring = helix(pos=vector(0, 2, 1),
axis=vector(5, 0, 0), radius=0.5)
label( pos=vec(0,0.25,0), text='Hello!' )
# 세부 설정
L = label(pos=obj.pos,
text='Early', xoffset=20,
yoffset=50, space=30,
height=16, border=4,
font='sans')
# 발광체 위치 설정
lamp = local_light(pos=vector(x,y,z),
color=color.yellow)
# 발광체 방향 설정
distant_light(direction=vector(x,y,z), color=color.red)
points(pos=[vector(-1,0,0), vector(1,0,0)], radius=50, color=color.red)
pyramid(pos=vector(5,2,0), size=vector(12,6,4))
ring(pos=vector(1,1,1),
axis=vector(0,1,0),
radius=0.5, thickness=0.1)
ball = sphere(pos=vector(1,2,1),
radius=0.5)
T = text(text='My text is\ngreen',
align='center', color=color.green)
a = vertex( pos=vec(0,0,0) )
b = vertex( pos=vec(1,0,0) )
c = vertex( pos=vec(1,1,0) )
T = triangle( v0=a, v1=b, v2=c )
# 속성 직접 지정 방법
T = triangle(
v0=vertex( pos=vec(0,0,0) ),
v1=vertex( pos=vec(1,0,0) ),
v2=vertex( pos=vec(1,1,0) ) )
# quad
a = vertex( pos=vec(0,0,0) )
b = vertex( pos=vec(1,0,0) )
c = vertex( pos=vec(1,1,0) )
d = vertex( pos=vec(0,1,0) )
Q = quad( v0=a, v1=b, v2=c, v3=d )
# 속성에 배열 대입 방법
Q = quad( vs=[a,b,c,d] )