Workspace2009/06/23 18:40

안녕하세요. 김대욱입니다. 데브피아에서 WPF와 UX구현이라는 주제로 7월 11일 한국마이크로소프트 교육장에서 세미나를 진행하게 되었습니다. 관심있으신 분들의 많은 참석 부탁드리겠습니다 ~! 자세한 내용은 아래를 참고해주세용 ~~~~





저작자 표시 비영리 변경 금지
이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2009/06/14 23:34

안녕하세요. 이번시간에는 WPF를 사용해서 간단하게 PhotoMosaic을 구현 해보도록 하겠습니다. 아래는 시연 동영상이며, 화면이 작아 잘안 보이시는 분들을 위해 설명을 드리자면 모자이크를 만들고자 하는 원본 이미지를 불러오고 모자이크에 사용하고자 하는 이미지의 검색어를 입력한뒤 Make버튼을 누르게 되면 Flickr에서 검색어에 해당하는 이미지를 불러와 원본이미지와 함성해주는 내용입니다.




결과를 자세히 살펴보면 다음과 같습니다. (허락 없이 올린 여자친구 사진인데.. 혼나면 어떡하지.............. -_-)

사진을 확대해보면 여러장의 사진이 모여 하나의 사진을 이루고 있는 모습을 확인 하실 수 있습니다.. PhotoMosaic을 구현하는데 있어 색상정보를 기반으로 하는 방법등 여러가지 방법이 있지만, 이번시간에 구현한 방법은 가장 간단하게 구현 할 수 있는 Tile Image의 투명도를 조절하여 구현하는 방법입니다. 

아래는 PhotoMosaic을 구현하는데 사용한 소스코드이며 코드에 대한 설명은 주석으로 달아놓았습니다!!


간단하게 요약하자면 DrawingImage를 사용해 원본이미지를 가장 먼저 그리고 Flickr에서 검색된 이미지들을 랜덤하게 그려주는 과정을 수행합니다. 이때 Flickr에서 검색된 Tile Image의 Opacity를 낮춰 배경이 비치도록 만들어 마치 여러장의 이미지들이 하나의 이미지를 이루는것과 같은 효과를 냅니다.

위 코드에서 가장 중요한 부분은 Flickr에서 이미지를 불러올때 CacheOption을 사용하여 이미지가 재사용될때 빠르게 응답할 수 있도록 하는 부분에 있습니다. (CacheOption을 사용하지 않으면 저장할때 엄청난 시간이 소요될 수 있습니다..)

실제 사용하실 때에는 아래와 같이 간단히 객체를 생성한뒤 Source Image를 지정하고 Tile의 Scale을 지정한 뒤 Make함수를 호출하시면 되겠습니다.


아래는 이번시간에 사용된 전체소스코드이며 기타 질문이나 요청 문의 등은 이메일 또는 리플로 남겨주시면 답변드리겠습니다 ^^


PS. 반드시 사용전에 Flickr API Key를 본인의 Key로 변경하신 뒤 사용하세요~ 안그러면 에러납니다요~


저작자 표시 비영리 변경 금지
이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
C#2009/06/13 01:22

안녕하세요. 이번시간에는 Windows Mobile과 Motion Sensor가 탑제된 단말기에서 Sensor Data를 취득하기 위한 Library의 구현에 대해 알아보도록 하겠습니다. 테스트는 얼마전에 구입한 옴니아로 진행했으며 정상적으로 동작되는것을 확인 했습니다. 제가 특별히 동영상 촬영 장비가 없기때문에 이번 시간 구현 결과물은 영상으로 준비는 못했습니다요 ㅜㅜ 직접 실행 하시게 되면 아래와 같은 동작 화면을 확인 하실 수 있습니다. (이번시간 내용은 특별하게 UI를 고려하지 않아서 매우 심플합니다...... ㅎㅎ)

아직까지는 .Net CF를 사용하여 Windows Mobile을 개발하는 사람이 많질 않아서(최근에 점점 늘어나고 있다고합니다.) 그런지 당현이 있을 거라 생각했던 C#으로 구현된 Motion Sensor관련 코드가가 없는거 같아서 (대부분 C++로 구현되어 있더라구요..) 새로 구현하게 되었습니다. C#으로 구현했다고해서 기존 방식과 전혀 다른 방식으로 구현했다는 뜻은 아니며 기존의 C++로 구현된 내용을 C#으로 포팅 한것정도로 생각하시면 되겠습니다.

