3D 블록 카메라
Blockcam은 iOS 및 iPados를위한 카메라 프로그램으로 AvFoundation을 통해 이미지를 찍은 다음 해당 이미지를 간단한 3D 장면으로 변환합니다. 장면은 사용자가 회전하고 조정하여 평평한 이미지로 저장할 수 있습니다.
Blockcam은 Stuart Rankin이 작성했습니다.
Blockcam의 버전화는 Versioning.swift 파일로 유지되며 각 빌드에서 사전 건축 스크립트 단계로 자동 업데이트됩니다. 업데이트에는 빌드 ID, 빌드 번호, 시간 및 날짜가 포함되지만 버전 번호에는 현재 직접 업데이트해야합니다. 아래의 현재 빌드 문자열은 동일한 메커니즘에 의해 유지됩니다.
버전 관리 프로그램은 현재 BlockCAM 프로젝트 파일의 버전 번호를 업데이트하지 않습니다.
가장 최근 빌드 : 버전 0.9 알파, 빌드 3287, 빌드 날짜 : 2021 년 7 월 13 일, 16:06
버전 및 빌드가 업데이트되는 방법에 대한 정보는 GitHub의 버전 업데이터 저장소를 참조하십시오.
Blockcam은 가능한 한 사용자가 제공 한 정보를 포함하도록 설계되었습니다. 사용자 식별 정보가 사용될 때마다 Blockcam은 명시 적으로 요청합니다. 설계별로 Blockcam은 기본적으로 사용자 식별 정보 를 수집하지 않습니다. 사용자는 이러한 유형의 정보를 수집 할 수 있도록 활발한 조치를 취해야합니다 .
| 식별 가능한 정보 | 사용 | 저장 |
|---|---|---|
| 사용자 이름 | 처리 된 이미지 메타 데이터에 저장 될 사용자 이름 (사용자가 입력). | UserDefaults 에 저장됩니다. |
| 사용자 저작권 | 사용자의 저작권 문자열 (사용자가 입력)은 처리 된 이미지 메타 데이터에 저장됩니다. | UserDefaults 에 저장됩니다. |
사용자가 BlockCAM을 인스턴스화하면 라이브 뷰 모드에서 열립니다 (기본 화면에서 카메라보기를 표시). 사용자는 세 가지 모드 중 하나를 선택할 수있는 옵션이 있습니다.
Blockcam은 다음 플랫폼에서 테스트되었습니다.
UIBezierPath 사용하여 더 많은 모양을 추가하십시오.Blockcam에는 4 가지 성능 문제가 있습니다.
autoreleasepool 블록에 루프에 메모리 집약 코드를 배치함으로써 대부분의 우려 사항이 해결되었습니다. 이것이 충분하지 않다는 것이 불충분하다면, 완화 계획이 존재합니다. 모든 스크래치 이미지를 로컬 스토리지에 저장 한 다음 한 번에 하나씩 처리하고 처리하십시오. 이것은 속도를 늦추지 만 메모리 압력을 줄입니다. BlockCAM은 CoreImage 필터시 CIPixellate 통해 픽셀 화 된 이미지로 찍은 각 이미지를 변환합니다. Pixellation 후, 처리 알고리즘은 측정 높이를 계산합니다. 높이는 노드의 크기 또는 노드의 압출을 결정합니다. 그런 다음 픽셀 화 된 이미지의 각 픽셀을 3D 모양 (사용자가 설정)으로 변환 한 다음 3D보기의 현재 장면에 추가됩니다.
모든 처리 작업은 동일한 코드를 사용하지만 적용되는 사용자 대면 모드에 따라 다르게 (또는 여러 번) 호출 될 수 있습니다.
처리를 위해 이미지가 획득됩니다. 이미지의 소스는 표준, iOS/iPados에서 읽을 수있는 이미지 인 한 중요하지 않습니다. 가장 일반적인 이미지 소스는 라이브 뷰 카메라 일 것입니다. 다른 소스는 사진 앨범과 비디오 프레임입니다.
다음 이미지는 처리의 소스입니다. (이것은 초여 겨울에 우리 정원에서 찍은 이미지입니다.)

이미지를 변환하는 성능 비용을 고려할 때, 사용자는 소스 이미지를 더 작은 크기로 조정하여 수행 된 작업량을 줄일 수있는 옵션이 있습니다. 이것은 비디오를 처리 해야하는 사용자의 개입 없이도 발생할 수 있습니다. (비디오 처리는 많은 메모리를 사용하는 경향이 있으므로 이미지 당 몇 퍼센트를 절약하더라도 시스템의 스트레스가 줄어드는 데 도움이됩니다.) 일부 이미지는 270 ° (또는 선호하는 경우 -90 °)로 회전하고 올바르게 회전해야합니다. 이것은 이미지 컨디셔닝 단계에서도 수행됩니다.
이어서, 처리 된 이미지는 코어 이미지 필터 함수를 통해 픽셀 화된다. 구체적으로, 가장 일반적인 필터 블록 캠 사용은 CIPixellate 입니다 (다른 픽셀 화 필터는 최종 형태에 따라 사용됩니다). 각 픽셀 화 된 영역의 크기는 사용자 설정에 따라 다릅니다. 크기가 작을수록시 CIPixellate (및 필터와 같은)는 여전히 매우 빠르지 만 전체 성능에 미치는 영향이 커집니다. 소규모 픽셀 화 된 영역이 성능을 증가시키는 이유는 나중에 더 많은 3D 노드가 필요하기 때문입니다.
다음 이미지는 원본 이미지의 픽셀레이션을 보여줍니다. 각 픽셀 화 된 영역은 단색이며 블록 캠은 색상을 얻기 위해 전체 영역을 읽을 필요가 없음을 의미합니다.

