Swift 정리.. The Basics

스위프트.. 괜찮은 언어 같다. C#은 자바를 카피. 스위피트는 모든 언어를 참조해서 기존 개발자들이 큰 혼란 없이 개발할 수 있도록 만든것 같다.

레플을 사용하는 걸 보고 클로져와 비슷할 것으로 잠시 착각했었슴.

자바같은 언어를 써보고 함수형 언어에 대한 고민을 해봤다면 빠르게 습득할 수 있을 것으로 판단됨.

일이 없다면 하루에 한 챕터는 나갈 수 있을것 같다…

요점 정리..

> Optional : C# 의 nullable .. .. 과 같은 거 아니게씀? … ㅎㅎ

> ; 필요 없음.. 써도 되고.

> Int 는 플랫폼의 워드 사이즈를 따라감. 32비트에서는 32비트. 64 에서는 64 ..

> type aliase :  타잎 이름 대신 쓸 수 있슴..  uint 대신 money… 이렇게..

Advertisements

OpenGL, iOS 의 대가.. Jeff Lamarche. SceneKit ..

바로가기는 여기   외국사람인데, kr ??  암튼..

씬 킷은 현재까지는 맥앱에만 해당되는 기술인데 되게 좋더라..

개념적으로 뭘 하느냐.

OpenGL 위에, 앱킷 같은 상위 레벨 아래에 위치함. 씬킷 뷰는 완전히 ‘레이어-감지’ 하여 코어 애니메이션으로 애니메이션 가능하다.
뷰 자체가 아니마 가능할 뿐더러, 뷰의 상수를 아니마 할 수 있음.

씬 킷은 주로 ‘scene graph management’ 라이브러리로 알려진 것이다. 이놈은 하나 이상의 3차원객체와 광원, 카메라를 매니지한다. 이 아이템들이 합쳐져서 스크린에 보여진다. 씬킷은 마야, 모도, 블레더 등으로부터 콜라다 형식으로 데이터를 받을 수 있다. 컬라다는 3차원 객체 외에 광원, 카메라, 애니매이션 정보까지 포함한다.

씬킷은 앱킷과 잘 어우러져 NSView 에 이미 있는 힛 테스트를 통해 터치, 마우스 클릭 등의 프로젝션 등을 다룰 수 있다.

씬킷에서 모든 렌더링이 편하게 가능하며 필요할 때는 렌더 딜리깃을 통해 직접 제어가능하다. 편하게 구현 가능하면서 세세한 조정도 가능하다는 얘기.
이것을 보면 얼마나 이 프레임 워크에 공이 들어갔는지 알 수 있다.

결론적으로 씬킷은 어려운 걸 쉽제 해준다. 하지만, 아직 문서도 완전하지 않고….

셋업

Xcode 4.4 or 4.5 ..  산사자 필요…

ARC 를 켜라.

쿼츠코어 추가.

씬뷰 추가

파일 추가..  닙파일… 씬뷰 객체를 윈도우에 드래그..  레이아웃 할 필요 없다…  블라블라.. HTFSceneView 로 명명해라.

헤더에  씬킷.h 추가..  이제 컴파일 가능.

씬 배경 색 지정

간단한 씬 만들기

씬을 코드로 만들어보자.  씬킷에 대한 기본 툴과 용어를 익힐 것이다.

기본은 카메라, 광원, 객체이다. 이것 없이는 별볼일 없다.

빈 SCNScene 객체 생성. 이 객체를 갖으면 씬에 아이템을 추가하기 위해서 “노드”라 불리는 객체를 생성한다. SCNNode 클래스로 대표되는 노드는 다른 종류의 객체를 붙들어 매기 위해 만들어졌다. 위계가 있어 자식, 부모 관계 로 붙일 수 있다.

모든 씬은 ‘루트 노드’ 가 있고 rootNode 로 불리며 씬의 톱 위상의 객체를 붙인다. 노드를 만들고 거기에 카메라, 3차원객체 등을 붙고 그 노드를 루트노드 혹은 그 자식에 붙여서 씬에 객체를 추가한다. 꽤 직관적이지 않은가?

