الكاميرا 3D بلوك
BlockCam هو برنامج كاميرا لنظام التشغيل iOS و iPados الذي يلتقط الصور عبر AvFoundation ثم يحول تلك الصور إلى مشاهد ثلاثية الأبعاد بسيطة. قد يتم تدوير المشاهد وتحجيمها بواسطة المستخدم ، وحفظها كصورة مسطحة.
كتب Blockcam بواسطة ستيوارت رانكين.
يتم الحفاظ على إصدار blockcam في ملف Versioning.swift swift ويتم تحديثه تلقائيًا مع كل بناء كخطوة نصية قبل الإنشاء. يتضمن التحديث معرفات الإنشاء وأرقام الإنشاء والأوقات والتواريخ ، ولكن يجب تحديث أرقام الإصدار حاليًا باليد. يتم الحفاظ على سلسلة الإنشاء الحالية أدناه أيضًا من خلال نفس الآلية.
لا يقوم برنامج الإصدار حاليًا بتحديث أرقام إصدار ملف BlockCam.
أحدث البناء: الإصدار 0.9 ألفا ، بناء 3287 ، تاريخ البناء: 13 يوليو 2021 ، 16:06
راجع مستودع VersionUpdater على GitHub للحصول على معلومات حول كيفية تحديث الإصدارات والبناء.
تم تصميم blockcam لاحتواء المعلومات التي يقدمها المستخدم قدر الإمكان. في أي وقت يتم استخدام معلومات قابلة للتحديد المستخدم ، ستطلب blockcam ذلك بشكل صريح. حسب التصميم ، لا يقوم blockcam بجمع أي معلومات يمكن تحديدها بشكل افتراضي ؛ يجب أن يتخذ المستخدم خطوات نشطة للسماح بجمع هذا النوع من المعلومات.
| معلومات محددة | يستخدم | تخزين |
|---|---|---|
| اسم المستخدم | اسم المستخدم (الذي أدخله المستخدم) ليتم تخزينه في بيانات تعريف الصور المصنعة. | مخزنة في UserDefaults . |
| مستخدم حقوق الطبع والنشر | يتم تخزين سلسلة حقوق الطبع والنشر الخاصة بالمستخدم (الذي أدخله المستخدم) في بيانات تعريف الصور المصنعة. | مخزنة في UserDefaults . |
عندما يقوم المستخدم بتأسيس blockcam ، فإنه يفتح في وضع العرض المباشر (يوضح عرض الكاميرا على الشاشة الرئيسية). لدى المستخدم خيار اختيار واحدة من ثلاثة أوضاع:
تم اختبار blockcam على المنصات التالية:
UIBezierPath لإضافة المزيد من الأشكال.هناك أربعة مخاوف تتعلق بالأداء لـ blockcam:
autoreleasepool ، تمت معالجة معظم المخاوف. إذا اتضح أن هذا غير كافٍ ، توجد خطة تخفيف: احفظ جميع صور الخدش إلى التخزين المحلي ، ثم اقرأها بشكل فردي ومعالجتها واحدة تلو الأخرى. هذا سيؤدي إلى إبطاء الأمور ولكن تقليل ضغط الذاكرة. يقوم BlockCam بتحويل كل صورة يتم التقاطها إلى صورة مصنوعة من cipixellate CIPixellate CoreImage. بعد pixellation ، تقوم خوارزمية المعالجة بعد ذلك بحساب الارتفاع المحدد - يحدد الارتفاع إما حجم العقدة أو بثق العقدة. بعد ذلك ، يتم تحويل كل بكسل من الصورة المصنوعة من البيكسل إلى شكل ثلاثي الأبعاد (يضبطه المستخدم) ثم تمت إضافته إلى المشهد الحالي في العرض ثلاثي الأبعاد.
تستفيد جميع عمليات المعالجة من نفس الرمز ولكن قد تسمى بشكل مختلف (أو عدة مرات) حسب وضع تواجه المستخدم ساريًا.
يتم الحصول على صورة للمعالجة. مصدر الصورة ليس مهمًا طالما أنها صورة قياسية قابلة للقراءة iOS/iPados. من المرجح أن يكون المصدر الأكثر شيوعًا للصور كاميرا العرض المباشر. مصادر أخرى هي ألبوم الصور وإطارات الفيديو.
الصورة التالية هي مصدر المعالجة. (هذه صورة التقطتها من حديقتنا في أوائل الشتاء.)