그런 다음 픽셀 화 된 이미지가 구문 분석됩니다. 이것은 각 픽셀 화 된 영역의 색상을 얻는 것을 수반합니다. 이것은 예상 단계보다 느립니다. 이미지에서 개별 픽셀 데이터를 얻으려면 이미지를 쿼리 할 준비를하기 위해서는 많은 이미지 데이터 조작이 필요합니다. 이 단계가 끝나면 이미지가 더 이상 사용되지 않습니다. 2D 배열의 컬러 데이터가 다음 단계로 전달됩니다.
이 단계에서 픽셀 화 된 이미지 데이터는 로컬 파일 스토리지에 저장됩니다. 이것은 나중에 사용자가 요청한 사소한 시각적 변경 사항을 단순화하기위한 것입니다.
최종 노드 모양은 사용자 설정입니다. Blockcam을 사용하면 사용자가 많은 모양 중 하나를 선택할 수 있습니다. 내장형 모양은 구축되지 않은 모양보다 빠르게 실행되는 경향이 있습니다 (예 : 구체는 Pentagons보다 빠릅니다). 지정된 지오메트리를 사용하여 이미지 구문 분석 단계에서 각 색상에 대해 3D 노드가 생성됩니다. 최종 장면의 3D- 성을 과시하기 위해 노드는 일부 차원에서 과장됩니다. 예를 들어, 큐브가 사용자가 선택한 모양 인 경우 길이는 과장됩니다. 과장은 색상에 의해 결정됩니다 - 색상은 노드의 확산 표면을 가리고 높이를 결정하는 데 사용됩니다. 과장은 사용자가 선택 가능한 결정 요인에 의해 결정됩니다.
노드가 생성되면 마스터 노드에 추가됩니다. 모든 노드가 생성되어 마스터 노드에 배치되면 마스터 노드 자체가 3D 장면에 배치됩니다.
이것은 사소한 단계처럼 보일 수 있지만 비디오를 변환 할 때 매우 까다 롭습니다. 이미지를 변환하는 경우 3D 장면이 업데이트되어 결국 사용자에게 표시됩니다 (일반적으로 0.5 ~ 2.0 초 이내). 비디오의 경우 디스플레이 타이밍을 올바르게 가져 오는 것이 중요합니다. 비디오를 변환하려면 각 프레임 이이 단계를 통해 실행되면 3D 장면에서 스냅 샷을 가져옵니다. 장면이 표시되기 전에 스냅 샷을 가져 오면 결과는 순수한 검은 색 이미지가되며, 이는 사용자가보고 싶어하는 것이 아닙니다. 따라서 BlockCAM은 SCNSceneRendererDelegate 기능 세트에 참여하여 실제로 장면이 사용자에게 표시되는시기를 알아야합니다.
다음 이미지는 이미지의 최종적이고 처리 된 버전입니다. 이것은 scnview에서 snapshot() 호출의 출력입니다. 샘플은 압출 블록을 사용하며 기본 카메라 방향에서 볼 수 있습니다.

이미지가 표시되면 사용자는 그대로 저장하거나 일부 시각적 측면을 편집하거나 회전 또는 확대 또는 축소 한 다음 (아마도) 저장할 수있는 옵션이 있습니다 (아마도). 비디오의 경우 3D 장면의 스냅 샷이 캡처되면 장면이 폐기됩니다.
.SaveOriginalImageAction 의 값에 따라 원래 이미지가 저장됩니다. 사용자가 처리 된 이미지를 저장하면 메타 데이터가 처리 된 이미지와 함께 저장됩니다. 메타 데이터는 프로그램의 이름과 버전과 이미지가 생성 될 때 적용되는 매개 변수로 구성됩니다.
처리 된 파일 저장은 다단계 프로세스입니다.
/Scratch 디렉토리에 표준 .jpg 파일로 저장됩니다..jpg 파일)으로 재조정됩니다.PHAssetCreationRequest 사용하여 이미지를 사진 롤 스트립 exif 데이터로 이동하는 더 일반적인 방법이기 때문에 필요합니다)./Scratch 디렉토리에서 삭제됩니다.Blockcam은 처리 된 파일에 메타 데이터를 저장합니다.
| 그룹 | 꼬리표 | 저장된 값 |
|---|---|---|
| 사소한 말다툼 | 아티스트 | 사용자가 활성화 한 경우 사용자 이름입니다. |
| 사소한 말다툼 | 저작권 | 사용자가 활성화 한 경우 사용자의 저작권 문자열입니다. |
| 사소한 말다툼 | 소프트웨어 | Blockcam의 이름, 버전 및 빌드 번호. |
| exif | 사용자 컴퓨팅 | 처리 된 이미지를 생성하는 데 사용되는 매개 변수 목록. |
개인 정보 토론도 참조하십시오.
이미지 처리를위한 단순화 된 흐름도는 다음과 같습니다.

이미지를 전제 및 픽셀레이션하는 데 걸리는 시간이기 때문에 새 이미지가 처리 될 때마다 픽셀레이션 데이터 (다양한 색상으로 구성)가 장치의 파일 시스템에 저장됩니다. 그런 다음 사용자가 매개 변수 (예 : 3D 모양)를 변경하면 전처리가 이미 완료되었고 픽셀레이션 데이터가 재사용됩니다. 이것은 잠재적으로 많은 시간을 절약 할 수 있습니다.
사용자가 전처리에 영향을 미치는 매개 변수를 변경하면 이미지가 처음부터 재 처리됩니다. (예를 들어, 블록 크기를 변경하면 전체 재 처리주기가 실행됩니다.)
비디오 처리를위한 단순화 된 흐름도는 다음과 같습니다. 큐브는 이미지 흐름을 다시 언급합니다.

