You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
물고기는 몸통, 꼬리, 지느러미, 눈을 각각 별도의 Shape로 만들고 하나의 Scene으로 묶었다. appendCircle()에 가로와 세로 반지름을 서로 다르게 전달해 타원형의 몸통을, moveTo()와 lineTo()로 점을 연결한 뒤 close()로 닫힌 도형을 만들어 꼬리를 표현했다.
수초와 모래, 바위는 직선으로만 표현하기 보다는 곡선이 들어가는 것이 더 자연스러울 것 같아 cubicTo()를 사용했다. 수초는 Cubic Bézier 곡선에 굵은 Stroke를 적용하여 만들었는데, StrokeCap::Round를 사용해 수초 끝부분이 둥글게 보이도록 했다.
auto weed = tvg::Shape::gen();
weed->moveTo(x, 560);
weed->cubicTo(
x - 25, 520,
x + 25, 490,
x, 560 - height
);
weed->strokeFill(r, g, b);
weed->strokeWidth(10);
weed->strokeCap(tvg::StrokeCap::Round);
모래 바닥도 Cubic Bézier 곡선 두 개를 연결해 표현했다.
물고기 이동
물고기의 움직임은 update()에서 구현했다. elapsed를 초 단위로 변환한 뒤, fmodf()를 사용해 물고기가 화면 오른쪽을 벗어나면 다시 왼쪽에서 나타나도록 했다.
물고기가 수평으로만 움직이는 것도 웃기지 않은가? 그래서 위아래로도 조금씩 흔들리면서 움직이도록 X 좌표는 시간에 따라 계속 증가하고, Y 좌표는 sinf()를 적용해 헤엄치는 듯한 움직임을 표현해 보려고 했다. 이 때 두 물고기의 움직임이 겹치지 않도록 하기 위해 서로 다른 속도와 위치 값을 사용했다.
거품이 일정 높이까지 올라가면 fmodf()에 의해 처음 위치로 돌아가도록 해 시간이 지나도 계속해서 거품이 배경으로 존재하도록 했다. 그리고 각 거품의 속도와 지연 시간이 다르게 해 여러 거품이 동시에 같은 위치에서 움직이지 않고 자연스럽게 나누어져 올라가도록 했다.
변경된 위치는 마지막에 canvas->update()를 호출해 화면에 반영했다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
개요
집에 있는 어항을 보고 그 모습을 만들어 보기로 했다. 배경, 모래, 바위, 수초와 물고기는
Shape와Scene을 이용해 구성했다. 그리고 그냥 멈춰 있는 그림 보다 움직임이 있는 모습을 만들고 싶어update()에서 물고기와 거품의 애니메이션도 추가해 보았다.예제 구동 화면
Github: https://github.com/numkite/thorvg.example/blob/basic-programming/src/Aquarium.cpp
Aquarium.mov
코드 설명
배경
어항 속 배경은 화면 전체를 덮는 사각형으로 만들었다.
LinearGradient를 적용해서 아래쪽으로 갈수록 어두워지도록 수심에 따른 색 변화를 표현해 보았다.물고기
물고기는 몸통, 꼬리, 지느러미, 눈을 각각 별도의 Shape로 만들고 하나의
Scene으로 묶었다.appendCircle()에 가로와 세로 반지름을 서로 다르게 전달해 타원형의 몸통을,moveTo()와lineTo()로 점을 연결한 뒤close()로 닫힌 도형을 만들어 꼬리를 표현했다.Scene 전체에
translate()를 적용해 Scene으로 구성한 몸통과 꼬리 등을 각각 움직이지 않도록 했다.그리고 색상과 크기를 매개변수로 전달해 같은 함수로 다른 두 마리의 물고기를 생성하도록 했다.
지형
수초와 모래, 바위는 직선으로만 표현하기 보다는 곡선이 들어가는 것이 더 자연스러울 것 같아
cubicTo()를 사용했다. 수초는 Cubic Bézier 곡선에 굵은 Stroke를 적용하여 만들었는데,StrokeCap::Round를 사용해 수초 끝부분이 둥글게 보이도록 했다.모래 바닥도 Cubic Bézier 곡선 두 개를 연결해 표현했다.
물고기 이동
물고기의 움직임은
update()에서 구현했다.elapsed를 초 단위로 변환한 뒤,fmodf()를 사용해 물고기가 화면 오른쪽을 벗어나면 다시 왼쪽에서 나타나도록 했다.물고기가 수평으로만 움직이는 것도 웃기지 않은가? 그래서 위아래로도 조금씩 흔들리면서 움직이도록 X 좌표는 시간에 따라 계속 증가하고, Y 좌표는
sinf()를 적용해 헤엄치는 듯한 움직임을 표현해 보려고 했다. 이 때 두 물고기의 움직임이 겹치지 않도록 하기 위해 서로 다른 속도와 위치 값을 사용했다.거품
거품은 위치, 크기, 속도와 지연 시간을 서로 다르게 설정해 움직이도록 했다.
거품 Shape는
content()에서 한 번만 생성하고,update()에서는 새로운 Shape를 만들지 않고 기존 Shape의 위치만 변경했다.거품이 일정 높이까지 올라가면
fmodf()에 의해 처음 위치로 돌아가도록 해 시간이 지나도 계속해서 거품이 배경으로 존재하도록 했다. 그리고 각 거품의 속도와 지연 시간이 다르게 해 여러 거품이 동시에 같은 위치에서 움직이지 않고 자연스럽게 나누어져 올라가도록 했다.변경된 위치는 마지막에
canvas->update()를 호출해 화면에 반영했다.사용한 ThorVG API
Shape::gen()Scene::gen()appendRect()appendCircle()moveTo()/lineTo()cubicTo()close()fill()strokeFill()/strokeWidth()strokeCap()LinearGradientScene::add()translate()Canvas::update()All reactions