한번 붙이면 리무브 할 때까지 남아있는다.  awakeFromNib 에 코드를 붙이자.

씬 만들기

// Create an empty scene
SCNScene *scene = [SCNScene scene];
self.scene = scene;

카메라 추가.

// Create a camera
SCNCamera *camera = [SCNCamera camera];
camera.xFov = 45; // Degrees, not radians
camera.yFov = 45;
SCNNode *cameraNode = [SCNNode node];
cameraNode.camera = camera;
cameraNode.position = SCNVector3Make(0, 0, 30);
[scene.rootNode addChildNode:cameraNode];

카메라에 라디언 대신 ‘도’ 로 표시. 카메라 클래스를 보면 오픈쥐엘 뷰포트와 유사하다는 것을 알 것이다. 우연이 아니고. 씬킷의 ‘카메라’는 GL 뷰포트 … 이 다가 아니다. ?? 카메라가 {0, 0, 30} 에 있으면 카메라의 위치에 따라 렌더하기 전에 씬의 모든 노드는 Z 방향으로 -30 물러날 것이다. 카메라는 회전가능. 씬은 카메라의 시점으로 렌더 된다.

이제 객체. 빌트인 객체를 제공. 실린더, 큐브, 공, 콘, 평면, 튜브, 토러스, 피라미드, 텍스트.. SCNGeometry 에서 상속.  생성한 후 속성 부여, 노드에 할당, 노드를 씬에 추가.. 예제.

// Create a torus
SCNTorus *torus = [SCNTorus torusWithRingRadius:8 pipeRadius:3];
SCNNode *torusNode = [SCNNode nodeWithGeometry:torus];
CATransform3D rot = CATransform3DMakeRotation(MCP_DEGREES_TO_RADIANS(45), 1, 0, 0);
torusNode.transform = rot;
[scene.rootNode addChildNode:torusNode];

Transform3D .. 매트릭스.. GLKMatrix4 와 유사. 위치, 스케일, 회전 등에 대한 정보를 담는다.

다음은 조명. 지금 상태에서 프로그램을 돌리면, 토러스가 그려지지만 완전한 평면 흰색일 것임.

OpenGL from the ground.. 를 상기한다면 3디 그래픽의 기본은 디퓨즈, 앰비언트, 스펙큘러 .. 설명..

스펙큘러 : 밝은 점.. 스팟.. 직광..
앰비언트 광원 : 분명한 소스가 없는 광원.. 여러곳에서 반사된 광원. 세이드 부분.. 어두운 곳..
디퓨즈 : 밝은 부분 ?? 아마도..

씬킷의 라이팅은 더 진보된 것. 씬킷에서 스펙큘러 하이라잇은 광원 세팅보다는 재료 로 부터 온다. 나중에 살펴보자. 하지만 디퓨즈와 앰비언트는 씬에 빛을 추가함으로 얻을수 있다.

씬킷에서 광원은 여러가지 타잎. 앰비언트. 직광.

앰비언트 추가해보자. 일반적으로 하나의 앰비언트 광원. 더 드라마틱한 경우 없을 수도 있음.  앰비언트의 위치와 변위는 상관없음.

// Create ambient light
SCNLight *ambientLight = [SCNLight light];
SCNNode *ambientLightNode = [SCNNode node];
ambientLight.type = SCNLightTypeAmbient;
ambientLight.color = [NSColor colorWithDeviceWhite:0.1 alpha:1.0];
ambientLightNode.light = ambientLight;
[scene.rootNode addChildNode:ambientLightNode];

// Create a diffuse light
SCNLight *diffuseLight = [SCNLight light];
SCNNode *diffuseLightNode = [SCNNode node];
diffuseLight.type = SCNLightTypeOmni;
diffuseLightNode.light = diffuseLight;
diffuseLightNode.position = SCNVector3Make(-30, 30, 50);
[scene.rootNode addChildNode:diffuseLightNode];

 

// Create a torus