현재 Green Box ( "Processed Frame")는 예상/요구 사항으로 기능하지 않으므로 현재 작문에서 비디오 제작이 지원되지 않습니다.
BlockCAM은 런타임에 디버그 콘솔 (현재 존재하는 경우 및 대부분의 인스턴스에 존재하지 않음) 및 로컬 SQLITE 데이터베이스에 메시지 및 상태를 기록합니다. 이것은 필요가 발생할 경우 사후 디버깅을 허용합니다.
데이터 임대에 대한 Apple의 정책 (EU의 정책은 말할 것도없고)을 감안할 때, 릴리스 된 블록 캠 버전에 대해 컴파일 타임 플래그를 통해 로깅이 제거 될 가능성이 전적으로 가능합니다.
모든 사용자 설정 (및 몇 가지 프로세스 설정)은 Settings 클래스를 통해 저장됩니다. 이 클래스는 프로그램의 나머지 부분에 보이지 않는 저장 메커니즘을 캡슐화합니다. 현재 스토리지 메커니즘은 UserDefaults 입니다. 설정이 더욱 복잡해지면 데이터베이스로 마이그레이션하는 것이 간단합니다.
설정에 액세스하려면 발신자는 제공된 Settings 클래스의 메소드를 사용해야합니다. 이것은 데이터 유형 무결성을 보장하는 데 도움이됩니다.
Settings 클래스는 또한 설정 수준의 변경 사항 알림을 제공합니다 (이는 처음에 클래스를 생성하는 주된 이유).
블록 캠 설정은 다음과 같습니다.
| 상징 | 유형 | 기본 | 용법 |
|---|---|---|---|
| .Initialized | 끈 | "초기화" | 설정이 초기화되었는지 여부를 결정하는 플래그. Blockcam이 처음 실행되면 .Initialized 가 nil 또는 비어 있으면 Blockcam이 처음 실행되었다고 가정하므로 모든 설정에 대한 기본값을 씁니다. |
| .Blocksize | 정수 | 48 | 이미지 처리를위한 블록 크기. 이것은 각 픽셀 화 된 영역의 제곱 크기입니다. |
| .ShapEtype | 끈 | "블록" | 각 픽셀 화 영역에서 3D 객체와 동일합니다. 열거에서 캐스팅. |
| .InvertHeight | 부울 | 거짓 | 반전 높이/크기 결정 플래그. |
| . 헤이트 소스 | 끈 | "명도" | 높이/크기를 결정하는 데 사용할 컬러 채널. 열거에서 캐스팅. |
| .ImagesizeConstraints | 끈 | "중간" | 성능의 이유로 처리하기 전에 이미지의 크기 감소량을 결정합니다. 열거에서 캐스팅. 실행 시간에 해석 된 실제 값. |
| .VerticalExaggeration | 끈 | "중간" | 3D 모양을 압출하거나 확대 할 때 수행 할 수직 과장의 양. 열거에서 캐스팅. |
| .inputquality | 정수 | 2 | 입력 품질을 나타내는 값. 3은 0에서 3 사이이며 3은 최고 품질 (및 처리하기 가장 느린)입니다. |
| .CurrentCamera | 끈 | "뒤쪽에" | 사용 된 마지막 카메라의 위치. 앞뒤. 열거에서 캐스팅. |
| .LightColor | 끈 | "하얀색" | 빛의 이름. 열거에서 캐스팅. 나중에 컬러 라이브러리 유형의 색상으로 변환 될 수 있습니다. |
| .LightType | 끈 | "옴니" | 장면을 밝히는 데 사용되는 빛의 유형의 이름. 열거에서 캐스팅. |
| .lightintensity | 끈 | "정상" | 장면을 밝히는 데 사용되는 빛의 강도. 런타임에 결정된 실제 값. 열거에서 캐스팅. |
| .fieldofview | 끈 | "정상" | 카메라의 시야. 실제 값은 런타임에 결정됩니다. 열거에서 캐스팅. |
| .showhistogram | 부울 | 거짓 | 히스토그램 디스플레이를 표시하십시오. 현재 구현되지 않았습니다. |
| .histogramBucketCount | 정수 | 256 | 히스토그램 디스플레이의 색상 수. 현재 구현되지 않았습니다. |
| .InitialView | 끈 | "라이브 뷰" | 사용자가 본 마지막보기 (예 : 라이브 뷰, 앨범 등). |
| .FullyExtrudeLetters | 부울 | 진실 | 문자가 완전히 압출되었는지 또는 부분적으로 만 압출되는지 결정합니다. |
| .LETTERSMoothness | 끈 | "매끄러운" | 글자로 곡선을 만드는 방법을 결정합니다. 고품질 곡선은 성능이 큰 비용으로 제공됩니다. 런타임에 결정된 실제 값. 열거에서 캐스팅. |
| .LETTERFONT | 끈 | "Futura" | 압출 된 글자를 렌더링하는 데 사용하는 글꼴 (및 선택적 무게). 시스템에 글꼴이 존재하지 않으면 Blockcam은 정의되지 않은 상태로 들어갑니다. |
| .RandomCharacterSource | 끈 | "라틴어" | 문자를 압출 할 때 임의의 문자의 소스로 사용할 수있는 유니 코드 범위의 문자 범위. 여러 범위는 다른 범위를 다른 범위와 쉼표로 분리하여 지정할 수 있습니다. |
| .Videofps | 정수 | 1 | 현재 사용되지 않습니다. |
| .Videodimensions | 끈 | "가장 작은" | 비디오를 생성 할 때 최종 비디오 크기를 결정합니다. 런타임에 결정된 실제 값. 열거에서 캐스팅. |
| .VideoBlocksize | 정수 | 48 | 비디오 처리를위한 블록 크기. 이것은 각 픽셀 화 된 영역의 제곱 크기입니다. |
| .usemetal | 부울 | 진실 | Blockcam에게 OpenGL이 아닌 금속을 사용하도록 지시하는 플래그. |
| .antialiasingmode | 정수 | 0 | 항아리아 모드를 결정합니다. |
| .initialBestfit | 부울 | 거짓 | 사실이라면 Blockcam은 모든 노드를 가능한 한 단단히보기에 맞추려고합니다. |
| .Saveoriginalimageacection | 끈 | "언제나" | 원본 이미지를 어떻게 그리고 언제 저장하는지 결정합니다. 열거에서 캐스팅. |
| .next AdementialInteger | 정수 | 0 | 파일 이름 생성에 사용됩니다. |
| .Loopsectionentialintegerafter | 정수 | 9999 | 순차적 정수를 사용할 때 언제 시작 해야하는지 결정합니다. |
| .STARTEDECATIONINTEGERAT | 정수 | 1 | 순차 정수의 시작 값. |
| . increasestarapexes와의 가적 | 부울 | 거짓 | 사실이라면, 별 모양의 정점 수는 색상 높이의 눈에 띄게 증가합니다. |
| .StarapexCount | 정수 | 5 | 별의 정점 수. .IncreaseStarApexesWithProminence 와의 가적이면 사실이라면, 이것은 정점의 시작 수입니다. |
| .haltwhencriticalthermal | 부울 | 진실 | 사실 인 경우, Blockcam은 중요한 열 경보를받을 때 ( fatalError 호출을 통해) 중단됩니다. 이것은 Apple 지침을 위반할 수 있으며 제거 될 수 있습니다. |
| .haltonlowpower | 부울 | 진실 | 사실이라면, 블록 캠은 저전력 경보를받을 때 ( fatalError 호출을 통해) 중단됩니다. 이것은 Apple 지침을 위반할 수 있으며 제거 될 수 있습니다. |
| .BESTFITFOFFSET | 더블 | 2.0 | .InitialBestFit 이 이미지에 좀 더 부정적인 공간을 제공하기 위해 카메라를 뒷받침하는 데 사용하는 값. |
| .LightingModel | 끈 | "Phong" | 표면 재료 조명 모델. 열거에서 캐스팅. |
| .cappedlineballlocation | 끈 | "맨 위" | Cappedline 모양의 노드에 대한 공의 위치 ( "캡"). 열거에서 캐스팅. |
| .LoggingEnabled | 부울 | 거짓 | 로깅 플래그를 활성화합니다. |
| .fontsize | 정수 | 36 | 압출 된 글자의 글꼴 크기. |
| .enableUisounds | 부울 | 진실 | UI 사운드를 재생하는 플래그 (예 : 버튼을 누른 경우). 이 값이 false 인 경우 다른 모든 사운드 플래그는 무시됩니다. |
| .enableShuttersound | 부울 | 거짓 | 카메라 버튼을 누르면 셔터 사운드를 재생하는 플래그. 일부 지리적 위치에서는 항상 발생 하며이 값을 설정하는 데 영향을 미치지 않습니다. |
| .enableImageProcessingsound | 부울 | 진실 | 이미지 처리의 시작과 끝에서 소리를 재생하는 플래그. 이미지 처리는 시간이 많이 걸리므로 이미지가 완료되는시기를 이해하는 데 도움이됩니다. |
| .enableVideOreCordingsound | 부울 | 진실 | 사용자가 비디오 녹화를 시작하고 중지 할 때 소리를냅니다. |
| .enableButtonPressSounds | 부울 | 진실 | 사용자가 버튼을 누를 때 소리를냅니다. |
| .enableOptionselectSounds | 부울 | 진실 | 사용자가 화면 설정 디스플레이에서 옵션을 선택할 때 소리를 재생합니다. |
| .EnableCrashSounds | 부울 | 거짓 | 충돌 대화 상자가 표시되면 소리를냅니다. #debug 모드에서 컴파일 된 경우에만 활성화됩니다. |
| .meshDotsize | 끈 | "중간" | 메시의 중심 도트의 크기. .None 사용하지 않으면 중앙 점이 표시되지 않습니다. 열거에서 캐스팅. |
| .meshlinethickness | 끈 | "중간" | 메쉬 라인의 두께. 열거에서 캐스팅. |
| .Radiatinglinethickness | 끈 | "중간" | 방사선 모양의 두께. 열거에서 캐스팅. |
| .RadiatingLineCount | 정수 | 8 | 방사선 모양의 방사선 수. 4 추기경 방향을 가리키는 선, 8 추기경 방향으로, 중간에, Z- 평면에서 8 줄에 16 위한 것입니다. |
| .Blockchamfersize | 끈 | "없음" | 블록 모양의 모따기 반경/에지 스무드. 열거에서 캐스팅. |
| .maximagedimension | 정수 | 1024 | 이미지의 최대 치수. 처리 할 이미지가 더 크면 가장 긴 차원 이이 값이되도록 크기가 조정됩니다. |
| .adduserdatatoexif | 부울 | 거짓 | 플래그는 처리 된 이미지의 EXIF 블록에 사용자가 만든 정보를 추가합니다. #debug 모드로 컴파일 된 경우이 값은 기본값으로 true로 변합니다. |
| .username | 끈 | "" " | (기본값은 비어 있습니다.) 처리 된 이미지의 EXIF 블록에 추가 된 사용자가 제공 한 이름. 이것은 .AddUserDataToExif 가 참인 경우에만 발생합니다. #debug 모드로 컴파일 된 경우이 값은 기본값이 "Stuart Rankin"으로 변합니다. |
| .usercopyright | 끈 | "" " | (기본값은 비어 있습니다.) 처리 된 이미지의 EXIF 블록에 추가되는 사용자가 제공 한 저작권 문자열. 이것은 .AddUserDataToExif 가 참인 경우에만 발생합니다. #debug 모드에서 컴파일 된 경우이 값은 "Attribution 3.0 Unported (CC x 3.0)"로 기본값을 기본값으로 표시합니다. |
| .coneisinverted | 부울 | 진실 | z 깊이 측면에서 원뿔 모양이 반전되는지 결정합니다. |
| .conetoPoptions | 끈 | .TopIsZero .RawValue | 원뿔의 상단 반경을 결정하는 옵션. |
| .conebaseoptions | 끈 | .BaseIsSide .Rawvalue | 원뿔의 기본 반경을 결정하는 옵션. |
| .ShowsPlashScreen | 부울 | 진실 | 스플래시 화면이 시동시 표시되는지 여부를 결정하는 플래그. |
| .HUASHAPELIST | 끈 | "" " | 색조 변형 모양 유형에 대한 모양 목록. |
| .saturationshapelist | 끈 | "" " | 채도 변형 형태 유형에 대한 모양 목록. |
| .Brightnessshapelist | 끈 | "" " | 밝기 변형 형태 유형에 대한 모양 목록. |
Blockcam은 장치의 그래픽 칩을 연습하는 3D 처리를 사용합니다. 사용자가 최고 품질의 설정을 지정하면 특정 극한 조건이 발생할 수 있습니다. 장치가 손상되지 않도록 보존하기 위해 Blockcam의 실행을 중단하기 위해 설정을 사용할 수 있습니다.
| 이벤트 | 행동 | 제어 설정 |
|---|---|---|
| 열의 | 열 이벤트가 임계 단계에 도달하면 (문자 그대로 알림에서 .critical ) 설정이 true 이면 Blockcam에 의해 생성 된 열 응력을 줄이기 위해 치명적인 오류가 발생합니다. | .HaltWhenTooHot |
| 배터리 | 배터리가 저전력 상태로 들어가면 설정이 true 이면 재충전 전에 배터리의 수명을 보존하는 데 도움이되는 치명적인 오류가 발생합니다. | .HaltOnLowPower |
Blockcam은 다음 시각을 지원합니다.
압출 효과를 위해 다음과 같은 모양이 현재 지원되거나 지원됩니다.
| 모양 | 토종의 | 메모 |
|---|---|---|
| 블록 | 예 SCNBox | z 축을 따라 길어진 기본 상자 모양. |
| 삼각형 | 아니요 | 맞춤형 삼각형 모양. |
| 펜타곤 | 아니요 | 맞춤형 펜타곤 모양. |
| hexagons | 아니요 | 맞춤형 육각형 모양. |
| 옥토곤 | 아니요 | 맞춤형 팔각형 모양. |
| 피라미드 | 예 SCNPyramid | 기본 피라미드 모양. |
| 토 로이드 | 예 SCNTorus | 기본 Torus 모양. |
| 실린더 | 예 - SCNCylinder | 기본 실린더 모양 - 멋진 원을 만듭니다. |
| 구체 | 예 SCNSphere | 네이티브 구 모양. |
| 캡슐 | 예 - SCNCapsule | 기본 캡슐 모양. 소리만큼 흥미롭지 않습니다. |
| 사면체 | 아니요 | 맞춤형 사면체 고체. |
| 별 | 아니요 | 맞춤형 별 모양 (방사형 정점 포함). 정점 수를 다룰 수 있습니다. |
| combinedforrgb | 예 - 조합 | 결합 된 구체, Torus 및 캡슐. |
| 결합 된 forhsb | 예 - 조합 | 결합 된 구체, Torus 및 캡슐. |
| 메쉬 | 아니요 | 현재 구현되지 않았습니다. |
| 편지 | 예 - SCNText | 기본 압출 텍스트. 특히 라틴이 아닌 알파벳으로 매우 느리게하는 경향이 있습니다. |
| 윤곽 | 예 - SCNCapsule | 매우 얇은 캡슐 모양. |
| CAPPEDLINES | 예 - 조합 | 사용자 설정에 따라 줄의 상단, 중간 또는 하단에 구체가있는 매우 얇은 캡슐 모양. |
| 방사선 | 예 - 조합 | 중앙 지점에서 방사되는 다중 라인. 사용자는 몇 줄을 지정할 수 있습니다. 이것은 성능이 풍부한 모양입니다. |
| huevarying | 변형 | 주어진 지점에서의 모양은 픽셀 화 영역의 색조에 의해 결정되므로 실제 최종 모양은 다릅니다. |
| 포화 | 변형 | 주어진 지점의 모양은 픽셀 화 된 영역의 포화에 의해 결정되므로 실제 최종 모양은 다릅니다. |
| 밝기 차량 | 변형 | 주어진 지점에서의 모양은 픽셀 화 된 영역의 밝기에 의해 결정되므로 실제 최종 모양은 다릅니다. |
대표적인 픽셀 화 영역의 각 형상은 압출 또는 확대됩니다. 압출 깊이 또는 확대 된 크기의 결정은 픽셀 화 된 영역의 색상에 따라 다릅니다.
| 컬러 채널 | 용법 |
|---|---|
| 색조 | 색상의 색조는 3D 객체의 깊이/크기를 결정합니다. 색조 값은 주기적이므로 (0.0은 기본적으로 1.0과 동일) 적색 픽셀은 정복되는 동안 녹색이 강조 표시되는 경향이 있습니다. |
| 포화 | 색상 채도 값은 깊이/크기를 결정합니다. 더 밝은 색상이 더 커집니다. |
| 명도 | 색상의 밝기는 깊이/크기를 결정합니다. 이것이 기본값이며 대부분의 사람들이 프로그램이 작동하기를 기대하는 방법입니다. |
| 빨간색 | 빨간색 채널은 깊이/크기를 결정하는 데 사용됩니다. |
| 녹색 | 녹색 채널은 깊이/크기를 결정하는 데 사용됩니다. |
| 파란색 | 파란색 채널은 깊이/크기를 결정하는 데 사용됩니다. |
| 시안 | 합성 시안 채널 (CMYK로부터)은 깊이/크기를 결정하는 데 사용됩니다. |
| 마젠타 | 합성 마젠타 채널 (CMYK)은 깊이/크기를 결정하는 데 사용됩니다. |
| 노란색 | 합성 노란색 채널 (CMYK로부터)은 깊이/크기를 결정하는 데 사용됩니다. |
| 검은색 | 합성 검은 색 채널 (CMYK의)은 깊이/크기를 결정하는 데 사용됩니다. |
| yuv : y | YUV 변환의 합성 Y 채널. |
| Yuv : u | YUV 변환의 합성 U 채널. |
| Yuv : v | YUV 변환의 합성 V 채널. |
Blockcam은 역전기를 지원합니다. 이는 사용자가 반전을 설정하면 깊이/크기가 그 자체의 왕복 요법이므로 어두운 영역이 눈에 띄고 가벼운 영역이 정복되거나 숨겨져 있습니다.
Blockcam은 빛의 색상과 빛의 유형을 변화시키는 것을 지원합니다. 색상은 현재 작은 사전 정의 된 색상 세트로 제한됩니다. 조명의 유형은 SceneKit의 표준, 비 모색화 된 조명 (예 : .omni 및 .spot )을 평행합니다.
조명 위치는 현재 사용자가 조정할 수 없습니다.
Blockcam은 SCNView 의 allowsCameraControl 플래그를 사용하여 사용자가 제스처를 통해 3 축으로 (3 축으로) 확대, 쉐크 또는 회전 할 수 있도록합니다.
처음에 렌더링되면 결과는보기에서 상대적으로 멀리 떨어져있는 것처럼 보일 수 있습니다. Blockcam에는 이미지를보기에 맞게 사용자가 확보 할 수있는 플래그가 있습니다. 이 기능은 확대 및 수축과 관련하여 allowsCameraControl 경향이 있습니다.
이 섹션에서는 다양한 구현 수준 세부 사항에 대해 설명합니다.
Blockcam은 Swift 5로 Xcode 11.3으로 작성되었습니다.
이미지를 처리하는 데 걸리는 시간이 오래 걸리면 모든 이미지 처리는 백그라운드 스레드에서 수행됩니다. 이를 위해서는 모든 커뮤니케이션이 UI를 통해 사용자를 업데이트하여 올바른 스레딩 호출로 수행해야합니다.
TBD
Blockcam은 Stuart Rankin의 Copyright © 2019, 2020입니다
日本語版«Google 翻訳で翻訳»
3d ブロックカメラ
Blockcam os ios および iPados 用のカメラプログラムで、 avfoundation を介して画像を取得し、それらの画像を単純な 3d シーンに変換します。シーンは、ユーザーによって回転および拡大縮小され、フラットイメージとして保存されます。
블록 캠 u 스튜어트 랭킨 によって作成されました。
Blockcam ing versioning.swift ファイVersioning.swiftで管理され、ビルド前のスクリプトステップとしてビルドごとに自動的に更新されます。 更新にはビルド ID 、ビルド番号、時刻、日付が含まれますが、現在、バージョン番号は手動で更新する必要があります。 以下の現在のビルド文字列も同じメカニズムによって維持されます。 以下の現在のビルド文字列も同じメカニズムによって維持されます。
現在、バージョン管理プログラムは 블록 캠 am
最新のビルド : バージョン情報については、英語のセクションを参照してください。
バージョンとビルドの更新方法については、 github ub [versionupdater] − (https://github.com/sjrankin/versionupdater 찾고 リポジトリを参照してください。
블록 캠 ユーザーを特定できる情報が使用されるたびに、 は、可能な限りユーザーが提供する情報を含むように設計されています。 블록 캠 はそれを明示的に要求します。 設計上、 블록 캠 はデフォルトでユーザーを特定できる情報を収集しません。 ユーザーは、このタイプの情報の収集を許可するためにアクティブな手順を実行する必要があります。
| 識別情報 | 使用 | 保管 |
|---|---|---|
| ユーザー名 | 処理された画像のメタデータに保存されるユーザーの名前) (ユーザーが入力)。。 | 「userDefaults 」に保存されます。 |
| ユーザー著作権 | 処理された画像メタデータに保存されるユーザーの著作権文字列) (ユーザーが入力)。。 | 「userDefaults 」に保存されます。 |
ユーザーが 블록 캠 am c c c c c) 。ユーザーには、次の 。ユーザーには、次の 3 つのモードのいずれかを選択するオプションがあります。
블록 캠 は、次のプラットフォームでテストされています。
1.主な問題はパフォーマンスです。 古い携帯電話の大きなサイズの画像で使用すると、パフォーマンスが大幅に低下します。 ただし、セルフィーカメラは実際には非常に高速です。 BlockCamには、パフォーマンスの問題を軽減するのに役立つ特定の軽減策(ユーザー設定など)があります。 2. *漢字は非常に遅いです。*漢字を使用して押し出し画像を作成するには、古いiPhoneの場合、6分程度かかります。 3.以下でのみテスト済み:iPhone 6S +、iPhone 8、iPad Mini4。iPadPro 9.7。 4. MacCatalystは、MacカメラのAVFoundationの使用をサポートしていないため、非常に困難です。 MacCatalystバージョンでの作業は、その妨害のため現在のところ停止しています。 5.ヒストグラムはまだ実装されていません。 6.非組み込みの幾何学的図形は、組み込みの図形よりも大幅に遅いように見えます。 7. iPadOSおよびiOS 13には、混乱するデバッグセッションにつながるいくつかの追加のデバッグステートメントが残っているようです。具体的には、「BackgroundTaskを終了できません」メッセージです。
UIBezierPathを使用してさらにシェイプを追加します。 2.処理済みのライブビュー(現在の写真モードと同様)のみを表示する処理済みライブビューモードを追加します。 これはおそらく非常に電力を消費し、遅くなり、最新のハードウェアでのみ確実に動作する可能性があります。 3.ビデオを共有する-現在、画像のみを共有できます。 4.ピクセル化されたデータの使用を完全に実装します。 ほとんどのコードが配置されています。 この機能は、処理された画像データをピクセル化レベル(たとえば、各ピクセル領域の色)でユーザーのファイルシステム空間にファイルとして保存します。 利点は、形状や押し出しの深さなどの特定の設定をユーザーが変更したときに処理を高速化することです。 BlockCamには、パフォーマンスに関する4つの懸念事項があります。
BlockCamは、取り込まれた各画像をCoreImageフィルターCIPixellateを介してピクセル化された画像に変換します。 ピクセル化の後、処理アルゴリズムは高さの決定を計算します-高さはノードのサイズまたはノードの押し出しを決定します。 次に、ピクセル化された画像の各ピクセルが3D形状(ユーザーが設定)に変換され、3Dビューの現在のシーンに追加されます。
すべての処理操作は同じコードを使用しますが、有効なユーザー向けモードに応じて異なる方法(または複数回)で呼び出すことができます。
処理のために画像が取得されます。画像のソースは、iOS / iPadOSで読み取り可能な標準の画像である限り重要ではありません。画像の最も一般的なソースは、おそらくライブビューカメラです。他のソースは、フォトアルバムとビデオフレームです。
次の画像は、処理のソースです。 (これは私が初冬に庭で撮った画像です。)