포팅시에 참고한 코드는 예전에 옴니아 소프트웨어공모전에서 삼성전자에서 배포한 MotionSensor관련 코드를 거의 그대로 포팅하고 몇가지 편리 기능정도만 추가 및 간단한 최적화 정도만 진행 한거라 잠재되어 있는 버그가 존재 할 수 있습니다.

간단하게 구조를 살펴보면 MotionSensorData, MotionSensorDataType, MotionSensor로 구성되어 있습니다. 각각의 항목에 대해 설명하면 아래와 같습니다.

- MotionSensorData : Motion Sensor로부터 수신한 XYZ축의 SensorData를 포함할수 있는 Structure입니다.
- MotionSensorDataType : MotionSensor와 통신할때 요청할 데이터 Type에 대한 Enum입니다.
- MotionSensor: 실제 Motion Sensor와 통신하는데 사용하는 Class입니다.

MotionSensor Class의 소스코드는 아래와 같으며 설명은 주석에 포함시켰습니다. 


※ 포인터를 사용하여 디바이스와 통신을 수행하기 때문에 unsafe 키워드를 사용했습니다.


그리고 아래는 실제 코드에서 MotionSensor객체를 사용하는 방법에 대해 설명입니다.

간단하게 MotionSensor객체를 생성하고 GetMotionSensorData()를 호출하거나 X,Y,Z Property를 바로 사용하시면 되겠습니다.
단, X,Y,Z Property를 사용하실때에는 해당 Property를 요청할때마다 데이터를 다시 수신하게 되므로 하나의 루틴에서는 해당 Property가 리턴한 값을 복사하여 사용하시면 되겠습니다.

이상으로 오늘 포스팅을 마치며 기타 궁금하신 점이나 다른 문의는 이메일 또는 리플로 남겨주시기 바랍니다.
아래는 이번시간에 구현한 소스코드입니다.







저작자 표시 비영리 변경 금지
이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
DaeWook, Kim2009/06/12 04:08


오랜만에 쓰는 개인적인 글이네요..ㅎㅎ -_-ㅋ
작년 10월경부터 저와 함께 동거(?)하고 있는 고양이 쿠루를 소개합니다!!
포스팅하고 있는 쿠루가 자꾸 책상위로 올라와서 모니터를 보고 있길래 자기껏도 써달라는 소리인가.해서 쓰게 됬습니다ㅎㅎ
아비시니안이라는 종의 고양이 이구요. 네이버에 아비시니안으로 검색을 해보니

발끝으로 살그머니 걷는 걸음걸이에 매우 우아한 분위기가 감돈다. 털색은 이글이글 불타는 듯 빛나 보인다.

라고 어떤분이 설명해주셨네요... 이글을 보니 하루종일 잠만자고 하루종일 뛰어다니는 쿠루가 아비시니안이 맞나.... 하는 생각이 드네요 ㅎㅎ 보통 고양이 하면 무뚝뚝하고 혼자서 생활하기 좋아하고 주인을 아래것(?)으로 생각하는.. 그런 동물로 이야기 되는데 쿠루를 보면 이녀석이 개인지 고양이 인지 구분을 못할정도로 애교많고 활발한 성격때문에 하루하루 너무너무너무 행복하답니다 하하하 .. ㅋㅋ

얼마전에는 쿠루야 사진찍자~ 하고 카메라를 들이 댓더니 아래와 같은 요상한 포즈를 취하더군요.. 얼핏보면 셀카찍는 고양이 같습니다. ㅎㅎ 특히 오른쪽사진은 얼짱각도까지 ...



사랑스러운 쿠루야!!!
앞으로도 쭉~~~~~ 아프지말고 건강하게 아빠와 함께 알콩달콩 자아아알 지내보자!! 그럼 이만!! 야옹~ㅋ 

P.S 요즘 쿠루가 애태게 여자친구를 구하고 있습니다 혹시 주변에 쿠루의 여자친구가 되어줄 아비시니안 여아가 있다면 소개좀 시켜주세요 ㅎㅎ

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2009/06/12 02:56
안녕하세요. 지구온난화로 인해 어쩌고저쩌고 해서 날씨가 개떡같음을 한탄하는 1人 김대욱입니다. -_-;; ㅋㅋ
최근들어 WPF를 이용해 CubeUI를 구현하는 방법에 대해 문의하시는 분들이 많아 이번시간에는 Cube UI를 WPF의 ListBox에 적용하여 이를 구현는 방법에 대해 소개해 드리고자 합니다..!!  아래는 구현 완료 동영상 입니다.



