Kamera blok 3D
Blockcam adalah program kamera untuk iOS dan iPado yang mengambil gambar melalui avfoundation dan kemudian mengubah gambar -gambar itu menjadi adegan 3D sederhana. Adegan dapat diputar dan diskalakan oleh pengguna, dan disimpan sebagai gambar datar.
Blockcam ditulis oleh Stuart Rankin.
Versi untuk blockcam dipertahankan dalam file Versioning.swift dan secara otomatis diperbarui dengan masing-masing build sebagai langkah skrip pra-membangun. Pembaruan termasuk ID Build, Nomor Bangun, Waktu dan Tanggal, tetapi nomor versi saat ini harus diperbarui dengan tangan. String build saat ini di bawah ini juga dipertahankan oleh mekanisme yang sama.
Program versi saat ini tidak memperbarui nomor versi file proyek blockcam.
Build terbaru: Versi 0.9 Alpha, Build 3287, Tanggal Bangun: 13 Juli 2021, 16:06
Lihat Repositori VersionUpdater di GitHub untuk informasi tentang bagaimana versi dan bangunan diperbarui.
BlockCam dirancang untuk berisi informasi yang disediakan pengguna sebanyak mungkin. Setiap kali informasi yang dapat diidentifikasi pengguna digunakan, Blockcam akan memintanya secara eksplisit. Dengan desain, Blockcam tidak mengumpulkan informasi yang dapat diidentifikasi oleh pengguna secara default; Pengguna harus mengambil langkah aktif untuk memungkinkan pengumpulan informasi jenis ini.
| Informasi yang dapat diidentifikasi | Menggunakan | Penyimpanan |
|---|---|---|
| Nama belakang | Nama pengguna (dimasukkan oleh pengguna) untuk disimpan dalam metadata gambar yang diproses. | Disimpan di UserDefaults . |
| Hak cipta pengguna | String hak cipta pengguna (dimasukkan oleh pengguna) untuk disimpan dalam metadata gambar yang diproses. | Disimpan di UserDefaults . |
Ketika pengguna memancing blockcam, itu terbuka dalam mode tampilan langsung (menunjukkan tampilan kamera di layar utama). Pengguna memiliki opsi untuk memilih salah satu dari tiga mode:
Blockcam telah diuji pada platform berikut:
UIBezierPath untuk menambahkan lebih banyak bentuk.Ada empat masalah kinerja untuk blockcam:
autoreleasepool , sebagian besar kekhawatiran telah diatasi. Jika ternyata ini tidak mencukupi, ada rencana mitigasi: simpan semua gambar goresan ke penyimpanan lokal kemudian baca mereka secara tunggal dan prosesnya satu per satu. Ini akan memperlambat segalanya tetapi mengurangi tekanan memori. Blockcam mengubah setiap gambar yang diambil menjadi gambar pixellated melalui CoreImage Filter CIPixellate . Setelah pixellation, algoritma pemrosesan kemudian menghitung ketinggian menentukan - ketinggian menentukan ukuran node atau ekstrusi node. Kemudian, setiap piksel dari gambar pixellated dikonversi menjadi bentuk 3D (diatur oleh pengguna) dan kemudian ditambahkan ke adegan saat ini dalam tampilan 3D.
Semua operasi pemrosesan memanfaatkan kode yang sama tetapi dapat disebut secara berbeda (atau beberapa kali) tergantung pada mode yang menghadap pengguna yang berlaku.
Gambar diperoleh untuk diproses. Sumber gambar tidak penting selama itu adalah gambar standar, iOS/ipados-dibaca. Sumber gambar yang paling umum kemungkinan besar adalah kamera Live View. Sumber lain adalah album foto dan bingkai video.
Gambar berikut adalah sumber untuk pemrosesan. (Ini adalah gambar yang saya ambil dari kebun kami di awal musim dingin.)

Mengingat biaya kinerja mengonversi gambar, pengguna memiliki opsi untuk mengurangi jumlah pekerjaan yang dilakukan dengan membuat gambar sumber mengubah ukuran ke ukuran yang lebih kecil. Ini juga dapat terjadi tanpa intervensi pengguna jika video diproses. (Memproses video cenderung mengambil banyak memori, jadi bahkan menghemat beberapa persen per gambar akan membantu menjaga hal -hal yang tidak terlalu menegangkan pada sistem.) Beberapa gambar juga diputar ke 270 ° (atau -90 ° jika Anda lebih suka) dan perlu diputar dengan benar. Ini juga dilakukan pada langkah pengkondisian gambar.
Gambar yang diproses kemudian pixellated melalui fungsi filter gambar inti. Secara khusus, penggunaan blockcam filter yang paling umum adalah CIPixellate (meskipun filter pixellation lainnya digunakan tergantung pada bentuk akhir). Ukuran setiap wilayah pixellated tergantung pada pengaturan pengguna. Semakin kecil ukurannya, semakin besar dampaknya pada kinerja keseluruhan, meskipun CIPixellate (dan seperti filter) masih sangat cepat. Alasan mengapa daerah pixellated yang lebih kecil meningkatkan kinerja adalah karena lebih banyak node 3D akan diperlukan nanti.
Gambar berikut menunjukkan pixellation dari gambar asli. Perhatikan bahwa setiap daerah pixellated adalah warna solid, yang berarti blockcam tidak harus membaca seluruh wilayah untuk mendapatkan warnanya - hanya satu piksel.