画像を変換するためのパフォーマンスの犠牲を考えると、ユーザーはソース画像をより小さなサイズにサイズ変更することにより、実行される作業量を削減するオプションがあります。これは、ビデオが処理される場合、ユーザーの介入なしに発生することもあります。 (ビデオの処理は多くのメモリを消費する傾向があるため、画像ごとに数パーセントを保存してもシステムのストレスを軽減できます。)一部の画像は270°(または必要に応じて-90°)に回転され、正しく回転します。これは、画像調整ステップでも行われます。
処理された画像は、Core Imageフィルター関数を介してピクセル化されます。具体的には、BlockCamが使用する最も一般的なフィルターは「CIPixellate」です(ただし、最終的な形状に応じて他のピクセル化フィルターが使用されます)。各ピクセル化領域のサイズは、ユーザー設定によって異なります。サイズが小さいほど、全体的なパフォーマンスへの影響は大きくなりますが、「CIPixellate」(およびフィルターと同様)は依然として非常に高速です。ピクセル化された領域が小さくなるとパフォーマンスが向上する理由は、後でより多くの3Dノードが必要になるためです。
次の画像は、元の画像のピクセル化を示しています。各ピクセル化された領域は単色であることに注意してください。つまり、BlockCamは領域全体を読み取って色を取得する必要はなく、1ピクセルだけです。

