JavaFX | 그래픽 특수 효과 | 그림자 효과와 반사

흐림 효과와 함께 많이 사용되는 시각 효과라고 하면 “그림자” 효과일거다. 그림자에는 몇 가지 종류가 있다. 여기서 간단하게 정리해 보겠다.

드롭 섀도우

new DropShadow(반경, 가로 오프셋, 수직 오프셋, 색상);

도형의 그림자가 그 아래에 떨어지는 효과를 “드롭 섀도우"라고 한다. 이것은 “DropShadow” 클래스로 제공된다. 생성자에는 여러 가지가 있지만, 가장 자주 사용되는 것은 그림자가 적용되는 반경 (그림자의 폭), 그림자의 가로 세로 방향의 편차 폭 (오프셋), 그림자 색 (Color 인스턴스)을 대충 인수로 지정하여 작성하는 것이 일반적이다.

내부의 섀도우

new InnerShadow(반경, 가로 오프셋, 수직 오프셋, 색상);

도형의 내부가 움푹 패인 것처럼 안쪽에 그림자를 그리는 것이다. 이것도 DropShadow와 마찬가지로 인수에는 반경, 가로 세로 오프셋, 그림자 색을 지정한다.

반사

new Reflection(상단 오프셋,  프랙션(fraction),  상부 투과폭,  바닥 투과폭);

이것은 그림자와는 조금 다르지만, 그림자처럼 빛의 효과로 표현한다. 리플렉션(reflection)은 얼음이나 물 등 위에 도형이 있듯이, 그 아래에 반전된 이미지를 표시하는 것이다. 인수에는 그 도형과 반사 도형과의 간격, 반사 도형이 그려진 비율 (프랙션, 0 ~ 1의 실수), 도형의 위와 아래의 지정된 비율을 투과하기 위한 설정 (0 ~ 1의 실수)등을 지정한다.

실제 사용 예제는 아래와 같다.

public void createShape(Pane root){
    Rectangle r = new Rectangle(20, 20, 100, 50);
    r.setFill(Color.BLUE);
    r.setStroke(Color.RED);
    r.setStrokeWidth(5);
    r.setEffect(new DropShadow(20.0, 10.0, 5.0, Color.BLACK));
    root.getChildren().add(r);
     
    Ellipse e = new Ellipse(220, 50, 70, 30);
    e.setFill(Color.YELLOW);
    e.setStroke(Color.GREEN);
    e.setStrokeWidth(5);
    e.setEffect(new Reflection(5.0, 2.0, 0.5, 0));
    root.getChildren().add(e);
     
    Text t = new Text(50, 250, "Hello!");
    t.setFont(new Font(80));
    t.setFill(Color.YELLOW);
    t.setStroke(Color.GREEN);
    t.setStrokeWidth(1);
    t.setEffect(new InnerShadow(2.0, 2.0, 1.0, Color.BLACK));
    root.getChildren().add(t);
}

DropShadow와 InnerShadow은 그 만큼 어려워 아니라고 생각한다. Reflection는 반사 도형의 표시 폭과 상하가 스치는 느낌 등을 설정할 수 있기 때문에, 각각의 인자의 역할을 알면 재미있는 효과를 얻을 수있게 된다.