البكسلات متجهات
كيف يقف الجبر الخطي، رياضيات المتجهات والمصفوفات، خلف عقدة ColorMatrix وممر الموضع العالمي والتركيب العميق في Nuke، ولماذا تجعلك معرفته فنان تركيب أسرع وأكثر جرأة.
تركيب · Nuke · 13 min
افتح سكربت Nuke من أي فيلم روائي فتجد مئات العُقد: تصحيحات ودمج وأقنعة وإعادة إضاءة ودمج عميق. تحت كل واحدة تقريبًا تجلس فكرة صغيرة واحدة من الجبر الخطي. قائمة الأرقام **متجه**، وشبكة الأرقام، **المصفوفة**، تستطيع تحريك كل متجه في الصورة دفعة واحدة. لون البكسل متجه. والبكسل في ممر الموضع العالمي متجه أيضًا، لكنه هذه المرة نقطة في المشهد ثلاثي الأبعاد. والبكسل العميق قائمة كاملة منها. يُظهر هذا المقال كيف يستخدم فنانو التركيب تلك الفكرة الواحدة: في عقدة ColorMatrix لتغيير التشبع ومزج القنوات وتحويل الفضاءات اللونية؛ وعلى ممر الموضع العالمي لبناء أقنعة ثلاثية الأبعاد وإضافة الضوء والانتقال بين فضاء الكاميرا وفضاء العالم؛ وفي التركيب العميق، حيث يحمل كل بكسل عيّنات كثيرة وتتضخم الملفات. كل شكل مرسوم مباشرة من غرفة ثلاثية الأبعاد صغيرة واحدة مرندرة في متصفحك، فالأرقام التي تراها هي الأرقام المستخدمة.
البكسل قائمة أرقام
في Nuke بكسل الصورة RGB ثلاثة أرقام: أحمر وأخضر وأزرق. يسمّي الجبر الخطي قائمة أرقام كهذه متجهًا، ويمكنك رسمها كسهم. ابدأ من الزاوية السوداء لمكعب، حيث الأرقام الثلاثة صفر، وسافر على طول حوافّ الأحمر والأخضر والأزرق بالمقدار الذي تقوله كل قناة. الأبيض هو الزاوية البعيدة، (1، 1، 1). والبرتقالي الداكن سهم قصير يميل نحو الأحمر. يعمل Nuke بفاصلة عائمة 32 بت وضوء خطي، فيُسمح للسهم بمغادرة المكعب: قد تكون بقعة لامعة ساطعة (4.2، 3.8، 3.1)، وقد تنخفض قيمة حتى تحت الصفر. التفكير في الألوان كأسهم هو الخطوة التي تفتح كل شيء آخر، لأن هناك فرعًا كاملًا من الرياضيات عن تحريك الأسهم.
لا يجب أن تحمل القناة لونًا. يستطيع محرك الرندر ثلاثي الأبعاد كتابة متجهات أخرى في خانات الأحمر والأخضر والأزرق لممرات إضافية، تُسمى غالبًا AOVs (متغيرات إخراج اختيارية). الأكثر فائدة لفناني التركيب هو **ممر الموضع العالمي**، ويُسمى عادة P. يخزّن كل بكسل إحداثيات x وy وz في المشهد ثلاثي الأبعاد حيث أصاب شعاع الكاميرا سطحًا. وممر الاتجاهات، N، يخزّن إلى أين يواجه ذلك السطح. وممر العمق يخزّن كم كان بعيدًا. إن تساءلت يومًا كيف يستطيع فنان تركيب تصحيح ألوان الجدار وحده دون رسم شكل روتو واحد، فـ P هو الجواب: كل بكسل في الجدار الخلفي في غرفتنا يحمل موضع الجدار نفسه في العالم. في Nuke تصل هذه الممرات كطبقات إضافية في EXR متعدد القنوات، وتلاحظ Foundry أنه في NukeX يمكن أيضًا توليدها من اللقطات بعقدة DepthGenerator.
شبكة 3×3 تحرّك كل لون
تصف Foundry عقدة ColorMatrix ببساطة: تضرب قيم RGB لكل بكسل في مصفوفة 3×3، و«تُحسب قيم الإخراج لكل قناة لون أساسية بناءً على قيم الإدخال من القنوات الثلاث كلها». اقرأ المصفوفة صفًا صفًا. يقول الصف العلوي كم من الأحمر والأخضر والأزرق القديم يذهب إلى الأحمر الجديد. ويبني الصف الثاني الأخضر الجديد والثالث الأزرق الجديد. هذا كل ما في ضرب المصفوفات: ثلاثة مجاميع موزونة، تُجرى على كل بكسل دفعة واحدة. وللعقدة أيضًا مدخل القناع المعتاد ومنزلق مزج وخيار إلغاء الضرب المسبق بألفا أولًا، فتستطيع استخدامها كأي عقدة لون أخرى في السكربت.
ولأن كل لون سهم، لا تغيّر المصفوفة الألوان واحدًا تلو الآخر حقًا. إنها تثني مكعب الألوان كله دفعة واحدة. **مصفوفة الوحدة**، بآحاد على القطر وأصفار في كل مكان آخر، تترك المكعب كما هو. الأرقام على القطر تمدّد المكعب على محور واحد، وهذا بالضبط ما يفعله الكسب على قناة واحدة. والأرقام خارج القطر تُميل محورًا نحو آخر، وهذا يمزج القنوات. تبقى الخطوط المستقيمة مستقيمة ويبقى الأسود عند الأسود، وتلك القاعدة هي ما يجعلها عملية *خطية*. وهي أيضًا سبب عجز المصفوفة عن إضافة إزاحة أو منحنى: لـ Lift أو الغاما أو الانحدار الناعم ما زلت تحتاج Grade أو ColorLookup.
المصفوفة التي يلجأ إليها فنانو التركيب أكثر هي التشبع. أولًا خذ إضاءة البكسل، مجموعًا موزونًا بأوزان Rec.709: 0.2126 للأحمر و0.7152 للأخضر و0.0722 للأزرق. ثم امزج بين ذلك الرمادي واللون الأصلي. مكتوبًا كمصفوفة، يبدأ كل صف بأوزان الإضاءة مضروبة في (1 − s)، ويُضاف s على القطر. عند s = 1 تحصل على مصفوفة الوحدة ولا يتغير شيء. وعند s = 0 تتطابق الصفوف الثلاثة، فتحصل كل قناة على القيمة نفسها وتتحول الصورة إلى رمادي. وفوق 1 تُدفع الألوان أبعد عن بعضها. ولأن الأوزان الثلاثة تجمع إلى واحد بالضبط، يبقى البكسل الرمادي المحايد الرمادي نفسه مهما كان s، ولهذا لا تزيح مصفوفة التشبع بطاقتك الرمادية أبدًا.
مزج القنوات هو حيث تستحق الأرقام خارج القطر مكانها. تبديل الأحمر والأزرق مصفوفة بآحاد في زاويتين متقابلتين. والصورة بالأبيض والأسود المصنوعة من القناة الحمراء وحدها، كمرشح أحمر على فيلم أبيض وأسود، مصفوفة صفوفها الثلاثة كلها (1، 0، 0). وإرسال الأحمر إلى الأخضر والأخضر إلى الأزرق والأزرق إلى الأحمر يدير كل صبغة ثلث عجلة الألوان. يستخدم فنانو التركيب مزجات كهذه لإصلاح لقطات تصل بقنواتها في الترتيب الخاطئ، أو لسحب عزل أنظف من أي قناة فيها أكبر تباين، أو لبناء قناع إضاءة من مزيج مخصص من القنوات.
المهمة التي تؤديها ColorMatrix أكثر في منظومة حقيقية هي **تحويل الفضاء اللوني**. فضاءان لونيان خطيان يختلفان فقط في أساسياتهما، مثل Rec.709 الخطي وACEScg، يربطهما بالضبط مصفوفة 3×3 واحدة. لـ ACEScg أساسيات أوسع بكثير، فيوصف البرتقالي نفسه بأرقام مختلفة أقل تطرفًا. ادفع قيم Rec.709 عبر مصفوفة التحويل فتحصل على قيم ACEScg تعني اللون نفسه. انسَ التحويل واعرض تلك الأرقام كأنها ما زالت Rec.709، فتبدو الصورة باهتة، خطأ كلاسيكي حين تلتقي لقطة ورندر CG في فضاءين مختلفين. تتولى عُقد OCIO في Nuke هذا عنك عادة، لكن تحت الغطاء تغيير الأساسيات في الضوء الخطي هو هذه المصفوفة الواحدة.
لـ ColorMatrix خانة **invert**. يقول مرجع Foundry إنها تطبّق معكوس المصفوفة بدل المصفوفة نفسها، والمعكوس هو المصفوفة الوحيدة التي تلغي الأولى تمامًا. التحويل إلى ACEScg والعودة هو المصفوفة متبوعة بمعكوسها، ولأن Nuke يحتفظ بأعداد عائمة 32 بت، بما فيها القيم السالبة، تعيد الرحلة ذهابًا وإيابًا الأرقام الأصلية. لكن ليس كل مصفوفة يمكن إلغاؤها. رقم واحد يُسمى **المحدد** يقيس كم تسحق المصفوفة المكعب. إن كان صفرًا، فقد سُطّح المكعب وضاعت المعلومات إلى الأبد. وإزالة التشبع الكاملة هي الحالة الكلاسيكية: متى صار كل بكسل رماديًا، لا مصفوفة في العالم تستطيع إخبارك بلونه السابق.
أقنعة وضوء يعيشان في ثلاثة أبعاد
عودة إلى ممر الموضع. أشر إلى الجدار الخلفي فتبقى قيمة z نفسها في كل مكان عليه، −4، لأن كل بكسل في ذلك الجدار يقع على المستوى نفسه في العالم. أشر إلى الأرضية فـ y دائمًا صفر. كل بكسل متجه، عنوان في المشهد ثلاثي الأبعاد، وذلك العنوان لا يعتمد على مكان وقوف الكاميرا. هذا ما يجعل P قويًا إلى هذا الحد لفنان التركيب. القناع المبني من P مربوط بالعالم لا بالشاشة، فيلتصق بالجدار حين تتحرك الكاميرا، ولا تضطر أبدًا إلى تتبّعه أو تحريك شكل روتو.
أبسط قناع ثلاثي الأبعاد كرة. اختر نقطة في العالم، سمّها c. لكل بكسل، خذ المتجه P − c وقِس طوله: تلك هي المسافة من السطح في ذلك البكسل إلى نقطتك. حيث تكون المسافة أصغر من نصف قطر يكون القناع أبيض، متلاشيًا إلى الأسود عبر حافة ناعمة. يبني الفنانون هذا بعقدة Expression صغيرة أو أداة مشتركة، تُسمى غالبًا P_Matte، وعقدة PositionToPoints من Foundry، التي «تولّد سحابة نقاط ثلاثية الأبعاد من صورة xyz، مثل ممر موضع»، تتيح لك رؤية السحابة في العارض ثلاثي الأبعاد لتضع الكرة حيث تريد.
الكرة تبدو متماثلة من كل جانب، لكن الصندوق لا. الصندوق الأزرق المخضرّ في غرفتنا مُدار 30 درجة، فقناع صندوق مبني مباشرة من P سيقطع عبره. الحل هو تحريك العالم ليجلس الصندوق مستقيمًا. اطرح مركز الصندوق من P بعقدة Add، ثم أدر ما تبقى بمصفوفة دوران. الدوران مجرد مصفوفة 3×3 أخرى من جيوب التمام والجيوب، فعقدة ColorMatrix عادية مطبَّقة على قنوات P تفعله، مع أن العقدة صُممت للون. بعد ذلك، اختبار بسيط واحد، هل كل من x وy وz بين −0.5 و0.5، يعطي قناع صندوق يتبع جوانب الصندوق بالضبط. تحمل ColorMatrix مصفوفة 3×3 فقط، فتستطيع التدوير والتحجيم لكن لا تحريك أي شيء؛ والتحريك يأتي دائمًا من إزاحة.
بـ P وN معًا تستطيع إضافة ضوء إلى رندر دون العودة إلى ثلاثي الأبعاد. لكل بكسل، المتجه من السطح إلى مصباح هو L − P. اقسمه على طوله لتحصل على اتجاه، وخذ **الضرب النقطي** مع الاتجاه N، فتعرف كم يواجه ذلك السطح الضوء مباشرة. اقسم على مربع المسافة فتحصل على التلاشي الطبيعي للضوء. تصف Foundry عقدة Relight بأنها تأخذ «صورة ثنائية الأبعاد تحوي ممرَّي اتجاهات وموضع نقاط» وتتيح لك إضاءتها بأضواء ثلاثية الأبعاد وكاميرا ومادة، وهذا الحساب قلبها. لا تستطيع إلقاء ظلال جديدة، لأن الممر لا يعرف إلا السطح الأمامي، لكن لدفعة إضافية سريعة أو ضوء عملي متحرك أو لمسة لون فهي سريعة وتفاعلية.
يمكن وصف نقطة من مكانين: من أصل العالم، أو من الكاميرا. والانتقال بينهما يحتاج **مصفوفة 4×4**. يتيح الصف والعمود الإضافيان لمصفوفة واحدة حمل دوران وحركة معًا، وهو ما لا تستطيعه مصفوفة 3×3. الحيلة أن تكتب كل نقطة كـ (x، y، z، 1)، وتُعرف بالإحداثيات المتجانسة. تحويل الكاميرا هو بالضبط مصفوفة كهذه، وتحمل عقدة Camera في Nuke واحدة. اضرب نقطة عالمية في معكوس مصفوفة الكاميرا فتحصل على النقطة في فضاء الكاميرا، حيث تنظر الكاميرا على طول محورها −z. اقسم x وy على المسافة أمام العدسة، وحجّم بالبعد البؤري، فتعرف أين تهبط النقطة في الكادر. هكذا تتيح لك كاميرا متتبَّعة تثبيت عنصر ثنائي الأبعاد بالضبط فوق نقطة ثلاثية الأبعاد، وهكذا يمكن تحويل ممر موضع عالمي إلى ممر بفضاء الكاميرا.
متى صار P في التركيب، تتقلص مهام يومية كثيرة إلى سطر رياضيات. ضباب الارتفاع تدرج على قناة y في P. وضباب المسافة يستخدم طول P ناقص موضع الكاميرا. والتصحيح البارد على الجدار الخلفي فقط اختبار على z في P، «موضع الجدار» نفسه. الثلاثة تبقى صحيحة مع حركة الكاميرا، والثلاثة يمكن تغييرها في ثوانٍ حين يطلب المخرج، ولا يحتاج أي منها إلى شكل روتو أو إعادة رندر من قسم الإضاءة.
عيّنات كثيرة في كل بكسل
تحتفظ الصورة المسطحة العادية بلون واحد وألفا واحدة لكل بكسل. تصف Foundry الصور العميقة بأنها تحوي «عيّنات متعددة لكل بكسل على أعماق متفاوتة»، لكل منها لونها وعتامتها وعمقها بالنسبة إلى الكاميرا. اتبع بكسلًا واحدًا من غرفتنا، المملوءة الآن بضباب منخفض، فيمر شعاعه عبر شريحة بعد شريحة من دخان رقيق قبل أن يصل إلى الأرضية. الرندر المسطح يسحق كل ذلك في رقم واحد. والرندر العميق يحتفظ بكل شريحة كعيّنة خاصة بها، بعمق أمامي وعمق خلفي، فيصبح كل بكسل قائمة متجهات مرتبة بالمسافة. يحمّل Nuke هذه القوائم بعقدة DeepRead من ملفات OpenEXR عميقة وصيغة .dtex من Pixar.
يأتي المكسب حين تجمع العناصر. تقوم DeepMerge من Foundry بـ«دمج عيّنات من صور عميقة والتعامل مع الحجب»: تُداخل عيّنات المدخلين بالعمق، فينزلق عنصر CG في المكان الصحيح داخل الدخان، مخفيًا جزئيًا بما أمامه ومخفيًا جزئيًا ما خلفه. مع الصور المسطحة ستحتاج إلى قناع حجب مرندر لكل عنصر مقابل كل عنصر آخر، ورندر جديد كلما تحرك شيء. الدمج المسطح بالعمق لا يملك إلا مسافة واحدة لكل بكسل، فاختباره كل شيء أو لا شيء: إما تقطع الكرة الضباب مباشرة أو تختفي خلفه، بحواف قاسية مدرّجة. لهذا تقول Foundry إنه ببيانات عميقة تستطيع «رندرة الخلفية مرة واحدة، ثم تحريك أجسامك لاحقًا إلى أماكن وأعماق مختلفة».
أحيانًا ما زال العالم المسطح يحتاج إلى قناع. تأخذ DeepHoldout صورة عميقة رئيسية وصورة حجب عميقة وتعيد صورة مسطحة للمدخل الرئيسي «بثقوب حيث حجبت أجسام مدخل الحجب أجزاء منها»، إما كقناع ألفا وحده أو كلون مع ألفا. يستخدمها فنانو التركيب لتسليم عنصر نظيف محجوب مسبقًا إلى بقية سكربت مسطح، أو للحصول على ألفا لمؤثر لا يوجد إلا في بُعدين، كتوهج أو وهج عدسة ينبغي أن يخفت حيث يُدفن عنصر CG في الدخان.
ترندر فرق الإضاءة عميقًا، لكن مظهر اللقطة يُبنى في التركيب المسطح. و**DeepRecolor** تجمع الاثنين. تصفها Foundry بأنها تدمج «معلومات لون صورة ثنائية الأبعاد قياسية وعميقة»: تأخذ لون كل بكسل من صورة مسطحة وتنشره على كل عيّنة في البكسل العميق المطابق. افتراضيًا تلغي الضرب المسبق بألفا الصورة المسطحة ثم تضرب مجددًا بألفا كل عيّنة. ومع تفعيل *target input alpha*، توزّع الألفا المسطحة على العيّنات ليطابق الناتج المسطّح الصورة المسطحة بالضبط، وهذا يساعد حين يكون الضغط أو تغيير في الظلّل قد أزاح ألفا العيّنات العميقة. فتصحّح اللقطة كالمعتاد، وتعيد تلوين البيانات العميقة، وتحمل كل DeepMerge بعد ذلك تصحيحك.
ولأن لكل عيّنة عميقة عمقًا على طول شعاع كاميرا معروف، فهي أيضًا نقطة في ثلاثة أبعاد: موضع الكاميرا زائد متجه اتجاه الشعاع مضروبًا في العمق. تفعل DeepToPoints هذا بالضبط. تقول Foundry إنها تحوّل «عيّنات البكسلات العميقة إلى نقاط في الفضاء ثلاثي الأبعاد تستطيع رؤيتها في منظر Nuke ثلاثي الأبعاد، كسحابة نقاط»، وتقترح استخدامها كمرجع موضع. ترى الغرفة، والضباب كسحابة من نقاط باهتة، وعنصر CG داخله، وتستطيع محاذاة البطاقات أو الجسيمات أو عناصر ثلاثية الأبعاد جديدة معها دون طلب رندر جديد.
لكل هذا ثمن، والثمن مساحة القرص. بكسل RGBA مسطح بنصف عائم 8 بايتات. والعيّنة العميقة تحتاج لونها وألفاها زائد عمقًا أماميًا وخلفيًا، ست قيم تُخزَّن عادة كأعداد عائمة 32 بت، أي 24 بايتًا، ويسجّل كل بكسل أيضًا كم عيّنة يحمل. غرفتنا الصغيرة تحمل في المتوسط نحو **ست** عيّنات لكل بكسل؛ والشعر والدخان وأوراق الشجر وضبابية الحركة قد تدفع اللقطات الحقيقية إلى العشرات. اضرب ذلك عند 4K فيصبح إطار واحد أكبر مرات كثيرة من نسخته المسطحة، قبل إضافة ممر إضافي واحد. يمكن ضغط ملفات OpenEXR العميقة، لكن بلا فقد فقط، فلا تنكمش أبدًا كما ينكمش ممر جمال مسطح.
لذا يُستخدم العميق حيث يستحق كلفته: الأحجام والشعر وضبابية الحركة الثقيلة واللقطات التي تتقاطع فيها عناصر كثيرة في العمق. تضبط فرق الإضاءة مدى دقة تقطيع محرك الرندر للأحجام، ويتخلص فنانو التركيب مما لا يحتاجونه، مثلًا بـ DeepCrop، التي تصفها Foundry بأنها تقتطع «البيانات العميقة بالنسبة إلى عمق معين». تُظهر الخريطة الحرارية أين الكلفة فعلًا. تحمل الأرضية الضبابية كل العيّنات تقريبًا، بينما كل بكسل في الجدران خلفها عيّنة معتمة واحدة.
مجتمعًا، سكربت فنان التركيب سلسلة من المتجهات والمصفوفات. يدخل اللون كمتجهات وتديره ColorMatrix إلى الفضاء الصحيح والمظهر الصحيح. ويدخل P وN كمتجهات ويصبحان أقنعة وضوءًا عبر الضرب النقطي والأطوال والدورانات. وتربط مصفوفة الكاميرا 4×4 العالم بالكادر. والبكسلات العميقة قوائم متجهات ترتّبها DeepMerge بالعمق. لا تحتاج أبدًا إلى الحساب يدويًا، لأن Nuke يفعله لكل بكسل، لكن معرفة أن عقدة هي حقًا تسعة أرقام أو ضرب نقطي تخبرك بما تستطيع وما لا تستطيع، وتتيح لك بناء الأداة الناقصة من القائمة.
المصادر ومزيد من القراءة
- Foundry، دليل Nuke المرجعي، «ColorMatrix»: learn.foundry.com
- Foundry، دليل Nuke المرجعي، «Relight» و«PositionToPoints»: Relight · PositionToPoints
- Foundry، دليل مستخدم Nuke، «Deep Compositing»: learn.foundry.com
- Foundry، دليل Nuke المرجعي، «Deep Nodes» و«DeepHoldout» و«DeepRecolor» و«DeepToPoints»: Deep Nodes · DeepHoldout · DeepRecolor · DeepToPoints
- أكاديمية فنون وعلوم السينما، «ACEScg: فضاء عمل لرندر CGI والتركيب» (S-2014-004)
- توصية ITU-R BT.709، قيم المعاملات للتلفزيون عالي الدقة (الأساسيات وأوزان الإضاءة)
- وثائق OpenEXR، «Interpreting OpenEXR Deep Pixels»: openexr.com
- جيلبرت سترانغ، *مقدمة في الجبر الخطي* (الطبعة السادسة، Wellesley-Cambridge Press، 2023)
*كل الأشكال رسوم توضيحية محسوبة في متصفحك من غرفة بسيطة واحدة متتبَّعة بالأشعة، لا رندرات إنتاج حقيقية ولا لقطات شاشة من Nuke. البيانات العميقة والدمج وإعادة الإضاءة حسابات حقيقية على ذلك المشهد الصغير. أوصاف العُقد تتبع وثائق Foundry نفسها حتى أكتوبر 2026.*