WPF 3D 소개
3D 그래픽 기초
3D 그래픽의 개념은 사물에 대한 세 개의 관점 즉 3차원을 가진다는 것이다. 우리의 화면이 단 2개의 차원만을 가지고 있기 때문에 우리는 사물의 단면을 가지는 camara를 정의해야 한다. 아래의 사진은 사물을 평면에 투사한 것이다. 이 투사도는 3D 엔진에 의해 비트맵으로 렌더링된 것이다. 이 엔진은 3차원의 공간에 존재하는 모든 빛에 의해 계산된 모든 픽셀의 색을 결정한다.
사물의 모든 면은 물질(Material) 과 Brush를 가진다. 물질은 특정 각도에서 얼마만큼의 빛을 반사할 것인지 그리고 Brush는 색을 결정한다. Brush는 단색일 수도 또는 Gradient일수도 혹은 Texture라고 불리는 Image일 수도 있다.
삼각형의 세계
3D 그래픽의 세계에서는 모든 사물은 삼각형의 집합으로 이루어진다. 하지만 왜 굳이 삼각형일까? 그 이유는 삼각형이 2D의 화면에 나타내기에 가장 균일한 기하학적 구조이기 때문이다. 렌더링 엔진은 한 장면에서 빛과의 각도와 물질을 바탕으로 각각의 삼각형의 색을 계산할 수 있다. 만일 우리가 세상을 사각형으로 표현한다면 그 점들은 평면일 수가 없다. 또한 모든 표면들은 표현하거나 계산하기에 훨씬 더 복잡할 것이다.
3D로 만들어진 사물의 표면을 우리는 Mesh(덩어리)라고 부른다. Mesh는 수만은 3차원 점들을 이루어져 있다. 이 점들을 우리는 Vertices(점들)이라고 부른다. Vertices는 삼각형들을 정의하는 어떤 감싸는 패턴에 의해서 합쳐져 있다. 모든 삼각형들은 앞면과 뒷면이 구분되어져 있고 오직 앞면만이 렌더링된다. 앞면은 점들을 감싸는 순서에 의해 정의되어진다. WPF는 반 시계방향의 감싸는 패턴을 가지고 있다. 오른손의 법칙이라는 걸 기억하는가? 주먹을 쥐고 엄지를 들면 엄지를 제외한 나머지 손가락들은 엄지를 기준으로 반 시계방향을 만들어낸다. 엄지는 윗면을 나타내고 나머지 손가락들은 반 시계방향을 이루는 것이다.(즉, 엄지가 나타내는 방향이 앞면인 것이다)
오른손 좌표 시스템
WPF는 오른손 좌표 시스템을 사용한다. 아래의 그림처럼 오른손을 만들었을 때 손가락들이 가리키는 방향이 양의 방향이 된다.
3D 화면의 구성요소
- Viewport 3D
Viewport는 2D와 3D 사이에 문을 열어주는 Control이다.
- Camera
모든 3D화면 정확히 하나의 camara를 가진다. Camera는 Position(위치)과 LookDirection(보는방향) 그리고 UpDirection(위쪽 방향)을 가진다. WPF는 원근법과 직각투영법을 지원한다.
- 3D Models
3D model은 화면상의 사물을 의미한다. 이 기하학적 사물은 mesh와 meterial을 가지는데, 그 중 meterial은 그 자체로써 brush를 가지며 빛을 분산시키거나 반사시키거나 혹은 발산시킬 수도 있다
- Lights
빛이 없으면 우리는 아무것도 볼 수가 없다. 그래서 우리는 사물들을 비추기 위해
장면당 최소한 하나의 빛을 갖추어야 한다. WPF는 여러 가지의 빛을 지원한다.
l AmbientLight
l DirectionalLight
l PointLight
l SpotLight
Hello 3D-world : A simple cube
아래의 예제는 정육면체를 형성하는 12개의 삼각형으로 8개의 점이 이어진 기초적인 정육면체 cube를 어떻게 만드는지를 보여준다.
<Viewport3D> <Viewport3D.Camera> <PerspectiveCamera Position="-40,40,40" LookDirection="40,-40,-40 " UpDirection="0,0,1" /> </Viewport3D.Camera> <ModelVisual3D> <ModelVisual3D.Content> <Model3DGroup> <DirectionalLight Color="White" Direction="-1,-1,-3" /> <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D Positions="0,0,0 10,0,0 10,10,0 0,10,0 0,0,10 10,0,10 10,10,10 0,10,10" TriangleIndices="0 1 3 1 2 3 0 4 3 4 7 3 4 6 7 4 5 6 0 4 1 1 4 5 1 2 6 6 5 1 2 3 7 7 6 2"/> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial Brush="Red"/> </GeometryModel3D.Material> </GeometryModel3D> </Model3DGroup> </ModelVisual3D.Content>
</ModelVisual3D> </Viewport3D>
'개발 TIP > 참고자료_소개' 카테고리의 다른 글
컴퓨터 프로그래밍을 배워야하는 이유 (0) | 2014.02.13 |
---|---|
담당 지도교수님의 프로그래밍, 알고리즘 코딩에 대한 조언 (0) | 2013.09.27 |
"개발자가 성공하는 길" 안철수 (0) | 2012.01.02 |
공개 GUI 라이브러리 링크 모음 (0) | 2011.12.14 |
Copyright 작성 팁 (0) | 2011.10.31 |
댓글