동영상만 봐서는 저게 뭐에다가 쓰이는 물건인지.. 감이 안잡히시죠??  (제목을 보셨다면 이해 하셨을수도.. ㅎㅎ) 이번시간에 구현할 내용은 WPF3D를 이용해 기존의 Listbox를 Cube모양으로 만들어 활용하는 방법에 대해 소개해 드리겠습니다. 먼저 구조에대해 설명을 드리겠습니다. (소스코드를 다운로드 받으셔서 확인해 가시면서 보시면 이해가 빠를것 같습니다!)

프로젝트를 열어보면 위 샘플에 사용된 이미지 몇장과 Cube3D.xaml, CubeListBox.xaml이 있습니다.
Cube3D.xaml은 Cube UI이기 때문에 Cube 모양을 정의 하는 Geometry가 포함된 ModelVisual3D객체 입니다. Cube3D에는 Front, Back, Left, Right, Top, Bottom이라 이름의 Property가 존재하는데요, 이는 Cube의 각각 면에 해당하는 합니다.

그리고 OffsetX, OffsetY, OffsetZ ... RotationZ 등은 제가 WPF를 이용해서 3D를 구현할때 자주사용하는 코드로 간단하게 Offset, Scale, Rotation을 적용하기 위한 코드입니다. 이부분은 다음에 더 자세히 다루도록 하겠습니다.

그다음 CubeListBox입니다. CubeListBox는 위에서 말씀드린 Cube3D를 템플릿에 활용하여 구현된 ListBox입니다. Template부분 코드를 보면 아래와 같습니다.




Viewport3D를 이용해 WPF3D를 사용하기 위한 Viewport를 생성하고 적당한 카메라와 조명의 위치를 잡은 뒤 위에서 말씀드렸던Cube3D객체를 추가합니다. 그리고 각면에 SelectedItem, PrevItem, NextItem등을 Binding하게되는데요.
여기서 Front에 SelectedItem을 Left에 PrevItem을, Right에 NextItem을 Binding하는 이유는 잠시후에 설명하도록 하겠습니다.
(SelectedItem은 사용자가 현재 ListBox에서 선택한 객체를 보여주고, PrevItem는 이전 NextItem은 다음 객체를 의미합니다.)

PrevItem과 NextItem은 Listbox에 기본적으로 정의된 Property가 아니기 때문에 새로 Dependency Property로 정의 하고, SelectedIndex가 변경되었을때 아래와 같은 내용으로 PrevItem과, NextItem에 값을 할당 해줍니다.

ListBox에 추가된 객체의 갯수보다 Nextndex가 클경우 Index를 0으로 설정하여 순환구조로 작성했으며 PrevIndex가 0보다 작을경우 마지막 항목의 Index를 지정하여 마찬가지로 순환구조를 가지도록 했습니다.

이렇게 하면 Cube상에 현재 선택된 객체는 Front에 다음 객체는 Right에 이전객체는 Left에 위치하게 됩니다. 이제 마우스 조작을 통해 큐브를 회전시키는 부분을 구현할 건데요...해당코드는 아래와 같습니다.


Cube를 회전 한다고해서 실제 ListBox의 SelectedIndex가 변경되는것이 아니기 때문에 회전 Animation이 완료되면 회전 방향에 따라 Index를 증가 또는 감소 시켜줍니다.

이렇게하면 Front에는 현재 선택된 객체가, Left에는 이전, Right에는 다음 객체가 보여지게 되는데요. 회전을 하게되면 Cube자체의 Front, Left, Right 면의 위치가 변하게 되어 뜻하지 않은 결과를 발생시킵니다. 이를 위해 Cube의 회전이 모두 끝나면 Animation을 제거하여 큐브가 회전하지 않은 상태가 되도록 합니다.

이렇게 구현된 CubeListBox는 아래와 같이 일반적인 ListBox와 같은 방식으로 사용하실 수 있습니다.




이상으로 이번 포스팅을 마치며 기타 질문이나 문의 포스팅 요청은 이메일이나 리플로 남겨제요 ^^
아래는 이번 시간에 작업한 내용의 전체 소스코드입니다.





저작자 표시 비영리 변경 금지
이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스