次に、ピクセル化された画像が解析されます。これには、ピクセル化された各領域の色を取得する必要があります。これは予想よりも遅いステップです。画像から個々のピクセルデータを取得するには、画像を照会できるようにするためだけに大量の画像データ操作が必要です。この手順の最後に、画像は使用されなくなります。カラーデータの2D配列が次のステップに渡されます。
このステップでは、ピクセル化された画像データがローカルファイルストレージに保存されます。 これは、後でユーザーが要求する小さな視覚的な変更を簡素化するためです。
最終的なノード形状はユーザー設定です。 BlockCamを使用すると、ユーザーは多くの形状のいずれかを選択できます。組み込みの形状は、非組み込みの形状よりも速く動作する傾向があります(たとえば、球体は五角形よりも高速です)。指定したジオメトリを使用して、イメージ解析ステップから各色の3Dノードが生成されます。最終シーンの3D性を誇示するために、ノードはある次元で誇張されています。たとえば、キューブがユーザーが選択した形状である場合、長さは誇張されます。誇張は色によって決定されます-色は、ノードの拡散表面を陰影付けするために、また高さを決定するために使用されます。誇張は、ユーザーが選択可能な決定要因によって決定されます。
ノードが作成されると、そのノードはマスターノードに追加されます。すべてのノードが作成されてマスターノードに配置されると、マスターノード自体が3Dシーンに配置されます。
-マスターノードは、後のアニメーションを管理しやすくするために使用されます。
これは簡単な手順のように思えるかもしれませんが、ビデオを変換するときは非常に注意が必要です。画像を変換すると、3Dシーンが更新され、最終的にユーザーに表示されます(通常は0.5〜2.0秒以内)。ビデオの場合、ディスプレイのタイミングを正確にすることが重要です。ビデオを変換するには、各フレームをこれらの手順で実行し、3Dシーンのスナップショットを取得します。シーンが表示される前にスナップショットが撮られた場合、結果は純粋な黒のイメージになりますが、これはユーザーが見たいものではありません。したがって、BlockCamはSCNSceneRendererDelegate関数セットに参加して、シーンが実際にユーザーに表示されるタイミングを知る必要があります。
次の画像は、画像の最終的な処理済みバージョンです。これは、SCNViewでのsnapshot()呼び出しの出力です。サンプルは押し出しブロックを使用し、デフォルトのカメラの向きで表示されています。