بالنظر إلى حساب أداء تحويل الصورة ، لدى المستخدم خيار تقليل مقدار العمل المنجز من خلال تغيير حجم الصورة المصدر إلى حجم أصغر. قد يحدث هذا أيضًا دون تدخل المستخدم في حالة معالجة مقاطع الفيديو. (تميل معالجة مقاطع الفيديو إلى الحصول على الكثير من الذاكرة ، لذا فإن توفير بضعة في المائة لكل صورة سيساعد على الحفاظ على الأمور أقل إرهاقًا على النظام.) يتم تدوير بعض الصور أيضًا إلى 270 درجة (أو -90 درجة إذا كنت تفضل) وتحتاج إلى تدويرها بشكل صحيح. ويتم ذلك أيضًا في خطوة تكييف الصور.
ثم يتم تصوير الصورة المصنعة عبر وظائف تصفية الصورة الأساسية. على وجه التحديد ، فإن استخدامات blockcam الأكثر شيوعًا هي CIPixellate (على الرغم من استخدام مرشحات pixellation الأخرى اعتمادًا على الشكل النهائي). يعتمد حجم كل منطقة على بيكسل على إعدادات المستخدم. كلما كان الحجم أصغر ، زاد التأثير على الأداء الكلي ، على الرغم من أن CIPixellate (ومثل المرشحات) لا يزال سريعًا للغاية. السبب في زيادة الأداء من المناطق الأصغر من البكسل هو أن المزيد من العقد ثلاثية الأبعاد ستكون مطلوبة لاحقًا.
تعرض الصورة التالية ثنائية الصورة الأصلية. لاحظ أن كل منطقة مصنوعة من البيكسل هي لون صلب ، مما يعني أنه لا يتعين على blockcam قراءة المنطقة بأكملها للحصول على اللون - فقط بكسل واحد.

ثم يتم تحليل الصورة المخصصة. هذا يستلزم الحصول على لون كل منطقة محددة. هذه خطوة أبطأ من المتوقع. يتطلب الحصول على بيانات البكسل الفردية من صورة قدرًا كبيرًا من معالجة بيانات الصورة فقط لإعداد الصورة للاستعلام. في نهاية هذه الخطوة ، لم تعد الصور تستخدم. يتم تمرير مجموعة ثنائية الأبعاد من بيانات الألوان إلى الخطوة التالية.
في هذه الخطوة ، يتم حفظ بيانات الصورة المخصصة لتخزين الملفات المحلية. هذا هو تبسيط التغييرات البصرية البسيطة التي يطلبها المستخدم لاحقًا.
شكل العقدة النهائي هو إعداد المستخدم. يتيح BlockCam للمستخدمين الاختيار من بين أحد الأشكال العديدة-تميل الأشكال المدمجة إلى التشغيل بشكل أسرع من الأشكال غير المبنية (على سبيل المثال ، تكون المجالات أسرع من Pentagons). يتم إنشاء عقدة ثلاثية الأبعاد لكل لون من خطوة تحليل الصورة باستخدام الهندسة المحددة. من أجل عرض ثلاثية الأبعاد للمشهد النهائي ، يتم المبالغة في العقد في بعض الأبعاد. على سبيل المثال ، إذا كانت المكعبات هي الشكل المحدد من قبل المستخدم ، فسيتم المبالغة في الطول. يتم تحديد المبالغة بواسطة اللون - يتم استخدام اللون لتظليل سطح المنتشر للعقدة وكذلك لتحديد الارتفاع. يتم تحديد المبالغة من قبل محدد محدد للمستخدم:
بمجرد إنشاء عقدة ، تتم إضافتها إلى عقدة رئيسية. بمجرد إنشاء جميع العقد ووضعها في العقدة الرئيسية ، يتم وضع العقدة الرئيسية نفسها في المشهد ثلاثي الأبعاد.
على الرغم من أن هذا قد يبدو خطوة تافهة ، إلا أنه أمر صعب للغاية عند تحويل مقاطع الفيديو. إذا تم تحويل صورة ما ، فكل ما يحدث هو تحديث المشهد ثلاثي الأبعاد وإظهاره في النهاية للمستخدم (عادةً ما يكون في غضون 0.5 إلى 2.0 ثانية). بالنسبة لمقاطع الفيديو ، من الأهمية بمكان الحصول على توقيت الشاشة بشكل صحيح: لتحويل مقطع فيديو ، يتم تشغيل كل إطار من خلال هذه الخطوات ثم يتم أخذ لقطة من المشهد ثلاثي الأبعاد. إذا تم التقاط اللقطة قبل عرض المشهد ، فستكون النتيجة صورة سوداء خالصة ، وهي ما لا يريد المستخدم رؤيته. لذلك ، يجب أن تشارك blockcam في مجموعة الوظائف SCNSceneRendererDelegate لمعرفة متى يكون المشهد مرئيًا للمستخدم بالفعل.
الصورة التالية هي النسخة النهائية المعالجة من الصورة. هذا هو إخراج snapshot() استدعاء على scnview. تستخدم العينة كتل مقذوفة ويتم عرضها في اتجاه الكاميرا الافتراضي.