Gambar pixellated kemudian diuraikan. Ini mensyaratkan mendapatkan warna dari setiap wilayah pixellated. Ini adalah langkah yang lebih lambat dari yang diharapkan. Mendapatkan data piksel individu dari suatu gambar membutuhkan banyak manipulasi data gambar hanya untuk membuat gambar siap ditanya. Di akhir langkah ini, gambar tidak lagi digunakan. Array 2D data warna diteruskan ke langkah berikutnya.
Pada langkah ini, data gambar pixellated disimpan ke penyimpanan file lokal. Ini untuk menyederhanakan perubahan visual minor yang kemudian diminta oleh pengguna.
Bentuk simpul akhir adalah pengaturan pengguna. Blockcam memungkinkan pengguna untuk memilih dari salah satu dari banyak bentuk-bentuk bawaan cenderung berjalan lebih cepat daripada bentuk yang tidak dibangun (misalnya, bola lebih cepat daripada pentagon). Node 3D dihasilkan untuk setiap warna dari langkah parsing gambar menggunakan geometri yang ditentukan. Untuk memamerkan 3d-ness dari adegan terakhir, node dilebih-lebihkan di beberapa dimensi. Misalnya, jika kubus adalah bentuk yang dipilih oleh pengguna, panjangnya akan dibesar -besarkan. Berlebihan ditentukan oleh warna - warna digunakan untuk menaungi permukaan difus dari node serta untuk menentukan tinggi. Berlebihan ditentukan oleh penentu yang dapat dipilih pengguna:
Setelah sebuah node dibuat, ditambahkan ke node utama. Setelah semua node telah dibuat dan ditempatkan ke dalam node utama, node master itu sendiri ditempatkan ke adegan 3D.
Meskipun ini mungkin tampak merupakan langkah sepele, ini sangat rumit ketika mengonversi video. Jika mengonversi gambar, yang terjadi adalah adegan 3D diperbarui dan akhirnya ditunjukkan kepada pengguna (biasanya dalam 0,5 hingga 2,0 detik). Untuk video, sangat penting untuk mendapatkan waktu tampilan yang tepat: untuk mengonversi video, setiap bingkai dijalankan melalui langkah -langkah ini dan kemudian snapshot diambil dari adegan 3D. Jika snapshot diambil sebelum adegan ditampilkan, hasilnya akan menjadi gambar hitam murni, yang bukan yang ingin dilihat pengguna. Oleh karena itu, blockcam harus berpartisipasi dalam serangkaian fungsi SCNSceneRendererDelegate untuk mengetahui kapan adegan benar -benar terlihat oleh pengguna.
Gambar berikut adalah versi final yang diproses dari gambar. Ini adalah output dari panggilan snapshot() pada SCNView. Sampel menggunakan blok diekstrusi dan sedang dilihat dalam orientasi kamera default.

Setelah gambar ditampilkan, pengguna memiliki opsi untuk menyimpannya sebagaimana adanya atau mengedit beberapa aspek visual atau memutar atau memperbesar atau memperkecil, dan kemudian menyimpannya (lagi, mungkin). Untuk video, setelah snapshot dari adegan 3D ditangkap, adegan dibuang.
Bergantung pada nilai .SaveOriginalImageAction , gambar asli akan disimpan. Ketika pengguna menyimpan gambar yang diproses, metadata disimpan bersama dengan gambar yang diproses. Metadata terdiri dari nama dan versi program serta parameter yang berlaku ketika gambar dibuat.
Menyimpan file yang diproses adalah proses multi-langkah:
/Scratch sebagai file .jpg standar..jpg ).PHAssetCreationRequest dengan set parameter yang sesuai - ini diperlukan karena metode yang lebih umum untuk memindahkan gambar ke data roll photo strip exif)./Scratch .BlockCam menyimpan metadata dalam file yang diproses.
| Kelompok | Menandai | Nilai tersimpan |
|---|---|---|
| BERTENGKAR | Artis | Jika diaktifkan oleh pengguna, nama pengguna. |
| BERTENGKAR | Hak cipta | Jika diaktifkan oleh pengguna, string hak cipta pengguna. |
| BERTENGKAR | Perangkat lunak | Nama, Versi, dan Bangun Nomor Blockcam. |
| Exif | Usercomment | Daftar parameter yang digunakan untuk menghasilkan gambar yang diproses. |
Lihat juga diskusi privasi.
Diagram aliran yang disederhanakan untuk pemrosesan gambar ditunjukkan di bawah ini.

Karena jumlah waktu yang diperlukan untuk melakukan preprocess dan pixellate gambar, setiap kali gambar baru diproses, data pixellation (terdiri dari serangkaian warna) disimpan ke sistem file perangkat. Jika pengguna kemudian mengubah parameter (seperti bentuk 3D), preprocessing telah selesai dan data pixellation digunakan kembali. Ini berpotensi menghemat banyak waktu.
Jika pengguna mengubah parameter yang mempengaruhi preprocessing, gambar diproses ulang dari awal. (Misalnya, mengubah ukuran blok akan menyebabkan siklus pemrosesan ulang penuh dieksekusi.)
Diagram aliran yang disederhanakan untuk pemrosesan video ditunjukkan di bawah ini. Kubus mengacu kembali ke aliran gambar.

