'WPF3D'에 해당되는 글 2건

  1. 2009/01/28 3D Movie Search Engine Using WPF 3D & Naver Open API (3)
  2. 2008/08/13 2차원 객체를 3차원 렌더링 (2)
WPF2009/01/28 09:32

안녕하세요. 멤버십에서 새벽까지 당직을 스고 집으로 돌아와 고양이랑 조금 놀다가 잠좀 잘까 했는데 고양이녀석 아프다고 낑낑대서 아침에 병원을 대려가기 위해 잠을 안자고 버티고 있는 1人입니다.. ㅠ_ㅠ

이번시간에는 예전부터 포스팅하려다가 미루고 미루고 미루다가 이제야 포스팅하게된.. -_-;; WPF 3D를 이용한 영화 검색엔진.... (뭔가 거창하네요)이라고 하기엔 너무나 허접한 내용을 소개하고자 합니다. 간단히 Naver Open API를 사용하여 입력한 키워드에 맞는 영화 포스터 이미지를 가져와서 3D화면에 출력하는 내용입니다. 아래는 구현 완료 동영상입니다.


동영상 캡쳐좀 잘해보려고 무압축으로 설정했더니.. 대략 2분짜리 동영상인데 900메가 가까이 커져버리더라구요.. 하는수 없이 다시 인코딩해서 용량 줄인다음 다시올렸는데.. 열악한 제 컴퓨터가 무압축 방식을 견디지 못했는지 중간에  뚝~~ 하고 끊기는 장면이 한번 보이네요-_-;; 실제로 돌려보시면 검색결과 가져오는 부분 이외에는 끊기지는 않습니다..^^;; (이부분은 너무 졸려서 해결하지 않은 채로 그냥 둿어요.. ㅈㅅ)

저번시간에는 구글에서 이미지 주워와서 하더니 이번에는 네이버에서 뒤적거려서 구한 이미지 요리조리 편집해서 사용했습니다. 혹시나 있을 수 있는 문제를 대비해 일단은 원래 제작자분이름을 적어놨는데... (사실은 허락을 받고싶지만.. 외국분이라... ㅠㅠ)

이번에도 역시 소스코드가 상당히 길어서 파일로 첨부했습니다.. (절대 설명하기가 귀찮아서 그러는게 아니랍니다!!!! )

위 내용을 구현하기 위해서는 아래와 같은 준비물이 필요합니다.
1. Naver Open API Key : Naver Developer Center에 가시면 Open API Key를 발급하는 코너가 있습니다.
2. 적절한 UI 이미지 : 저처럼 인터넷에서 주워서 사용하셔두 되고..
3. 3D Panel Mesh : 간단하게 이미지만 출력해주면 되기때문에 아래와 같이 간단한 사각형 Mesh를 만들어 사용했습니다.

4. 머리가 아파오는 수학 : 초등학교 수준같은데 어렵네요..................................................... ㅠ

자 그럼 준비가 되셨나요? 그럼 아래 Class Diagram을 보면서 구조에 대해서 살펴보도록 하겠습니다. 이미지가 줄어들어서 잘안보이시는분은 클릭하시면 원본사지으로 확인 하실 수 있습니다.


이번 예제는 위 그림과 같이 총 4부분으로 나뉘어져있습니다. 가장먼저 오른쪽 중앙의 DVDCase를 보겠습니다. 간단하게 포스터 위에 반투명한 DVD Case모양 Image를 덮여씌워서 출력되는 객체입니다. 그다음은 Panel3D인데요, 좀전에 말한 DVDCase객체가 Panel 3D에 붙게됩니다.

Panel3D는 위에서 보여드릴 간단한 2차원 사격형 Mesh로 구성되어 있으며, 마우스 이벤트등을 활용하기 위해 UIElement3D객체를 상속받아 구현했습니다. 그리고 생성자로 DVDCase객체를(꼭 DVD Case가 아니더라도 상관은 없습니다.) 넣으면 DVDCase를 Visual로 사용하는 VisualBrush로 생성한뒤 DiffuseMaterial를 생성하여 Material로 사용합니다. 코드에서 보시면 아시겠지만, 그냥 Material과 BackMaterial에 모두 VisualBrush를 적용한 이유는, 객체가 원을 그리며 회전을 하게 되는데 객체가 뒤로 갔을경우에도 확인 가능하도록 설정한것입니다.

계속해서 PanelList입니다. PanelList는 ModelVisual3D을 상속받아 구현되었으며, base.Children 속성에 여러개의 Pannel이 추가 되게 됩니다. PanelList에서는 PanelList에서 새로 정의된 Children Property를 통해 UIElement를 입력받는데, Collection에 객체가 추가/제거 될때 마다 적절한 크기&위치를 지정하여 객체들이 원을 이루어 분포될 수 있도록 도와주는 역할을 합니다.