画像が表示されると、ユーザーはそれをそのまま保存するか、いくつかの視覚的側面を編集するか、回転またはズームインまたはズームアウトしてから保存する(おそらくもう一度)オプションがあります。ビデオの場合、3Dシーンのスナップショットがキャプチャされると、シーンは破棄されます。
.SaveOriginalImageActionの値に応じて、元の画像が保存されます。 ユーザーが処理された画像を保存すると、メタデータは処理された画像とともに保存されます。 メタデータは、プログラムの名前とバージョン、およびイメージの作成時に有効なパラメーターで構成されます。
処理されたファイルの保存は、複数ステップのプロセスです。
.jpgファイルとして/Scratchディレクトリに保存されます。.jpgファイルとして)。PHAssetCreationRequestを使用します-写真ロールに画像を移動するより一般的な方法はExifデータを削除するためです)。/Scratchディレクトリから削除されます。BlockCamは、処理されたファイルにメタデータを保存します。
| グループ | タグ | 保存された値 |
|---|---|---|
| 사소한 말다툼 | アーティスト | ユーザーが有効にした場合、ユーザーの名前。 |
| 사소한 말다툼 | 著作権 | ユーザーが有効にした場合、ユーザーの著作権文字列。 |
| 사소한 말다툼 | ソフトウェア | BlockCamの名前、バージョン、ビルド番号。 |
| Exif | UserComment | 処理済み画像の生成に使用されるパラメーターのリスト。 |
画像の前処理とピクセル化には時間がかかるため、新しい画像が処理されるたびに、ピクセル化データ(色の配列で構成される)がデバイスのファイルシステムに保存されます。 その後、ユーザーがパラメーター(3D形状など)を変更した場合、前処理は既に完了しており、ピクセル化データは再利用されます。 これにより、大幅に時間を節約できる可能性があります。
ユーザーが前処理に影響するパラメーターを変更すると、画像は最初から再処理されます。 (たとえば、ブロックサイズを変更すると、完全な再処理サイクルが実行されます。)
BlockCamは、実行時のメッセージとステータスをデバッグコンソール(存在する場合、大部分のインスタンスでは存在しない)とローカルSQLiteデータベースに記録します。 これにより 必要が生じた場合の事後デバッグ。
Appleのデータ保持に関するポリシー(EUのポリシーは言うまでもありません)を考えると、BlockCamのすべてのリリースバージョンのログは(コンパイル時フラグを介して)削除される可能性が高いです。
すべてのユーザー設定(およびいくつかのプロセス設定)は、 Settingsクラスを介して保存されます。 このクラスは、プログラムの残りの部分からは見えないストレージメカニズムをカプセル化します。 現在、ストレージメカニズムはUserDefaultsです。 設定がより複雑になった場合、これをデータベースに移行するのは簡単です。
設定にアクセスするには、呼び出し側はSettingsクラスの提供されたメソッドを使用する必要があります。 これにより、データ型の整合性を確保できます。
Settingsクラスは設定レベルの変更通知も提供します(これが最初にクラスを作成する主な理由でした)。
BlockCamの設定を以下に示します。
| 記号 | タイプ | デフォルト | 使用法 |
|---|---|---|---|
| .Initialized | 끈 | "Initialized" | 設定が初期化されたかどうかを決定するフラグ。 BlockCamが最初に実行されるときに、 .Initializedがnilまたは空の場合、BlockCamが最初に実行されたと想定されるため、すべての設定のデフォルト値を書き込みます。 |
| .BlockSize | 整数 | 48 | 画像処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .ShapeType | 끈 | "Blocks" | 各ピクセル化領域の3Dオブジェクトと同じ。列挙型からキャストします。 |
| .InvertHeight | Boolean | 거짓 | 反転高さ/サイズ決定フラグ。 |
| .HeightSource | 끈 | "명도" | 高さ/サイズを決定するために使用するカラーチャンネル。列挙型からキャストします。 |
| .ImageSizeConstraints | 끈 | "중간" | パフォーマンス上の理由から、処理する前に行う画像のサイズの縮小量を決定します。列挙型からキャストします。実行時に解釈される実際の値。 |
| .VerticalExaggeration | 끈 | "중간" | 3D形状を押し出しまたは拡大するときに実行する垂直方向の誇張の量。列挙型からキャストします。 |
| .InputQuality | 정수 | 2 | 入力品質を示す値。 0から3の範囲で、3が最高品質(および処理が最も遅い)です。 |
| .CurrentCamera | 끈 | "뒤쪽에" | 最後に使用したカメラの位置。前面または背面。列挙型からキャストします。 |
| .LightColor | 끈 | "하얀색" | ライトの色の名前。列挙型からキャストします。後でカラーライブラリタイプの色に変換できます。 |
| .LightType | 끈 | "Omni" | シーンの照明に使用されるライトのタイプの名前。列挙型からキャストします。 |
| .LightIntensity | 끈 | "정상" | シーンを照らすために使用される光の強度。実行時に決定される実際の値。列挙型からキャストします。 |
| .FieldOfView | 끈 | "정상" | カメラの視野。実際の値は実行時に決定されます。列挙型からキャストします。 |
| .ShowHistogram | Boolean | 거짓 | ヒストグラム表示を表示します。現在実装されていません。 |
| .HistogramBucketCount | 整数 | 256 | ヒストグラム表示の色数。現在実装されていません。 |
| .InitialView | 끈 | "LiveView" | ユーザーが最後に表示したビュー(ライブビュー、アルバムなど)。 |
| .FullyExtrudeLetters | Boolean | 진실 | 文字が完全に押し出されるか、部分的にのみ押し出されるかを決定します。 |
| .LetterSmoothness | 끈 | "매끄러운" | 文字の曲線をどれだけスムーズに作成するかを決定します。高品質の曲線には、大きなパフォーマンスコストがかかります。実行時に決定される実際の値。列挙型からキャストします。 |
| .LetterFont | 끈 | "Futura" | 押し出された文字のレンダリングに使用するフォント(およびオプションの太さ)。フォントがシステムに存在しない場合、BlockCamは未定義の状態に入ります。 |
| .RandomCharacterSource | 끈 | "Latin" | 文字を押し出すときにランダムな文字のソースとして使用する名前付きUnicode範囲。複数の範囲を指定するには、それぞれをコンマで区切ります。 |
| .VideoFPS | 整数 | 1 | 現在使用されていません。 |
| .VideoDimensions | 끈 | "Smallest" | ビデオを生成するときの最終的なビデオサイズを決定します。実行時に決定される実際の値。列挙型からキャストします。 |
| .VideoBlockSize | 整数 | 48 | ビデオ処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .UseMetal | Boolean | 진실 | OpenGLではなくMetalを使用するようにBlockCamに指示するフラグ。 |
| .AntialiasingMode | 整数 | 0 | アンチエイリアスモードを決定します。 |
| .InitialBestFit | Boolean | 거짓 | trueの場合、BlockCamは、すべてのノードをビューにできるだけ厳密に合わせようとします。 |
| .SaveOriginalImageAction | 끈 | "언제나" | 元の画像を保存する方法とタイミングを決定します。列挙型からキャストします。 |
| .NextSequentialInteger | 정수 | 0 | ファイル名の生成に使用。 |
| .LoopSequentialIntegerAfter | 정수 | 9999 | 連続する整数を使用する場合、いつループを開始するかを決定します。 |
| .StartSequentialIntegerAt | 정수 | 1 | 連続整数の開始値。 |
| .IncreaseStarApexesWithProminence | Boolean | 거짓 | trueの場合、星形の頂点の数は色の高さが顕著になるにつれて増加します。 |
| .StarApexCount | 整数 | 5 | 星の頂点の数。 .IncreaseStarApexesWithProminenceがtrueの場合、これは頂点の開始数です。 |
| .HaltWhenCriticalThermal | Boolean | 진실 | trueの場合、BlockCamは重大な温度アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .HaltOnLowPower | Boolean | 진실 | trueの場合、BlockCamは低電力アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .BestFitOffset | 더블 | 2.0 | .InitialBestFitがtrueの場合にカメラを後退させて、画像にもう少しネガティブなスペースを与えるために使用する値。 |
| .LightingModel | 끈 | "Phong" | 表面マテリアル照明モデル。列挙型からキャストします。 |
| .CappedLineBallLocation | 끈 | "맨 위" | CappedLine形状のノードのボール(「キャップ」)の位置。列挙型からキャストします。 |
| .LoggingEnabled | Boolean | 거짓 | ロギングフラグを有効にします。 |
| .FontSize | 整数 | 36 | 押し出された文字のフォントサイズ。 |
| .EnableUISounds | Boolean | 진실 | Flagは、UIサウンドを再生します(ボタンが押されたときなど)。 この値が「false」の場合、他のすべてのサウンドフラグは無視されます。 |
| .EnableShutterSound | Boolean | 거짓 | Flagは、カメラボタンが押されたときにシャッター音を再生します。 一部の地理的な場所では、これは常に発生し、この値を設定しても効果はありません。 |
| .EnableImageProcessingSound | Boolean | 진실 | Flagは、画像処理の開始時と終了時に音声を再生します。 画像処理には時間がかかるため、ユーザーは画像がいつ完成するかを理解するのに役立ちます。 |
| .EnableVideoRecordingSound | Boolean | 진실 | ユーザーがビデオの記録を開始および停止したときに音を再生するフラグ。 |
| .EnableButtonPressSounds | Boolean | 진실 | ユーザーがボタンを押したときに音を再生するフラグ。 |
| .EnableOptionSelectSounds | Boolean | 진실 | ユーザーが画面上の設定画面でオプションを選択したときに音を再生するフラグ。 |
| .EnableCrashSounds | Boolean | 거짓 | フラグは、クラッシュダイアログが表示されたときにサウンドを再生します。 #DEBUGモードでコンパイルされた場合のみ有効です。 |
| .MeshDotSize | 끈 | "중간" | メッシュの中心ドットのサイズ。 .Noneが使用される場合、中央のドットは表示されません。 列挙型からキャストします。 |
| .MeshLineThickness | 끈 | "중간" | メッシュラインの太さ。 列挙型からキャストします。 |
| .RadiatingLineThickness | 끈 | "중간" | 放射線形状の太さ。 列挙型からキャストします。 |
| .RadiatingLineCount | 整数 | 8 | 放射ライン形状の放射ラインの数。 「4」は基線方向を指す線、「8」は基線方向とその中間、および「16」はz平面のさらに8本の線を示します。 |
| .BlockChamferSize | 끈 | "없음" | ブロック形状の面取り半径/エッジの滑らかさ。 列挙型からキャストします。 |
| .MaxImageDimension | 整数 | 1024 | 画像の最大寸法。 処理する画像が大きい場合、最長寸法がこの値になるようにサイズ変更されます。 |
| .AddUserDataToExif | Boolean | 거짓 | Flagは、ユーザーが作成した情報を処理済み画像のExifブロックに追加します。 |
| .UserName | 끈 | "" " | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の名前。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します。 |
| .UserCopyright | 끈 | "" " | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の著作権文字列。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します |
BlockCamは次のビジュアルをサポートしています。
現在、押し出し効果では次の形状がサポートされています(またはサポートされる予定です)。
| 形状 | ネイティブ | メモ |
|---|---|---|
| ブロック | はい- SCNBox | Z軸に沿って長くなったネイティブボックスの形状。 |
| 三角形 | いいえ | カスタム正三角形の形状。 |
| 五角形 | いいえ | カスタム正五角形。 |
| 六角形 | いいえ | カスタム正六角形。 |
| オクトゴン | いいえ | カスタム正八角形。 |
| ピラミッド | はい- SCNPyramid | ネイティブのピラミッド形状。 |
| トロイド | はい- SCNTorus | ネイティブトーラス形状。 |
| シリンダー | はい- SCNCylinder | 自然なシリンダー形状-すてきな高架円になります。 |
| 球 | はい- SCNSphere | ネイティブの球形。 |
| カプセル | はい- SCNCapsule | ネイティブカプセルの形状。聞こえるほど面白くない。 |
| 四面体 | いいえ | カスタム正四面体ソリッド。 |
| 星 | いいえ | カスタム星形(半径方向に等しい頂点を持つ)。頂点の数を変えることができます。 |
| CombinedForRGB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| CombinedForHSB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| メッシュ | いいえ | 現在実装されていません。 |
| レター | はい- SCNText | ネイティブの押し出しテキスト。特に非ラテン系のアルファベットでは、非常に遅くなる傾向があります。 |
| 行 | はい- SCNCapsule | 非常に薄いカプセル形状。 |
| CappedLines | はい-組み合わせ | ユーザー設定に応じて、行の上部、中間、または下部に球体を配置した非常に薄いカプセル形状。 |
| RadiatingLines | はい-組み合わせ | 中心点から放射状に広がる複数の線。 ユーザーは行数を指定できます。 これはパフォーマンス重視の形状です。 |
代表的なピクセル化領域の各形状は、押し出しまたは拡大されます。押し出しの深さまたは拡大サイズの決定は、ピクセル化された領域の色に依存します。
| カラーチャンネル | 使用方法 |
|---|---|
| 색조 | 色の色相は、3Dオブジェクトの深さ/サイズを決定します。色相値は周期的であることに注意してください(0.0は基本的に1.0と同じです)。したがって、緑が強調表示されている間、赤みを帯びたピクセルは抑制される傾向があります。 |
| 彩度 | 彩度の値は深さ/サイズを決定します。明るい色は大きくなります。 |
| 明るさ | 色の明るさが深さ/サイズを決定します。これはデフォルト値であり、ほとんどの人がプログラムが機能することを期待する方法です。 |
| 赤 | 赤チャネルは深さ/サイズを決定するために使用されます。 |
| 緑 | 緑のチャネルは深さ/サイズを決定するために使用されます。 |
| 青 | 青チャンネルは深さ/サイズを決定するために使用されます。 |
| シアン | (CMYKからの)合成シアンチャンネルを使用して、深度/サイズを決定します。 |
| マゼンタ | 深さ/サイズを決定するために、CMYKからの合成マゼンタチャネルが使用されます。 |
| 黄色 | 合成の黄色チャンネル(CMYKから)を使用して深さ/サイズを決定します。 |
| 黒 | 深さ/サイズを決定するために、CMYKからの合成黒チャンネルが使用されます。 |
BlockCamは反転フラグをサポートしています。これは、ユーザーが反転を設定した場合、深度/サイズはそれ自体の比isであり、暗い領域を目立たせ、明るい領域を抑制または非表示にすることを意味します。
BlockCamは、ライトの色とライトの種類の変更をサポートしています。 色は現在、事前定義された色の小さなセットに制限されています。 ライトのタイプは、SceneKitの標準のパラメータ化されていないライト( .omniや.spotなど)に対応しています。
現在、ライトの位置はユーザーが調整することはできません。
BlockCamは、 SCNViewのallowsCameraControlフラグを使用して、ユーザーがジェスチャによって拡大、光沢、回転(3軸)できるようにします。
最初にレンダリングしたとき、結果はビューから比較的遠くにあるように見える場合があります。 BlockCamには、画像をビューに合わせるためのユーザー設定可能なフラグがあります。 この機能は、拡大と縮小に関してallowsCameraControlを混同する傾向があります。
すべてのユーザー設定(およびいくつかのプロセス設定)は、 Settingsクラスを介して保存されます。このクラスは、プログラムの残りの部分からは見えないストレージメカニズムをカプセル化します。現在、ストレージメカニズムはUserDefaultsです。設定がより複雑になった場合、これをデータベースに移行するのは簡単です。
設定にアクセスするには、呼び出し側はSettingsクラスの提供されたメソッドを使用する必要があります。これにより、データ型の整合性を確保できます。
Settingsクラスは設定レベルの変更通知も提供します(これが最初にクラスを作成する主な理由でした)。
BlockCamは3D処理を使用し、デバイスのグラフィックチップを実行します。ユーザーが最高品質の設定を指定した場合、特定の極端な条件が発生する可能性があります。デバイスを損傷から保護するために、そのような場合にBlockCamの実行を中止する設定を使用できます。
| イベント | アクション | 設定の制御 |
|---|---|---|
| 열의 | サーマルイベントがクリティカルステージ(通知では文字通り.critical )に達すると、設定がtrueの場合、BlockCamによって作成される熱ストレスを減らす致命的なエラーが生成されます。 | .HaltWhenTooHot |
| バッテリー | バッテリーが低電力状態になった場合、設定がtrueの場合、再充電前にバッテリーの寿命を保つために致命的なエラーが生成されます。 | .HaltOnLowPower |
BlockCamの著作権©2019, 2020 by Stuart Rankin