Saat ini, kotak hijau ("bingkai olahan") tidak berfungsi seperti yang diharapkan/dibutuhkan sehingga saat ini penulisan, pembuatan video tidak didukung.
BlockCam mencatat pesan dan status saat runtime ke konsol debug (jika ada, dan dalam sebagian besar contoh, ini tidak akan ada) dan ke database SQLite lokal. Ini memungkinkan untuk debugging post-mortem jika perlu muncul.
Mengingat kebijakan Apple tentang penyewaan data (belum lagi kebijakan Uni Eropa), kemungkinan besar logging akan dihapus (melalui bendera waktu kompilasi) untuk versi blockcam yang dirilis.
Semua pengaturan pengguna (dan beberapa pengaturan proses) disimpan melalui kelas Settings . Kelas ini merangkum mekanisme penyimpanan yang tidak terlihat oleh sisa program. Saat ini, mekanisme penyimpanan adalah UserDefaults . Jika pengaturan menjadi lebih kompleks, mudah untuk memigrasi ini ke database.
Untuk mengakses pengaturan, penelepon harus menggunakan metode yang disediakan dari kelas Settings . Ini membantu memastikan integritas tipe data.
Kelas Settings juga menyediakan pemberitahuan perubahan tingkat pengaturan (yang merupakan alasan utama untuk membuat kelas di tempat pertama).
Pengaturan blokcam disajikan di bawah ini.
| Simbol | Jenis | Bawaan | Penggunaan |
|---|---|---|---|
| .Inisialisasi | Rangkaian | "Diinisialisasi" | Bendera yang menentukan apakah pengaturan telah diinisialisasi atau tidak. Ketika blockcam pertama kali berjalan, jika .Initialized adalah nil atau kosong, itu mengasumsikan itu adalah pertama kalinya blockcam telah dijalankan dan karenanya menulis nilai default untuk semua pengaturan. |
| .BlockSize | Bilangan bulat | 48 | Ukuran blok untuk pemrosesan gambar. Ini adalah ukuran kuadrat dari setiap wilayah pixellated. |
| .Shapetype | Rangkaian | "Blok" | Sama dari objek 3D di setiap wilayah pixellation. Dilemparkan dari enum. |
| .Dalam | Boolean | PALSU | Bendera penentuan tinggi/ukuran invert. |
| .HeightSource | Rangkaian | "Kecerahan" | Saluran warna yang akan digunakan untuk menentukan tinggi/ukuran. Dilemparkan dari enum. |
| .ImageSizeConstraints | Rangkaian | "Sedang" | Menentukan jumlah pengurangan ukuran gambar yang harus dilakukan sebelum memprosesnya karena alasan kinerja. Dilemparkan dari enum. Nilai aktual ditafsirkan pada waktu lari. |
| .VerticalExageration | Rangkaian | "Sedang" | Jumlah berlebihan vertikal untuk dilakukan saat mengekstrusi atau memperbesar bentuk 3D. Dilemparkan dari enum. |
| .Dipquality | Bilangan bulat | 2 | Nilai yang menunjukkan kualitas input. Berkisar dari 0 hingga 3 dengan 3 menjadi kualitas tertinggi (dan paling lambat untuk diproses). |
| .Currentcamera | Rangkaian | "Kembali" | Posisi kamera terakhir yang digunakan. Baik depan atau belakang. Dilemparkan dari enum. |
| .Lightcolor | Rangkaian | "Putih" | Nama warna cahaya. Dilemparkan dari enum. Dapat dikonversi ke jenis warna pustaka warna nanti. |
| .LightType | Rangkaian | "Omni" | Nama jenis cahaya yang digunakan untuk menerangi pemandangan. Dilemparkan dari enum. |
| .LightIntensity | Rangkaian | "Normal" | Intensitas cahaya yang digunakan untuk menerangi pemandangan. Nilai aktual ditentukan saat runtime. Dilemparkan dari enum. |
| .FieldOfView | Rangkaian | "Normal" | Bidang pandang kamera. Nilai aktual ditentukan saat runtime. Dilemparkan dari enum. |
| .Showhistogram | Boolean | PALSU | Tunjukkan tampilan histogram. Saat ini tidak diimplementasikan. |
| .HistogrambucketCount | Bilangan bulat | 256 | Jumlah warna dalam layar histogram. Saat ini tidak diimplementasikan. |
| .Initialview | Rangkaian | "Liveview" | Tampilan terakhir yang dilihat oleh pengguna (seperti tampilan live, album, dll). |
| .Duly Extrudeletters | Boolean | BENAR | Menentukan apakah huruf diekstrusi sepenuhnya atau hanya sebagian diekstrusi. |
| .Lettersmoothness | Rangkaian | "Mulus" | Menentukan seberapa lancar untuk membuat kurva dalam huruf. Kurva berkualitas tinggi datang dengan biaya kinerja yang besar. Nilai aktual ditentukan saat runtime. Dilemparkan dari enum. |
| .Tterfont | Rangkaian | "Futura" | Font (dan bobot opsional) untuk digunakan untuk membuat huruf diekstrusi. Jika font tidak ada pada sistem, Blockcam akan memasuki keadaan yang tidak ditentukan. |
| .Randomcharactersource | Rangkaian | "Latin" | Bernama rentang karakter Unicode untuk digunakan sebagai sumber untuk huruf acak saat mengekstrusi karakter. Berbagai rentang dapat ditentukan dengan memisahkan masing -masing dari yang lain dengan koma. |
| .Videofps | Bilangan bulat | 1 | Tidak digunakan saat ini. |
| .Videodimensi | Rangkaian | "Terkecil" | Menentukan ukuran video akhir saat menghasilkan video. Nilai aktual ditentukan saat runtime. Dilemparkan dari enum. |
| .VideoBlockSize | Bilangan bulat | 48 | Ukuran blok untuk pemrosesan video. Ini adalah ukuran kuadrat dari setiap wilayah pixellated. |
| .Usemetal | Boolean | BENAR | Bendera yang memberi tahu Blockcam untuk menggunakan logam daripada OpenGL. |
| .AntialiasingMode | Bilangan bulat | 0 | Menentukan mode antialiasing. |
| .Initialbestfit | Boolean | PALSU | Jika benar, Blockcam akan mencoba memasukkan semua node ke dalam tampilan dengan seketat mungkin. |
| .SaveoriginalimageAction | Rangkaian | "Selalu" | Menentukan bagaimana dan kapan menyimpan gambar asli. Dilemparkan dari enum. |
| .NextSeStiensialInteger | Bilangan bulat | 0 | Digunakan untuk pembuatan nama file. |
| .LoopSequentialIntegerAfter | Bilangan bulat | 9999 | Menentukan kapan harus mengulang ke awal saat menggunakan bilangan bulat berurutan. |
| .StartSeSetensialIntegerat | Bilangan bulat | 1 | Nilai awal untuk bilangan bulat berurutan. |
| .Screasestarapex dengan prominensi | Boolean | PALSU | Jika benar, jumlah apeks untuk bentuk bintang meningkat dengan keunggulan tinggi warna. |
| .StarapexCount | Bilangan bulat | 5 | Jumlah puncak untuk bintang. Jika .IncreaseStarApexesWithProminence itu benar, ini adalah jumlah awal apeks. |
| .Haltwhencriticalthermal | Boolean | BENAR | Jika benar, Blockcam akan berhenti (melalui panggilan fatalError ) saat menerima peringatan termal kritis. Ini mungkin melanggar pedoman Apple dan dapat dihapus. |
| .Haltonlowpower | Boolean | BENAR | Jika benar, Blockcam akan berhenti (melalui panggilan fatalError ) saat menerima peringatan daya rendah. Ini mungkin melanggar pedoman Apple dan dapat dihapus. |
| .Bestfitoffset | Dobel | 2.0 | Nilai untuk digunakan untuk mengusir kamera ketika .InitialBestFit benar untuk memberikan sedikit lebih banyak ruang negatif pada gambar. |
| .LightingModel | Rangkaian | "Phong" | Model pencahayaan bahan permukaan. Dilemparkan dari enum. |
| .CappedlineBallLocation | Rangkaian | "Atas" | Lokasi bola ("tutup") untuk node berbentuk cappedline. Dilemparkan dari enum. |
| .Loggingenabled | Boolean | PALSU | Aktifkan bendera logging. |
| .Fontsize | Bilangan bulat | 36 | Ukuran font untuk huruf yang diekstrusi. |
| .EnableUisounds | Boolean | BENAR | Bendera untuk memutar suara UI (seperti saat tombol ditekan). Jika nilai ini false , semua bendera suara lainnya diabaikan. |
| .Enableshuttersound | Boolean | PALSU | Bendera untuk memutar suara rana saat tombol kamera ditekan. Di beberapa lokasi geografis, ini selalu terjadi dan menetapkan nilai ini tidak akan berpengaruh. |
| .EnableImageprocessingSound | Boolean | BENAR | Bendera untuk memainkan suara di awal dan akhir pemrosesan gambar. Karena pemrosesan gambar memakan waktu, ini membantu pengguna memahami ketika gambar selesai. |
| .Enablevideorecordingsound | Boolean | BENAR | Bendera untuk memutar suara saat pengguna mulai dan berhenti merekam video. |
| .EnableButtonpresssounds | Boolean | BENAR | Bendera untuk memutar suara saat pengguna menekan tombol. |
| .EnableOptionSoundsounds | Boolean | BENAR | Bendera untuk memutar suara saat pengguna memilih opsi di layar pengaturan di layar. |
| .Enablecrashsounds | Boolean | PALSU | Bendera untuk memutar suara saat dialog crash ditampilkan. Diaktifkan hanya jika disusun dalam mode #Debug . |
| .MeshDotSize | Rangkaian | "Sedang" | Ukuran titik tengah untuk jerat. Jika .None Tidak ada yang digunakan, tidak ada titik tengah yang akan ditampilkan. Dilemparkan dari enum. |
| .Meshlinethickness | Rangkaian | "Sedang" | Ketebalan garis mesh. Dilemparkan dari enum. |
| .Radiatinglinethickness | Rangkaian | "Sedang" | Ketebalan bentuk garis yang memancar. Dilemparkan dari enum. |
| .Radiatinglinecount | Bilangan bulat | 8 | Jumlah garis yang memancar dalam bentuk garis yang memancar. 4 adalah untuk garis yang menunjuk ke arah kardinal, 8 untuk arah kardinal dan di antara, dan 16 untuk 8 lebih banyak baris dalam z-plane. |
| .Blockchamfersize | Rangkaian | "Tidak ada" | Radius chamfer/kelancaran tepi untuk bentuk blok. Dilemparkan dari enum. |
| .Maximagedimension | Bilangan bulat | 1024 | Dimensi maksimum suatu gambar. Jika suatu gambar untuk diproses lebih besar, itu akan diubah ukurannya sedemikian rupa sehingga dimensi terpanjang adalah nilai ini. |
| .AdduserDatoexif | Boolean | PALSU | Bendera untuk menambahkan informasi yang dibuat pengguna ke blok EXIF gambar yang diproses. Jika dikompilasi dalam mode #Debug, nilai ini default ke True. |
| .Nama belakang | Rangkaian | "" | (Default kosong.) Nama yang disediakan pengguna yang ditambahkan ke blok EXIF gambar yang diproses. Ini terjadi hanya jika .AddUserDataToExif itu benar. Jika dikompilasi dalam mode #Debug, nilai ini default ke "Stuart Rankin". |
| .Sercopyright | Rangkaian | "" | (Default kosong.) String hak cipta yang disediakan pengguna yang ditambahkan ke blok exif olahan gambar. Ini terjadi hanya jika .AddUserDataToExif itu benar. Jika dikompilasi dalam mode #Debug, nilai ini default ke "Atribusi 3.0 tidak diportir (CC dengan 3.0)". |
| .Coneisinverted | Boolean | BENAR | Menentukan apakah bentuk kerucut terbalik dalam hal kedalaman z. |
| .Conetopoptions | Rangkaian | .TopIsZero .rawvalue | Opsi untuk menentukan jari -jari atas kerucut. |
| .ConebaseOptions | Rangkaian | .BaseIsSide .rawvalue | Opsi untuk menentukan jari -jari dasar kerucut. |
| .Showsplashscreen | Boolean | BENAR | Bendera yang menentukan apakah layar splash ditampilkan saat memulai atau tidak. |
| .Hueshapelist | Rangkaian | "" | Daftar Bentuk untuk Jenis Bentuk Varian Hue. |
| .Saturasi. Distist | Rangkaian | "" | Daftar bentuk untuk jenis bentuk varian saturasi. |
| .BrightnessShapelist | Rangkaian | "" | Daftar bentuk untuk jenis bentuk varian kecerahan. |
BlockCam menggunakan pemrosesan 3D, yang melatih chip grafis perangkat. Jika pengguna menentukan pengaturan kualitas tertinggi, ada kemungkinan kondisi ekstrem tertentu dapat terjadi. Untuk membantu melestarikan perangkat dari kerusakan, pengaturan tersedia untuk membatalkan eksekusi blockcam saat itu terjadi.
| Peristiwa | Tindakan | Pengaturan Pengendalian |
|---|---|---|
| Panas | Jika peristiwa termal mencapai tahap kritis (secara harfiah .critical dalam pemberitahuan), jika pengaturannya true , kesalahan fatal akan dihasilkan untuk mengurangi tegangan termal yang dibuat oleh blockcam. | .HaltWhenTooHot |
| Baterai | Jika baterai memasuki status daya rendah, jika pengaturannya true , kesalahan fatal akan dihasilkan untuk membantu menjaga masa pakai baterai sebelum mengisi ulang. | .HaltOnLowPower |
Blockcam mendukung visual berikut:
Bentuk berikut saat ini didukung (atau direncanakan untuk didukung) untuk efek ekstrusi:
| Membentuk | Warga asli | Catatan |
|---|---|---|
| Blok | Ya - SCNBox | Bentuk kotak asli diperpanjang di sepanjang sumbu z. |
| Segitiga | TIDAK | Bentuk segitiga sama sisi kustom. |
| Pentagon | TIDAK | Bentuk Pentagon Puilateral Kustom. |
| Hexagons | TIDAK | Bentuk heksagonal seimbang kustom. |
| Octogons | TIDAK | Bentuk segigi seimbang kustom. |
| Piramida | Ya - SCNPyramid | Bentuk piramida asli. |
| Toroids | Ya - SCNTorus | Bentuk torus asli. |
| Silinder | Ya - SCNCylinder | Bentuk silinder asli - membuat lingkaran tinggi yang bagus. |
| Bola | Ya - SCNSphere | Bentuk bola asli. |
| Kapsul | Ya - SCNCapsule | Bentuk kapsul asli. Tidak semenarik kedengarannya. |
| Tetrahedron | TIDAK | Solid tetrahedron seimbang kustom. |
| Bintang | TIDAK | Bentuk bintang khusus (dengan apeks yang sama secara radial). Dapat memvariasikan jumlah apeks. |
| Gabungan forrgb | Ya - Kombinasi | Combined Sphere, Torus, dan Capsule. |
| Gabungan forhsb | Ya - Kombinasi | Combined Sphere, Torus, dan Capsule. |
| Jerat | TIDAK | Saat ini tidak diimplementasikan. |
| Surat | Ya SCNText | Teks diekstrusi asli. Cenderung sangat lambat, terutama dengan huruf non-Latin. |
| Baris | Ya - SCNCapsule | Bentuk kapsul yang sangat tipis. |
| Cappedlines | Ya - Kombinasi | Bentuk kapsul yang sangat tipis dengan bola yang ditempatkan di bagian atas, tengah, atau bawah garis tergantung pada pengaturan pengguna. |
| Memancarkan garis | Ya - Kombinasi | Beberapa garis yang memancar dari titik tengah. Pengguna dapat menentukan berapa banyak baris. Ini adalah bentuk kinerja yang berat. |
| Huevarying | varian | Bentuk pada titik tertentu ditentukan oleh rona daerah pixellated sehingga bentuk akhir yang sebenarnya akan bervariasi. |
| Saturationvarying | varian | Bentuk pada titik tertentu ditentukan oleh saturasi daerah pixellated sehingga bentuk akhir yang sebenarnya akan bervariasi. |
| Kecerahan | varian | Bentuk pada titik tertentu ditentukan oleh kecerahan daerah pixellated sehingga bentuk akhir yang sebenarnya akan bervariasi. |
Setiap bentuk untuk daerah pixellated representatif diekstrusi atau diperbesar. Penentuan kedalaman ekstrusi atau ukuran yang diperbesar tergantung pada warna daerah pixellated.
| Saluran warna | Penggunaan |
|---|---|
| Warna | Rona warna menentukan kedalaman/ukuran objek 3D. Perhatikan bahwa nilai rona bersifat siklis (dengan 0,0 pada dasarnya sama dengan 1.0) sehingga piksel kemerahan cenderung ditundukkan saat hijau disorot. |
| Kejenuhan | Nilai saturasi warna menentukan kedalaman/ukuran. Warna yang lebih cerah akan lebih besar. |
| Kecerahan | Kecerahan warna menentukan kedalaman/ukuran. Ini adalah nilai default dan bagaimana kebanyakan orang akan mengharapkan program untuk bekerja. |
| Merah | Saluran merah digunakan untuk menentukan kedalaman/ukuran. |
| Hijau | Saluran hijau digunakan untuk menentukan kedalaman/ukuran. |
| Biru | Saluran biru digunakan untuk menentukan kedalaman/ukuran. |
| Cyan | Saluran cyan sintetis (dari CMYK) digunakan untuk menentukan kedalaman/ukuran. |
| Magenta | Saluran magenta sintetis (dari CMYK) digunakan untuk menentukan kedalaman/ukuran. |
| Kuning | Saluran kuning sintetis (dari CMYK) digunakan untuk menentukan kedalaman/ukuran. |
| Hitam | Saluran hitam sintetis (dari CMYK) digunakan untuk menentukan kedalaman/ukuran. |
| YUV: Y. | Saluran Y sintetis dari konversi YUV. |
| YUV: U. | Saluran U sintetis dari konversi YUV. |
| Yuv: v | Saluran V sintetis dari konversi YUV. |
Blockcam mendukung bendera terbalik. Ini berarti jika pengguna menetapkan Invert, kedalaman/ukuran adalah resiprokol dari dirinya sendiri, membuat area gelap menonjol dan area terang ditundukkan atau disembunyikan.
Blockcam mendukung mengubah warna cahaya serta jenis cahaya. Warna saat ini terbatas pada satu set kecil warna yang telah ditentukan sebelumnya. Jenis-jenis lampu paralel standard, lampu non-parametisasi (seperti .omni dan .spot ).
Posisi cahaya saat ini tidak dapat disesuaikan oleh pengguna.
BlockCam memanfaatkan bendera SCNView allowsCameraControl SCNView untuk membiarkan pengguna memperbesar, shink, atau putar (dalam tiga sumbu) melalui gerakan.
Ketika awalnya diterjemahkan, hasilnya mungkin tampak relatif jauh dari pandangan. Blockcam memiliki bendera yang dapat diselesaikan pengguna agar sesuai dengan gambar ke tampilan. Fitur ini cenderung membingungkan allowsCameraControl sehubungan dengan memperbesar dan menyusut.
Bagian ini akan membahas berbagai detail tingkat implementasi.
Blockcam ditulis dalam Swift 5 dengan Xcode 11.3.
Mengingat jumlah waktu yang lama yang diperlukan untuk memproses gambar, semua pemrosesan gambar dilakukan pada utas latar belakang. Ini mengharuskan semua komunikasi untuk memperbarui pengguna melalui UI untuk dilakukan dengan panggilan threading yang tepat.
Tbd
Blockcam adalah Hak Cipta © 2019, 2020 oleh Stuart Rankin
日本語版 «Google 翻訳で翻訳»
3d ブロックカメラ
Blockcam は iOS および ipados 用のカメラプログラムで、 avfoundation を介して画像を取得し、それらの画像を単純な 3d シーンに変換します。シーンは、ユーザーによって回転および拡大縮小され、フラットイメージとして保存されます。
Blockcam は Stuart Rankin によって作成されました。
Blockcam のバージョン管理はVersioning.swiftファイルで管理され、ビルド前のスクリプトステップとしてビルドごとに自動的に更新されます。 更新にはビルド id 、ビルド番号、時刻、日付が含まれますが、現在、バージョン番号は手動で更新する必要があります。 以下の現在のビルド文字列も同じメカニズムによって維持されます。
現在、バージョン管理プログラムは blockcam プロジェクトファイルのバージョン番号を更新しません。
最新のビルド : バージョン情報については、英語のセクションを参照してください。
バージョンとビルドの更新方法については、 Github の [VersionUpdater] (https://github.com/sjrankin/versionupdater )リポジトリを参照してください。
Blockcam は、可能な限りユーザーが提供する情報を含むように設計されています。 ユーザーを特定できる情報が使用されるたびに、 blockcam はそれを明示的に要求します。 設計上、 blockcam はデフォルトでユーザーを特定できる情報を収集しません。 ユーザーは、このタイプの情報の収集を許可するためにアクティブな手順を実行する必要があります。
| 識別情報 | 使用 | 保管 |
|---|---|---|
| ユーザー名 | 処理された画像のメタデータに保存されるユーザーの名前(ユーザーが入力)。 | 「UserDefaults 」に保存されます。 |
| ユーザー著作権 | 処理された画像メタデータに保存されるユーザーの著作権文字列(ユーザーが入力)。 | 「UserDefaults 」に保存されます。 |
ユーザーが blockcam をインスタンス化すると、ライブビューモードで開きます(メイン画面にカメラのビューを表示)。ユーザーには、次の 3 つのモードのいずれかを選択するオプションがあります。
Blockcam は、次のプラットフォームでテストされています。
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は、処理されたファイルにメタデータを保存します。
| グループ | タグ | 保存された値 |
|---|---|---|
| BERTENGKAR | アーティスト | ユーザーが有効にした場合、ユーザーの名前。 |
| BERTENGKAR | 著作権 | ユーザーが有効にした場合、ユーザーの著作権文字列。 |
| BERTENGKAR | ソフトウェア | BlockCamの名前、バージョン、ビルド番号。 |
| Exif | UserComment | 処理済み画像の生成に使用されるパラメーターのリスト。 |
画像の前処理とピクセル化には時間がかかるため、新しい画像が処理されるたびに、ピクセル化データ(色の配列で構成される)がデバイスのファイルシステムに保存されます。 その後、ユーザーがパラメーター(3D形状など)を変更した場合、前処理は既に完了しており、ピクセル化データは再利用されます。 これにより、大幅に時間を節約できる可能性があります。
ユーザーが前処理に影響するパラメーターを変更すると、画像は最初から再処理されます。 (たとえば、ブロックサイズを変更すると、完全な再処理サイクルが実行されます。)
BlockCamは、実行時のメッセージとステータスをデバッグコンソール(存在する場合、大部分のインスタンスでは存在しない)とローカルSQLiteデータベースに記録します。 これにより 必要が生じた場合の事後デバッグ。
Appleのデータ保持に関するポリシー(EUのポリシーは言うまでもありません)を考えると、BlockCamのすべてのリリースバージョンのログは(コンパイル時フラグを介して)削除される可能性が高いです。
すべてのユーザー設定(およびいくつかのプロセス設定)は、 Settingsクラスを介して保存されます。 このクラスは、プログラムの残りの部分からは見えないストレージメカニズムをカプセル化します。 現在、ストレージメカニズムはUserDefaultsです。 設定がより複雑になった場合、これをデータベースに移行するのは簡単です。
設定にアクセスするには、呼び出し側はSettingsクラスの提供されたメソッドを使用する必要があります。 これにより、データ型の整合性を確保できます。
Settingsクラスは設定レベルの変更通知も提供します(これが最初にクラスを作成する主な理由でした)。
BlockCamの設定を以下に示します。
| 記号 | タイプ | デフォルト | 使用法 |
|---|---|---|---|
| .Initialized | Rangkaian | "Initialized" | 設定が初期化されたかどうかを決定するフラグ。 BlockCamが最初に実行されるときに、 .Initializedがnilまたは空の場合、BlockCamが最初に実行されたと想定されるため、すべての設定のデフォルト値を書き込みます。 |
| .BlockSize | 整数 | 48 | 画像処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .ShapeType | Rangkaian | "Blocks" | 各ピクセル化領域の3Dオブジェクトと同じ。列挙型からキャストします。 |
| .InvertHeight | Boolean | PALSU | 反転高さ/サイズ決定フラグ。 |
| .HeightSource | Rangkaian | "Kecerahan" | 高さ/サイズを決定するために使用するカラーチャンネル。列挙型からキャストします。 |
| .ImageSizeConstraints | Rangkaian | "Sedang" | パフォーマンス上の理由から、処理する前に行う画像のサイズの縮小量を決定します。列挙型からキャストします。実行時に解釈される実際の値。 |
| .VerticalExaggeration | Rangkaian | "Sedang" | 3D形状を押し出しまたは拡大するときに実行する垂直方向の誇張の量。列挙型からキャストします。 |
| .InputQuality | Bilangan bulat | 2 | 入力品質を示す値。 0から3の範囲で、3が最高品質(および処理が最も遅い)です。 |
| .CurrentCamera | Rangkaian | "Kembali" | 最後に使用したカメラの位置。前面または背面。列挙型からキャストします。 |
| .LightColor | Rangkaian | "Putih" | ライトの色の名前。列挙型からキャストします。後でカラーライブラリタイプの色に変換できます。 |
| .LightType | Rangkaian | "Omni" | シーンの照明に使用されるライトのタイプの名前。列挙型からキャストします。 |
| .LightIntensity | Rangkaian | "Normal" | シーンを照らすために使用される光の強度。実行時に決定される実際の値。列挙型からキャストします。 |
| .FieldOfView | Rangkaian | "Normal" | カメラの視野。実際の値は実行時に決定されます。列挙型からキャストします。 |
| .ShowHistogram | Boolean | PALSU | ヒストグラム表示を表示します。現在実装されていません。 |
| .HistogramBucketCount | 整数 | 256 | ヒストグラム表示の色数。現在実装されていません。 |
| .InitialView | Rangkaian | "LiveView" | ユーザーが最後に表示したビュー(ライブビュー、アルバムなど)。 |
| .FullyExtrudeLetters | Boolean | BENAR | 文字が完全に押し出されるか、部分的にのみ押し出されるかを決定します。 |
| .LetterSmoothness | Rangkaian | "Mulus" | 文字の曲線をどれだけスムーズに作成するかを決定します。高品質の曲線には、大きなパフォーマンスコストがかかります。実行時に決定される実際の値。列挙型からキャストします。 |
| .LetterFont | Rangkaian | "Futura" | 押し出された文字のレンダリングに使用するフォント(およびオプションの太さ)。フォントがシステムに存在しない場合、BlockCamは未定義の状態に入ります。 |
| .RandomCharacterSource | Rangkaian | "Latin" | 文字を押し出すときにランダムな文字のソースとして使用する名前付きUnicode範囲。複数の範囲を指定するには、それぞれをコンマで区切ります。 |
| .VideoFPS | 整数 | 1 | 現在使用されていません。 |
| .VideoDimensions | Rangkaian | "Smallest" | ビデオを生成するときの最終的なビデオサイズを決定します。実行時に決定される実際の値。列挙型からキャストします。 |
| .VideoBlockSize | 整数 | 48 | ビデオ処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .UseMetal | Boolean | BENAR | OpenGLではなくMetalを使用するようにBlockCamに指示するフラグ。 |
| .AntialiasingMode | 整数 | 0 | アンチエイリアスモードを決定します。 |
| .InitialBestFit | Boolean | PALSU | trueの場合、BlockCamは、すべてのノードをビューにできるだけ厳密に合わせようとします。 |
| .SaveOriginalImageAction | Rangkaian | "Selalu" | 元の画像を保存する方法とタイミングを決定します。列挙型からキャストします。 |
| .NextSequentialInteger | Bilangan bulat | 0 | ファイル名の生成に使用。 |
| .LoopSequentialIntegerAfter | Bilangan bulat | 9999 | 連続する整数を使用する場合、いつループを開始するかを決定します。 |
| .StartSequentialIntegerAt | Bilangan bulat | 1 | 連続整数の開始値。 |
| .IncreaseStarApexesWithProminence | Boolean | PALSU | trueの場合、星形の頂点の数は色の高さが顕著になるにつれて増加します。 |
| .StarApexCount | 整数 | 5 | 星の頂点の数。 .IncreaseStarApexesWithProminenceがtrueの場合、これは頂点の開始数です。 |
| .HaltWhenCriticalThermal | Boolean | BENAR | trueの場合、BlockCamは重大な温度アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .HaltOnLowPower | Boolean | BENAR | trueの場合、BlockCamは低電力アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .BestFitOffset | Dobel | 2.0 | .InitialBestFitがtrueの場合にカメラを後退させて、画像にもう少しネガティブなスペースを与えるために使用する値。 |
| .LightingModel | Rangkaian | "Phong" | 表面マテリアル照明モデル。列挙型からキャストします。 |
| .CappedLineBallLocation | Rangkaian | "Atas" | CappedLine形状のノードのボール(「キャップ」)の位置。列挙型からキャストします。 |
| .LoggingEnabled | Boolean | PALSU | ロギングフラグを有効にします。 |
| .FontSize | 整数 | 36 | 押し出された文字のフォントサイズ。 |
| .EnableUISounds | Boolean | BENAR | Flagは、UIサウンドを再生します(ボタンが押されたときなど)。 この値が「false」の場合、他のすべてのサウンドフラグは無視されます。 |
| .EnableShutterSound | Boolean | PALSU | Flagは、カメラボタンが押されたときにシャッター音を再生します。 一部の地理的な場所では、これは常に発生し、この値を設定しても効果はありません。 |
| .EnableImageProcessingSound | Boolean | BENAR | Flagは、画像処理の開始時と終了時に音声を再生します。 画像処理には時間がかかるため、ユーザーは画像がいつ完成するかを理解するのに役立ちます。 |
| .EnableVideoRecordingSound | Boolean | BENAR | ユーザーがビデオの記録を開始および停止したときに音を再生するフラグ。 |
| .EnableButtonPressSounds | Boolean | BENAR | ユーザーがボタンを押したときに音を再生するフラグ。 |
| .EnableOptionSelectSounds | Boolean | BENAR | ユーザーが画面上の設定画面でオプションを選択したときに音を再生するフラグ。 |
| .EnableCrashSounds | Boolean | PALSU | フラグは、クラッシュダイアログが表示されたときにサウンドを再生します。 #DEBUGモードでコンパイルされた場合のみ有効です。 |
| .MeshDotSize | Rangkaian | "Sedang" | メッシュの中心ドットのサイズ。 .Noneが使用される場合、中央のドットは表示されません。 列挙型からキャストします。 |
| .MeshLineThickness | Rangkaian | "Sedang" | メッシュラインの太さ。 列挙型からキャストします。 |
| .RadiatingLineThickness | Rangkaian | "Sedang" | 放射線形状の太さ。 列挙型からキャストします。 |
| .RadiatingLineCount | 整数 | 8 | 放射ライン形状の放射ラインの数。 「4」は基線方向を指す線、「8」は基線方向とその中間、および「16」はz平面のさらに8本の線を示します。 |
| .BlockChamferSize | Rangkaian | "Tidak ada" | ブロック形状の面取り半径/エッジの滑らかさ。 列挙型からキャストします。 |
| .MaxImageDimension | 整数 | 1024 | 画像の最大寸法。 処理する画像が大きい場合、最長寸法がこの値になるようにサイズ変更されます。 |
| .AddUserDataToExif | Boolean | PALSU | Flagは、ユーザーが作成した情報を処理済み画像のExifブロックに追加します。 |
| .Nama belakang | Rangkaian | "" | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の名前。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します。 |
| .UserCopyright | Rangkaian | "" | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の著作権文字列。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します |
BlockCamは次のビジュアルをサポートしています。
現在、押し出し効果では次の形状がサポートされています(またはサポートされる予定です)。
| 形状 | ネイティブ | メモ |
|---|---|---|
| ブロック | はい- SCNBox | Z軸に沿って長くなったネイティブボックスの形状。 |
| 三角形 | いいえ | カスタム正三角形の形状。 |
| 五角形 | いいえ | カスタム正五角形。 |
| 六角形 | いいえ | カスタム正六角形。 |
| オクトゴン | いいえ | カスタム正八角形。 |
| ピラミッド | はい- SCNPyramid | ネイティブのピラミッド形状。 |
| トロイド | はい- SCNTorus | ネイティブトーラス形状。 |
| シリンダー | はい- SCNCylinder | 自然なシリンダー形状-すてきな高架円になります。 |
| 球 | はい- SCNSphere | ネイティブの球形。 |
| カプセル | はい- SCNCapsule | ネイティブカプセルの形状。聞こえるほど面白くない。 |
| 四面体 | いいえ | カスタム正四面体ソリッド。 |
| 星 | いいえ | カスタム星形(半径方向に等しい頂点を持つ)。頂点の数を変えることができます。 |
| CombinedForRGB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| CombinedForHSB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| メッシュ | いいえ | 現在実装されていません。 |
| レター | はい- SCNText | ネイティブの押し出しテキスト。特に非ラテン系のアルファベットでは、非常に遅くなる傾向があります。 |
| 行 | はい- SCNCapsule | 非常に薄いカプセル形状。 |
| CappedLines | はい-組み合わせ | ユーザー設定に応じて、行の上部、中間、または下部に球体を配置した非常に薄いカプセル形状。 |
| RadiatingLines | はい-組み合わせ | 中心点から放射状に広がる複数の線。 ユーザーは行数を指定できます。 これはパフォーマンス重視の形状です。 |
代表的なピクセル化領域の各形状は、押し出しまたは拡大されます。押し出しの深さまたは拡大サイズの決定は、ピクセル化された領域の色に依存します。
| カラーチャンネル | 使用方法 |
|---|---|
| Warna | 色の色相は、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の実行を中止する設定を使用できます。
| イベント | アクション | 設定の制御 |
|---|---|---|
| Panas | サーマルイベントがクリティカルステージ(通知では文字通り.critical )に達すると、設定がtrueの場合、BlockCamによって作成される熱ストレスを減らす致命的なエラーが生成されます。 | .HaltWhenTooHot |
| バッテリー | バッテリーが低電力状態になった場合、設定がtrueの場合、再充電前にバッテリーの寿命を保つために致命的なエラーが生成されます。 | .HaltOnLowPower |
BlockCamの著作権©2019, 2020 by Stuart Rankin