Panel 3D객체들의 회전에 대한 문제는, Panel3D객체가 base.Children속성에 추가되어있기때문에, 간단하게 PanelList에 RotationTransform을 적용하여 간단하게 해결할 수 있었습니다. MainWindow부분에서는 단순한 UI구성과 OpenAPI를 사용한 결과 수집후 Panel List의 Children을 변경하는 기능을담당합니다.

★다운받아 실행해봤는데 에러가 난다고 하시는 분은 Open API키 값을 지정 해주었는 확인 해보시기 바랍니다. 
   (제키값은 지우고 ############와같이 적어놨기때문에 본인의 OpenAPI로 작성하셔야합니다.)

자그럼 오늘은 여기까지로 하구요, 잠이 쓰나미처럼 몰려오고 있는터라 말이 너무 횡설수설한감이 없진않지만.. 질문이나 다른 건의사항이나 기타 등등은 이메일이나 리플로 남겨주세요~~ 그럼 내일 뵙겠습니다!!


아래는 전체 프로젝트 소스코드입니다.




 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2008/08/13 14:51

이번시간에는 Viewport2DVisual3D를 사용하여 2차원 컨트롤(UIElement)를 3차원 객체에 렌더링 하는 방법에 대해서 알아봅니다. 기본적인 3D와 관련된 내용은 추후 다시 설명 할 예정이니 3D에 대한 자세한 설명은 제외하고 진행 하겠습니다. 아래 동영상은 이번 시간에 만들게 될 결과물입니다. 실제 WPF에서 사용하는 Button을 3차원 공간에 올려놓고 임의로 회전하는 내용을 담고 있습니다.

아래는 구현 부분 코드입니다.

<DockPanel LastChildFill="True">

<StackPanel DockPanel.Dock="Bottom">

<StackPanel Orientation="Horizontal">

<TextBlock>Rotate</TextBlock>

<Slider Width="230" x:Name="Slider" Minimum="-80" Maximum="80"/>

</StackPanel>

</StackPanel>

<Viewport3D>

<Viewport3D.Camera>

<PerspectiveCamera Position="0, 0, 4"/>

</Viewport3D.Camera>


<Viewport2DVisual3D>


<Viewport2DVisual3D.Transform>

<RotateTransform3D>

<RotateTransform3D.Rotation>

<AxisAngleRotation3D Angle="{Binding ElementName=Slider, Path=Value}"

Axis="0, 1, 0" />

</RotateTransform3D.Rotation>

</RotateTransform3D>

</Viewport2DVisual3D.Transform>


<Viewport2DVisual3D.Geometry>

<MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0"

TextureCoordinates="0,0 0,1 1,1 1,0" TriangleIndices="0 1 2 0 2 3"/>

</Viewport2DVisual3D.Geometry>


<Viewport2DVisual3D.Material>

<DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" Brush="White"/>

</Viewport2DVisual3D.Material>


<Button Click="Button_Click">

<StackPanel>

<TextBlock Text="WPF KOREA" TextAlignment="Center" FontSize="10"/>

<TextBlock Text="http://whatisthat.co.kr" TextAlignment="Center"

FontSize="5" Margin="0,-4,0,0"/>

</StackPanel>

</Button>


</Viewport2DVisual3D>



<ModelVisual3D>

<ModelVisual3D.Content>

<DirectionalLight Color="#FFFFFFFF" Direction="0,0,-1"/>

</ModelVisual3D.Content>

</ModelVisual3D>

</Viewport3D>


</DockPanel>

WPF 3D를 처음 접하시는 분이라면 다소 어려운 부분일 수 있으나 집 접 따라 해보시면 이해하는데 많은 도움이 될 것입니다. 우리가 중요하게 봐야 할 곳은 노란색으로 색칠 되어 있는 부분으로, 지금부터 코드를 살펴보겠습니다.

Viewport2DVisual3D을 사용하기 위해서는 기본적은 3D모델과 마찬가지로 Geometry와 Material을 설정해야 합니다. Geometry와 관련된 부분은 MSDN이나 기타 3D관련 서적을 참고하시기 바랍니다. (추후 포스팅할 예정입니다.) Geometry를 설정했다면 Material을 설정해주어야 합니다. Material은 DiffuseMaterial로 설정하고 Viewport2DVisual3D의IsVisualHostMaterial Property를 True로 설정하여 Material을 대화형으로 설정합니다.

그리고 Viewport2DVisual3D의 Visual에 원하는 2D Element를 등록하면 됩니다. 이곳에 입력된 Visual은 위에서 생성한 DiffuseMaterial과 데이터를 주고받으며 화면에 표시되게 됩니다. Viewport2DVisual3D에서 사용하는 방법은 단순히 VisualBrush만을 복제하여 사용하는 방법이 아니라 실제 컨트롤을 3D Viewport에 렌더링 하는 것과 같으므로 객체의 모든 이벤트 등을 동일 하게 사용하실 수 있습니다.

사용자 삽입 이미지

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스