بمجرد عرض الصورة ، يكون لدى المستخدم خيار حفظه كما هو أو تحرير بعض الجوانب المرئية أو تدوير أو تكبير أو خارج ، ثم حفظه (مرة أخرى ، ربما). بالنسبة لمقاطع الفيديو ، بمجرد التقاط لقطة للمشهد ثلاثي الأبعاد ، يتم التخلص من المشهد.
اعتمادًا على قيمة .SaveOriginalImageAction ، سيتم حفظ الصورة الأصلية. عندما يحفظ المستخدم الصورة المصنعة ، يتم حفظ البيانات الوصفية مع الصورة المصنعة. يتكون البيانات الوصفية من اسم البرنامج وإصداره بالإضافة إلى المعلمات السارية عند إنشاء الصورة.
إن حفظ الملفات المصنعة هو عملية متعددة الخطوات:
/Scratch كملف .jpg قياسي..jpg ).PHAssetCreationRequest مع مجموعة المعلمات المناسبة - هذا مطلوب لأن الطريقة الأكثر شيوعًا لنقل الصور إلى بيانات EXIF لفة الصور)./Scratch .Blockcam يحفظ البيانات الوصفية في الملفات المصنعة.
| مجموعة | علامة | القيم المخزنة |
|---|---|---|
| شجار | فنان | إذا تم تمكينه من قبل المستخدم ، فإن اسم المستخدم. |
| شجار | حقوق الطبع والنشر | إذا تم تمكينه من قبل المستخدم ، فإن سلسلة حقوق الطبع والنشر للمستخدم. |
| شجار | برمجة | اسم blockcam وأرقام البناء. |
| EXIF | Usercomment | قائمة المعلمات المستخدمة لإنشاء الصورة المعالجة. |
انظر أيضا مناقشة الخصوصية.
يظهر أدناه مخطط تدفق مبسط لمعالجة الصور أدناه.

نظرًا لمقدار الوقت الذي يستغرقه المعالجة المسبقة للمعالجة المسبقة ، يتم حفظ بيانات البيكسل (التي تتكون من مجموعة من الألوان) في كل مرة يتم فيها معالجة صورة جديدة ، ويتم حفظ بيانات التجزئة (التي تتكون من مجموعة من الألوان) في نظام ملفات الجهاز. إذا قام المستخدم بعد ذلك بتغيير المعلمة (مثل الشكل ثلاثي الأبعاد) ، فقد تم بالفعل الانتهاء من المعالجة المسبقة وإعادة استخدام بيانات pixellation. هذا يمكن أن يوفر الكثير من الوقت.
إذا قام المستخدم بتغيير معلمة تؤثر على المعالجة المسبقة ، فسيتم إعادة معالجة الصورة من البداية. (على سبيل المثال ، سيؤدي تغيير حجم الكتلة إلى تنفيذ دورة إعادة معالجة كاملة.)
يظهر أدناه مخطط تدفق مبسط لمعالجة الفيديو أدناه. يشير المكعب إلى تدفق الصورة.

حاليًا ، لا يعمل المربع الأخضر ("الإطار المعالج") كما هو متوقع/مطلوب حتى الكتابة الحالية ، لا يتم دعم إنشاء الفيديو.
يقوم BlockCam بتسجيل الرسائل والحالة في وقت التشغيل إلى وحدة التحكم في التصحيح (إن وجدت ، وفي الغالبية العظمى من الحالات ، لن يكون هذا موجودًا) وإلى قاعدة بيانات SQLite المحلية. هذا يسمح بتصحيح الأخطاء بعد الوفاة في حالة حاجة.
بالنظر إلى سياسة Apple بشأن استئجار البيانات (ناهيك عن سياسات الاتحاد الأوروبي) ، فمن المحتمل أن تتم إزالة التسجيل بالكامل (عبر أعلام وقت الترجمة) لأي إصدار تم إصداره من blockcam.
يتم تخزين جميع إعدادات المستخدم (وبعض إعدادات العملية) عبر فئة Settings . تغلف هذه الفئة آلية تخزين غير مرئية لبقية البرنامج. حاليا ، آلية التخزين هي UserDefaults . إذا أصبحت الإعدادات أكثر تعقيدًا ، فمن السهل ترحيل هذا إلى قاعدة بيانات.
للوصول إلى الإعدادات ، يجب على المتصلين استخدام الأساليب المقدمة لفئة Settings . هذا يساعد على ضمان تكامل نوع البيانات.
توفر فئة Settings أيضًا إشعارًا على مستوى الإعداد للتغييرات (الذي كان السبب الرئيسي لإنشاء الفصل في المقام الأول).
وترد إعدادات blockcam أدناه.
| رمز | يكتب | تقصير | الاستخدام |
|---|---|---|---|
| .Initialized | خيط | "تهيئة" | العلم الذي يحدد ما إذا كانت الإعدادات قد تمت تهيئتها أم لا. عندما يتم تشغيل blockcam لأول مرة ، إذا كان .Initialized |
| .blocksize | عدد صحيح | 48 | حجم كتلة لمعالجة الصور. هذا هو الحجم المربع لكل منطقة بيكسل. |
| .shapeType | خيط | "الكتل" | نفس الكائن ثلاثي الأبعاد في كل منطقة pixellation. يلقي من التعداد. |
| في | منطقية | خطأ شنيع | العدد عكس الارتفاع/الحجم العلم. |
| . HeightSource | خيط | "سطوع" | قناة الألوان لاستخدامها لتحديد الارتفاع/الحجم. يلقي من التعداد. |
| .مية | خيط | "واسطة" | يحدد مقدار انخفاض حجم الصورة التي يجب القيام بها قبل معالجتها لأسباب الأداء. يلقي من التعداد. القيمة الفعلية التي تم تفسيرها في وقت التشغيل. |
| .VerticalExageration | خيط | "واسطة" | كمية المبالغة الرأسية لأداء عند البثق أو توسيع الأشكال ثلاثية الأبعاد. يلقي من التعداد. |
| .InputQuality | عدد صحيح | 2 | القيمة التي تشير إلى جودة الإدخال. يتراوح من 0 إلى 3 مع 3 كونها أعلى جودة (وأبطأ للمعالجة). |
| .CurrentCamera | خيط | "خلف" | موضع الكاميرا الأخيرة المستخدمة. إما الأمام أو الخلف. يلقي من التعداد. |
| .lightcolor | خيط | "أبيض" | اسم لون الضوء. يلقي من التعداد. قد يتم تحويلها إلى نوع مكتبة اللون من اللون في وقت لاحق. |
| .lighttype | خيط | "Omni" | اسم نوع الضوء المستخدم لإلقاء الضوء على المشهد. يلقي من التعداد. |
| .LightIntensity | خيط | "طبيعي" | شدة الضوء المستخدمة لإلقاء الضوء على المشهد. القيمة الفعلية المحددة في وقت التشغيل. يلقي من التعداد. |
| .fieldofview | خيط | "طبيعي" | مجال رؤية الكاميرا. يتم تحديد القيمة الفعلية في وقت التشغيل. يلقي من التعداد. |
| .showhistogram | منطقية | خطأ شنيع | إظهار شاشة الرسم البياني. لم تنفذ حاليا. |
| .HistogrambucketCount | عدد صحيح | 256 | عدد الألوان في شاشة الرسم البياني. لم تنفذ حاليا. |
| .initialview | خيط | "LiveView" | آخر عرض ينظر إليه المستخدم (مثل العرض المباشر ، والألبومات ، إلخ). |
| .FullyExtrudeLetters | منطقية | حقيقي | يحدد ما إذا كانت الحروف مقدمة بالكامل أو مقدمة جزئيًا فقط. |
| .LetterSmoothness | خيط | "سلس" | يحدد مدى سلاسة لإنشاء منحنيات في الحروف. المنحنيات عالية الجودة تأتي بتكلفة أداء كبيرة. القيمة الفعلية المحددة في وقت التشغيل. يلقي من التعداد. |
| . letterfont | خيط | "فوتورا" | الخط (والوزن الاختياري) لاستخدامه لتقديم الحروف المقدمة. إذا لم يكن الخط موجودًا على النظام ، فسيقوم BlockCam بإدخال حالة غير محددة. |
| .RandomCharactersource | خيط | "اللاتينية" | يسمى مجموعة الأحرف Unicode لاستخدامها كمصدر للأحرف العشوائية عند بثق الأحرف. يمكن تحديد نطاقات متعددة عن طريق فصل كل منها عن الآخرين مع فاصلة. |
| .VideoFPS | عدد صحيح | 1 | لا تستخدم حاليا. |
| .VideoDimensions | خيط | "أصغر" | يحدد حجم الفيديو النهائي عند إنشاء الفيديو. القيمة الفعلية المحددة في وقت التشغيل. يلقي من التعداد. |
| .VideoBlockSize | عدد صحيح | 48 | حجم كتلة لمعالجة الفيديو. هذا هو الحجم المربع لكل منطقة بيكسل. |
| .usemetal | منطقية | حقيقي | العلم الذي يطلب من blockcam استخدام المعدن بدلاً من OpenGL. |
| .antialiasingmode | عدد صحيح | 0 | يحدد وضع مضاد. |
| .initialbestfit | منطقية | خطأ شنيع | إذا كان هذا صحيحًا ، فسيحاول blockcam ملاءمة جميع العقد في العرض بإحكام قدر الإمكان. |
| .SaveoriginalImageAction | خيط | "دائماً" | يحدد كيف ومتى حفظ الصور الأصلية. يلقي من التعداد. |
| .nextequentialInteger | عدد صحيح | 0 | تستخدم لتوليد اسم الملف. |
| .LoopSequentialIntegerAfter | عدد صحيح | 9999 | يحدد متى يجب أن يتم البدء عند استخدام الأعداد الصحيحة المتسلسلة. |
| .startequentialIntegerat | عدد صحيح | 1 | قيمة البدء للأعداد الصحيحة المتسلسلة. |
| .IncreaseStarApexesWithProminence | منطقية | خطأ شنيع | إذا كان هذا صحيحًا ، فإن عدد القمة لأشكال النجوم يزداد مع بروز ارتفاع اللون. |
| .starapexcount | عدد صحيح | 5 | عدد القمة للنجوم. إذا كان .IncreaseStarApexesWithProminence صحيحًا ، فهذا هو رقم البداية من القمة. |
| .haltwhencritichermal | منطقية | حقيقي | إذا كان ذلك صحيحًا ، فسيتوقف blockcam (عبر مكالمة fatalError ) عندما يتلقى تنبيهًا حراريًا حاسمًا. قد ينتهك هذا إرشادات Apple ويمكن إزالته. |
| .haltonlowpower | منطقية | حقيقي | إذا كان هذا صحيحًا ، فسيتوقف blockcam (عبر مكالمة fatalError ) عندما يتلقى تنبيهًا منخفضًا للطاقة. قد ينتهك هذا إرشادات Apple ويمكن إزالته. |
| .bestfitoffset | مزدوج | 2.0 | قيمة لاستخدامها لدعم الكاميرا بعيدًا عندما تكون .InitialBestFit |
| .lightingModel | خيط | "فونغ" | نموذج إضاءة المواد السطحية. يلقي من التعداد. |
| . cappedlineballlocation | خيط | "قمة" | موقع الكرة ("Cap") للعقد على شكل خط. يلقي من التعداد. |
| .loggingEnabled | منطقية | خطأ شنيع | تمكين علامة التسجيل. |
| .fontsize | عدد صحيح | 36 | حجم الخط للرسائل المقذوفة. |
| .eenableuisounds | منطقية | حقيقي | علم لتشغيل أصوات واجهة المستخدم (مثل عند الضغط على زر). إذا كانت هذه القيمة false ، يتم تجاهل جميع أعلام الصوت الأخرى. |
| .EnableShutterSound | منطقية | خطأ شنيع | علم لتشغيل صوت مصراع عند الضغط على زر الكاميرا. في بعض المواقع الجغرافية ، يحدث هذا دائمًا ، ولن يكون لهذه القيمة أي تأثير. |
| .enableImageProcessingSound | منطقية | حقيقي | علم لتشغيل صوت في بداية ونهاية معالجة الصور. نظرًا لأن معالجة الصور تستغرق وقتًا طويلاً ، فإن هذا يساعد المستخدم على فهم متى يتم الانتهاء من الصورة. |
| .eenableVideOreCordingsound | منطقية | حقيقي | علم لتشغيل صوت عندما يبدأ المستخدم ويتوقف عن تسجيل مقطع فيديو. |
| .eenableButtonpressSounds | منطقية | حقيقي | العلم لتشغيل صوت عندما يضغط المستخدم على الأزرار. |
| .eenableOptionSelectOnds | منطقية | حقيقي | علامة لتشغيل صوت عندما يحدد المستخدم خيارًا في عرض الإعدادات على الشاشة. |
| .EnableCrashSounds | منطقية | خطأ شنيع | العلم لتشغيل صوت عند عرض مربع حوار تحطم. تم تمكينه فقط عند تجميعه في وضع #Debug . |
| .MeshDotSize | خيط | "واسطة" | حجم النقطة المركزية للشبكات. إذا تم استخدام .None ، لن يتم عرض أي نقطة مركزية. يلقي من التعداد. |
| .MeshLineThickness | خيط | "واسطة" | سمك الخطوط الشبكية. يلقي من التعداد. |
| .RadiatingLineThickness | خيط | "واسطة" | سمك أشكال الخط المشعة. يلقي من التعداد. |
| .RadiatingLinEcount | عدد صحيح | 8 | عدد الخطوط المشعة في شكل خط مشع. 4 هو لخطوط تشير إلى اتجاهات الكاردينال ، 8 لاتجاهات الكاردينال وبين بين ، و 16 ل 8 خطوط أخرى في الطائرة z. |
| .blockchamfersize | خيط | "لا أحد" | دائرة نصف قطرها/نعومة الحافة لأشكال الكتلة. يلقي من التعداد. |
| .maximagedimension | عدد صحيح | 1024 | الحد الأقصى للبعد للصورة. إذا كانت صورة للمعالجة أكبر ، فسيتم تغيير حجمها بحيث تكون الأبعاد الأطول هي هذه القيمة. |
| .adduserDatatoExif | منطقية | خطأ شنيع | علامة لإضافة معلومات تم إنشاؤها للمستخدم إلى كتلة EXIF الصور المصنعة. إذا تم تجميعها في وضع #Debug ، فإن هذه القيمة تتخلف عن True. |
| .اسم المستخدم | خيط | "" " | (افتراضي فارغ.) الاسم المرفق للمستخدم الذي يتم إضافته إلى كتلة EXIF EXIF المعالجة. يحدث هذا فقط إذا كان .AddUserDataToExif صحيحًا. إذا تم تجميعها في وضع #Debug ، فإن هذه القيمة تتخلف عن "Stuart Rankin". |
| .usercopyright | خيط | "" " | (الافتراضي فارغ.) سلسلة حقوق الطبع والنشر التي يقدمها المستخدم التي تتم إضافتها إلى كتلة EXIF EXIF المعالجة. يحدث هذا فقط إذا كان .AddUserDataToExif صحيحًا. إذا تم تجميعها في وضع #DEBUG ، فإن هذه القيمة تتخلف عن "Attribution 3.0 Unported (CC by 3.0)". |
| .ConeIsInverted | منطقية | حقيقي | يحدد ما إذا كانت الأنواع المخروطية مقلوبة من حيث عمق Z. |
| .conetopoptions | خيط | .TopIsZero | خيارات لتحديد دائرة نصف قطرها العليا من المخروط. |
| .ConeBaseOptions | خيط | .BaseIsSide . Rawvalue | خيارات لتحديد دائرة نصف قطرها القاعدة للمخروط. |
| .showsplashscreen | منطقية | حقيقي | العلم الذي يحدد ما إذا كانت شاشة البداية تظهر عند بدء التشغيل أم لا. |
| .HueShapeList | خيط | "" " | قائمة الأشكال لنوع الشكل المتغير Hue. |
| .STurationShapelist | خيط | "" " | قائمة الأشكال لنوع الشكل المتغير التشبع. |
| . الخبر | خيط | "" " | قائمة الأشكال لنوع شكل البديل السطوع. |
يستخدم blockcam معالجة ثلاثية الأبعاد ، والتي تمارس شريحة رسومات الجهاز. إذا كان المستخدم يحدد أعلى إعدادات جودة ، فمن المحتمل أن تحدث بعض الظروف القصوى. للمساعدة في الحفاظ على الجهاز من التلف ، تتوفر الإعدادات لإحباط تنفيذ blockcam عندما يحدث ذلك.
| حدث | فعل | السيطرة على الإعداد |
|---|---|---|
| حراري | إذا وصلت حدث حراري إلى المرحلة الحرجة (حرفيًا .critical في الإخطار) ، إذا كان الإعداد true ، فسيتم إنشاء خطأ مميت لتقليل أي إجهاد حراري تم إنشاؤه بواسطة blockcam. | .HaltWhenTooHot |
| بطارية | إذا دخلت البطارية إلى حالة طاقة منخفضة ، إذا كان الإعداد true ، فسيتم إنشاء خطأ مميت للمساعدة في الحفاظ على عمر البطارية قبل إعادة الشحن. | .HaltOnLowPower |
يدعم blockcam الصور المرئية التالية:
يتم دعم الأشكال التالية حاليًا (أو مخطط لها لدعمها) لتأثيرات البثق:
| شكل | محلي | ملحوظات |
|---|---|---|
| كتل | نعم - SCNBox | أشكال الصندوق الأصلي مطول على طول محور z. |
| مثلثات | لا | أشكال المثلث المتدرب المخصص. |
| بنتاجون | لا | أشكال البنتاغون المخصصة. |
| السداسي | لا | أشكال سداسية متساوية المخصصة. |
| أوكتوجون | لا | أشكال مثمنة متتالية مخصصة. |
| الأهرامات | نعم - SCNPyramid | أشكال الهرم الأصلية. |
| حلقي | نعم - SCNTorus | أشكال توروس الأصلية. |
| الأسطوانات | نعم - SCNCylinder | أشكال الأسطوانة الأصلية - يجعل لدوائر مرتفعة لطيفة. |
| المجالات | نعم - SCNSphere | أشكال الكرة الأصلية. |
| كبسولات | نعم - SCNCapsule | أشكال الكبسولة الأصلية. ليست مثيرة للاهتمام كما تبدو. |
| Tetrahedrons | لا | رباعي السطوح المخصصة الصلبة. |
| النجوم | لا | أشكال النجوم المخصصة (مع قمة متساوية شعاعي). يمكن أن تختلف عدد القمة. |
| CombinedForrgb | نعم - مزيج | المجال المجال ، توروس ، والكبسولة. |
| Combinedforhsb | نعم - مزيج | المجال المجال ، توروس ، والكبسولة. |
| شبكات | لا | لم تنفذ حاليا. |
| رسائل | نعم SCNText | النص المقذوف الأصلي. يميل إلى أن يكون بطيئًا بشكل غير عادي ، خاصة مع الحروف الهجائية غير اللاتينية. |
| خطوط | نعم - SCNCapsule | شكل كبسولة رقيقة جدا . |
| المغطاة | نعم - مزيج | شكل كبسولة رفيعة للغاية مع كرة موضوعة في الجزء العلوي أو الأوسط أو أسفل الخط اعتمادًا على إعدادات المستخدم. |
| خطوط المشع | نعم - مزيج | خطوط متعددة تشع من نقطة الوسط. يمكن للمستخدم تحديد عدد الخطوط. هذا شكل ثقيل الأداء. |
| huevarying | المتغيرات | يتم تحديد الشكل عند نقطة معينة من خلال لون المنطقة المخصصة بحيث يختلف الشكل النهائي الفعلي. |
| التشبع | المتغيرات | يتم تحديد الشكل عند نقطة معينة من خلال تشبع المنطقة المملوءة بحيث يختلف الشكل النهائي الفعلي. |
| السطوع | المتغيرات | يتم تحديد الشكل عند نقطة معينة من خلال سطوع المنطقة المبلورة بحيث يختلف الشكل النهائي الفعلي. |
يتم بثق كل شكل لمنطقة تمثيلية تمثل البكسل أو موسعها. يعتمد تحديد عمق البثق أو الحجم الموسع على لون المنطقة المنقولة.
| قناة اللون | الاستخدام |
|---|---|
| هوى | يحدد لون اللون عمق/حجم الكائن ثلاثي الأبعاد. لاحظ أن قيم Hue دورية (مع وجود 0.0 بشكل أساسي مثل 1.0) بحيث تميل وحدات البكسل المحمر إلى الخضوع بينما يتم تسليط الضوء على اللون الأخضر. |
| التشبع | تحدد قيمة تشبع اللون العمق/الحجم. الألوان الأكثر إشراقا ستكون أكبر. |
| سطوع | سطوع اللون يحدد العمق/الحجم. هذه هي القيمة الافتراضية وكيف يتوقع معظم الناس أن يعمل البرنامج. |
| أحمر | يتم استخدام القناة الحمراء لتحديد العمق/الحجم. |
| أخضر | يتم استخدام القناة الخضراء لتحديد العمق/الحجم. |
| أزرق | يتم استخدام القناة الزرقاء لتحديد العمق/الحجم. |
| سماوي | يتم استخدام قناة سماوية اصطناعية (من CMYK) لتحديد العمق/الحجم. |
| أرجواني | يتم استخدام قناة Magenta الاصطناعية (من CMYK) لتحديد العمق/الحجم. |
| أصفر | يتم استخدام قناة صفراء اصطناعية (من CMYK) لتحديد العمق/الحجم. |
| أسود | يتم استخدام قناة سوداء اصطناعية (من CMYK) لتحديد العمق/الحجم. |
| يوف: ذ | قناة Y الاصطناعية من تحويل YUV. |
| يوف: ش | قناة U الاصطناعية من تحويل YUV. |
| يوف: الخامس | قناة V الاصطناعية من تحويل YUV. |
Blockcam يدعم العلم المقلوب. هذا يعني أنه إذا كان المستخدم يضعف عكسًا ، فإن العمق/الحجم عبارة عن معاملة متبادلة ، مما يجعل المناطق المظلمة بارزة ومخفية أو مخفية.
يدعم blockcam تغيير لون الضوء وكذلك نوع الضوء. تقتصر الألوان حاليًا على مجموعة صغيرة من الألوان المحددة مسبقًا. أنواع الأضواء المتوازية أنوار Scenekit القياسية وغير المعلمية (مثل .omni و .spot ).
لا يمكن ضبط موضع الضوء حاليًا من قبل المستخدم.
يستخدم blockcam علامة SCNView من allowsCameraControl من SCNVIEW للسماح للمستخدم بتكبير أو شينك أو تدوير (في ثلاث محاور) عن طريق الإيماءات.
عند تقديمها في البداية ، قد تبدو النتيجة بعيدة نسبيًا عن العرض. يحتوي blockcam على علامة قابلة للتطبيق مستخدم لتناسب الصورة مع العرض. تميل هذه الميزة إلى الخلط بين allowsCameraControl فيما يتعلق بتوسيع وتقلص.
سيناقش هذا القسم التفاصيل المختلفة على مستوى التنفيذ.
تمت كتابة Blockcam في Swift 5 مع Xcode 11.3.
بالنظر إلى مقدار الوقت الطويل الذي يستغرقه معالجة الصور ، تتم جميع معالجة الصور على موضوع خلفية. يتطلب ذلك جميع الاتصالات لتحديث المستخدم عبر واجهة المستخدم التي سيتم إجراؤها باستخدام مكالمات الخيوط المناسبة.
TBD
blockcam هو حقوق الطبع والنشر © 2019 ، 2020 بواسطة Stuart Rankin
日本語版 «جوجل 翻訳で翻訳»
3D ブロックカメラ
blockcam は iOS および ipados 用のカメラプログラムで、 avfoundation を介して画像を取得し、それらの画像を単純な 3d シーンに変換します。シーンは、ユーザーによって回転および拡大縮小され、フラットイメージとして保存されます。
blockcam は Stuart Rankin によって作成されました。
blockcam のバージョン管理はVersioning.swiftファイルで管理され、ビルド前のスクリプトステップとしてビルドごとに自動的に更新されます。 更新にはビルド 更新にはビルド 、ビルド番号、時刻、日付が含まれますが、現在、バージョン番号は手動で更新する必要があります。 、ビルド番号、時刻、日付が含まれますが、現在、バージョン番号は手動で更新する必要があります。 以下の現在のビルド文字列も同じメカニズムによって維持されます。
現在、バージョン管理プログラムは 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は、処理されたファイルにメタデータを保存します。
| グループ | タグ | 保存された値 |
|---|---|---|
| شجار | アーティスト | ユーザーが有効にした場合、ユーザーの名前。 |
| شجار | 著作権 | ユーザーが有効にした場合、ユーザーの著作権文字列。 |
| شجار | ソフトウェア | 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ブロックに追加します。 |
| .اسم المستخدم | خيط | "" " | (デフォルトは空白です。)処理された画像の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