مشاركة عبر


نظرة عامة على الرسوميات ثلاثية الأبعاد

هذا الموضوع يوفر نظرة عامة حول 3-D الوظائف في نظام الرسوميات Windows Presentation Foundation (WPF) . WPF3-D تطبيق يسمح للمطورين برسم و تحويل تحريك الرسومات ثلاثية الأبعاد في كلا من رمز العلامات و تعليمات برمجية إجرائية باستخدام نفس القدرات المقدمة بواسطة نظام الرسوميات ثنائية الأبعاد. Developers can combine 2-D and 3-D graphics إلى إنشاء rich عناصر التحكم, provide complex illustrations of data, أو enhance the user experience of an application's interface. 3-Dيعتمد فيWPFهو غير مصممة لتوفير متكاملة اللعبة-تطوير النظام الأساسي.

يشتمل هذا الموضوع على الأقسام التالية.

  • ثلاثي الأبعاد محتوى بداخل ثنائي الأبعاد

  • إحداثيات الفراغ ثلاثي الأبعاد

  • الكاميرات و الإسقاطات

  • أوليات الطراز و الشبكة

  • تطبيق مواد على الطراز

  • إضاءة المشهد

  • طرازات التحويل.

  • طرازات الحركة

  • إضافة محتوى ثلاثي الأبعاد للإطار

  • مواضيع ذات صلة

ثلاثي الأبعاد محتوى بداخل ثنائي الأبعاد

3-D محتوى الرسومات فيWPF يتم تغليف في عنصر ماViewport3D ، الذي يمكنه المشاركة في بنية عنصر ثنائي الأبعاد. يعامل النظام الرسومات Viewport3Dكـ لعناصر مرئية ثنائية الأبعاد مثل العديد من الآخرين في WPF. Viewport3Dوظائف كـ إطار — منفذ العرض — في المنظر ثلاثي الأبعاد. بشكل أكثر دقة هو السطح الذي يتم عليه إسقاط مشهد 3-D .

في تطبيق 2-D إصطلاحي , استخدم Viewport3D كأنك تستخدم عنصر حاوية آخر مثل خطوط الشبكة أو اللوحة القماشية. على الرغم من أنه يمكنك استخدام Viewport3D مع كائنات رسم 2-D أخرى في نفس رسم المشهد الذي لا يمكنك خلخلته 2-D و كائنات 3-D داخل Viewport3D. سيتم التركيز في هذا الموضوع على كيفية رسم رسومات 3-D داخل Viewport3D.

إحداثيات الفراغ ثلاثي الأبعاد

WPF نظام الإحداثيات الخاصة بالرسومات 2-D يحدد نقطة الأصل في أعلى يمين مساحة العرض (عادةً الشاشة). في النظام 2-D قيم المحور س موجبة إلى اليمين، و قيم المحور ص موجبة إلى أسفل. في نظام الإحداثيات 3-D ، على الرغم من ذلك، نقطة الأصل موجودة في وسط منطقة العرض مع قيم المحور س موجبة متابعة إلى اليمين ولكن القيم الموجبة للمحور ص متابعة إلى أعلى و قيم المحور ع الموجبة متابعة إلى الخارج من نقطة الأصل باتجاه العارض.

التمثيلات الاصطلاحية لنظام الإحداثيات ثنائي الأبعاد مع ثلاثي الأبعاد

أنظمة إحداثيات

المساحة المعرّفة من قِبل هذه المحاور هو المرجع من إطارا ثابتًا 3-D الكائنات في WPF. أثناء إنشاء نماذج في هذا الفراغ و إنشاء أضواء والكاميرات عرضها ، يكون من المفيد التمييز لهذا الإطار الثابت من المرجع ، أو العالم الفراغي، من المرجع من الإطار المحلي يمكنك إنشاء لكل طراز عند تطبيق تحويلات عليه. تذكر أيضاً أن الكائنات في العالم الفراغي قد تبدو مختلفة تماماً أو تكون غير مرئية على الإطلاق اعتماداً على إعدادات الضوء و الكاميرا و لكن تغيير موضع الكاميرا لا يغير من موضع الكائنات في العالم الفراغي.

الكاميرات و الإسقاطات

المطورين الذين يعملون في 2-D اعتادوا على أوليات الرسم على الشاشة ثنائية الأبعاد. عند إنشاء مشهد 3-D ، فإنه من المهم تذكر أنك تقوم فعلا بإنشاء تمثيل 2-D لكائنات 3-D . لأن المشهد 3-D يبدو مختلفاً استناداً على طريقة عرض onlooker، يجب تحديد هذه الطريقة. فئة Camera يسمح لك بتحديد طريقة العرض هذه للـ 3-D المشهد.

طريقة أخرى لفهم كيفية تمثيل مشهد 3-D على سطح 2-D عن طريق الوصف كسطح إسقاط على سطح العرض. ProjectionCamera يسمح لك بتحديد إسقاطات مختلفة وخصائصها لتغيير كيف يشاهد onlooker طرازات 3-D. PerspectiveCamera يحدد الإسقاط الذي يضغط المشهد. بمعنى آخر، PerspectiveCamera يوفر منظور نقطة الإختفاء. يمكنك تحديد موضع الكاميرا في مساحة إحداثي المشهد و مجال الرؤية للكاميرا و المتجه الذي يعرّف اتجاه "أعلى" في المشهد. يوضح الرسم التخطيطي التالي PerspectiveCamera الخاص بالإسقاط.

NearPlaneDistance و FarPlaneDistance خصائص ProjectionCamera تقيد نطاق إسقاط الكاميرا. إذا تساوت الكاميرات الموجودة في أي مكان في المشهد، فمن الممكن للكاميرا إلى فعلا أن توضع داخل نموذج أو جداً قريب طراز، مما يجعل من القرص الثابت إلى التمييز بين الكائنات بشكل صحيح. NearPlaneDistanceيسمح لك إلى تحديد أقل مسافة من الكاميرا بعد الذي الكائنات سوف لا رسم. وعلى العكس، FarPlaneDistance يتيح لك تحديد مسافة من الكاميرا للكائنات التي لن ترسم، مما يضمن أن يتم تضمين الكائنات البعيدة جداً و أن يمكن التعرف عليها في المشهد.

موقع الكاميرا

إعداد الكاميرا

OrthographicCamera تحدد إسقاط عمودي لطراز 3-D للأسطح المرئية 2-D . مثل الكاميرات الأخرى، وهي تحدد موضع و اتجاه عرض والاتجاه "إلى الأعلى". بعكس PerspectiveCamera ، على الرغم من ذلك، OrthographicCamera وصف الإسقاط لا يتضمن تقصير منظور. بمعنى آخر، OrthographicCamera يصف صندوق عرض متوازي الجوانب بدلاً من الذي تلتقي جوانبه في نقطة في الكاميرا. تُظهر الصورة التالية نفس الطراز كما يتم عرضه باستخدام PerspectiveCamera و OrthographicCamera.

إسقاط منظور ومتعامد

إسقاط منظور ومتعامد

تظهر التعليمات البرمجية التالية بعض الإعدادات النموذجية للكاميرا.

            ' Defines the camera used to view the 3D object. In order to view the 3D object,
            ' the camera must be positioned and pointed such that the object is within view 
            ' of the camera.
            Dim myPCamera As New PerspectiveCamera()

            ' Specify where in the 3D scene the camera is.
            myPCamera.Position = New Point3D(0, 0, 2)

            ' Specify the direction that the camera is pointing.
            myPCamera.LookDirection = New Vector3D(0, 0, -1)

            ' Define camera's horizontal field of view in degrees.
            myPCamera.FieldOfView = 60

            ' Asign the camera to the viewport
            myViewport3D.Camera = myPCamera
// Defines the camera used to view the 3D object. In order to view the 3D object,
// the camera must be positioned and pointed such that the object is within view 
// of the camera.
PerspectiveCamera myPCamera = new PerspectiveCamera();

// Specify where in the 3D scene the camera is.
myPCamera.Position = new Point3D(0, 0, 2);

// Specify the direction that the camera is pointing.
myPCamera.LookDirection = new Vector3D(0, 0, -1);

// Define camera's horizontal field of view in degrees.
myPCamera.FieldOfView = 60;

// Asign the camera to the viewport
myViewport3D.Camera = myPCamera;

أوليات الطراز و الشبكة

Model3D هو الأساس المجرد الذي يمثل كائن عام3-D . لإنشاء مشهد 3-D ، تحتاج بعض الكائنات للعرض و الكائنات التي تشكل الرسم البياني للمشهد تنحدر من Model3D. حالياً، WPF يدعم بناء أشكال هندسية باستخدام GeometryModel3D. خاصية Geometry لهذا الطراز تأخذ الخطوط الشبكية الأولية.

لإنشاء نموذج ابدأ عن طريق إنشاء أولي أو خطوط شبكية. المجموعة الأساسية 3-D عبارة عن مجموعة من القمم التي تشكل 3-D واحدة. معظم 3-D توفر أنظمة أوليات موصوفة بناءا على أبسط شكل مغلق: مثلث معرف من قِبل رؤسه الثلاثة. لأن ثلاث نقاط المثلث يشتركون في نفس المستوى يمكن الاستمرار في إضافة مثلثات لتمثيل أشكال أكثر تعقيداً تسمى خطوط شبكية.

نظام WPF3-D يوفر حالياً فئة MeshGeometry3D التي تسمح لك بتحديد أي هندسة; لا تعتمد حالياً المعرفة المسبقة بأوليات 3-Dمثل الكرات و النماذج مكعب. البدء في إنشاء MeshGeometry3D عن طريق تحديد قائمة برؤوس مثلث كخاصية Positions . يتم تحديد كل قمة كـ Point3D. (في Extensible Application Markup Language (XAML), تحديد هذه الخاصية كقائمة من الأرقام التي تم تجميعها في مجموعات من ثلاثة التي تمثل إحداثيات كل رأس.) استناداً إلى هندسته، قد أن تتألف الخطوط الشبكية الخاصة بك من المثلثات العديد منها المتشارك في نفس زوايا (رؤوس). لرسم خطوط الشبطة بشكل صحيح، WPF يحتاج المعلومات المتعلقة بأي القمم مشتركة مع أي المثلثات. توفر هذه المعلومات بواسطة تحديد قائمة الفهارس مثلث بواسطة خاصية TriangleIndices . هذه القائمة تحدد ترتيب النقاط المحدد في Positions قائمة يحدد مثلث.

<GeometryModel3D>
  <GeometryModel3D.Geometry>
          <MeshGeometry3D 
              Positions="-1 -1 0  1 -1 0  -1 1 0  1 1 0"
              Normals="0 0 1  0 0 1  0 0 1  0 0 1"
              TextureCoordinates="0 1  1 1  0 0  1 0   "
              TriangleIndices="0 1 2  1 3 2" />
      </GeometryModel3D.Geometry>
      <GeometryModel3D.Material>
          <DiffuseMaterial>
              <DiffuseMaterial.Brush>
                  <SolidColorBrush Color="Cyan" Opacity="0.3"/>
              </DiffuseMaterial.Brush>
          </DiffuseMaterial>
      </GeometryModel3D.Material>
  <!-- Translate the plane. -->
      <GeometryModel3D.Transform>
          <TranslateTransform3D
            OffsetX="2" OffsetY="0" OffsetZ="-1"   >
          </TranslateTransform3D>
      </GeometryModel3D.Transform>
  </GeometryModel3D>

في المثال السابق، Positions تحدد القائمة القمم الثمانية لتعريف شبكة خطوط على شكل مكعب. خاصية TriangleIndices تعيّن قائمة اثني عشر مجموعة من ثلاثة فهارس. كل رقم في القائمة يشير إلى إزاحة في Positions قائمة. على سبيل المثال، رؤوس الثلاثة الأولى المحددة بواسطة Positions قائمة هم (1,1,0) (0,1,0) و (0,0,0). الفهارس الثلاثة الأولى المحددة بواسطة TriangleIndices قائمة هي 0 و 2 و 1, التي تتوافق مع الأول ، الثالث، و النقاط الثانية في Positions قائمة. نتيجة لذلك، يتكون المثلث الأول الذي ينشئ طراز المكعب من (1,1,0) إلى (0,1,0) إلى (0,0,0) و سيتم تحديد المثلثات الإحدى عشر المتبقية بشكل مشابه.

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

TextureCoordinatesتحدد خاصية مجموعة من Points تعلم النظام الرسومات كيفية تعيين الإحداثيات التي تحدد كيفية مادة هو المرسومة على رؤوس التشابك. TextureCoordinatesالمحددة كقيمة تتراوح بين صفر و 1، ضمناً. كما في خاصية Normals، نظام الرسومات يمكنه حساب إحداثيات افتراضية للتركيب ولكن يمكنك اختيار تعيين إحداثيات مختلفة للتحكم في تعيين تركيب الذي يتضمن جزء من نمط مكرر على سبيل المثال المثال. يمكن العثور على معلومات حول إحداثيات تركيب في المواضيع التالية أو في Managed Direct3D SDK.

المثال التالي يوضح كيفية إنشاء وجه واحد من طراز المكعب في التعليمات البرمجية إجرائية. ملاحظة يمكنك رسم مكعب بأكمله كـ GeometryModel3D مفرد; يرسم هذا المثال وجه المكعب كـ طراز مميزة ليتمكن من تطبيق تركيبات منفصلة على كل وجه لاحقاً.

        Private side1Plane As New MeshGeometry3D()
MeshGeometry3D side1Plane = new MeshGeometry3D();
            side1Plane.Positions.Add(New Point3D(-0.5, -0.5, -0.5))
            side1Plane.Positions.Add(New Point3D(-0.5, 0.5, -0.5))
            side1Plane.Positions.Add(New Point3D(0.5, 0.5, -0.5))
            side1Plane.Positions.Add(New Point3D(0.5, 0.5, -0.5))
            side1Plane.Positions.Add(New Point3D(0.5, -0.5, -0.5))
            side1Plane.Positions.Add(New Point3D(-0.5, -0.5, -0.5))

            side1Plane.TriangleIndices.Add(0)
            side1Plane.TriangleIndices.Add(1)
            side1Plane.TriangleIndices.Add(2)
            side1Plane.TriangleIndices.Add(3)
            side1Plane.TriangleIndices.Add(4)
            side1Plane.TriangleIndices.Add(5)

            side1Plane.Normals.Add(New Vector3D(0, 0, -1))
            side1Plane.Normals.Add(New Vector3D(0, 0, -1))
            side1Plane.Normals.Add(New Vector3D(0, 0, -1))
            side1Plane.Normals.Add(New Vector3D(0, 0, -1))
            side1Plane.Normals.Add(New Vector3D(0, 0, -1))
            side1Plane.Normals.Add(New Vector3D(0, 0, -1))

            side1Plane.TextureCoordinates.Add(New Point(1, 0))
            side1Plane.TextureCoordinates.Add(New Point(1, 1))
            side1Plane.TextureCoordinates.Add(New Point(0, 1))
            side1Plane.TextureCoordinates.Add(New Point(0, 1))
            side1Plane.TextureCoordinates.Add(New Point(0, 0))
            side1Plane.TextureCoordinates.Add(New Point(1, 0))
side1Plane.Positions.Add(new Point3D(-0.5, -0.5, -0.5));
side1Plane.Positions.Add(new Point3D(-0.5, 0.5, -0.5));
side1Plane.Positions.Add(new Point3D(0.5, 0.5, -0.5));
side1Plane.Positions.Add(new Point3D(0.5, 0.5, -0.5));
side1Plane.Positions.Add(new Point3D(0.5, -0.5, -0.5));
side1Plane.Positions.Add(new Point3D(-0.5, -0.5, -0.5));

side1Plane.TriangleIndices.Add(0);
side1Plane.TriangleIndices.Add(1);
side1Plane.TriangleIndices.Add(2);
side1Plane.TriangleIndices.Add(3);
side1Plane.TriangleIndices.Add(4);
side1Plane.TriangleIndices.Add(5);

side1Plane.Normals.Add(new Vector3D(0, 0, -1));
side1Plane.Normals.Add(new Vector3D(0, 0, -1));
side1Plane.Normals.Add(new Vector3D(0, 0, -1));
side1Plane.Normals.Add(new Vector3D(0, 0, -1));
side1Plane.Normals.Add(new Vector3D(0, 0, -1));
side1Plane.Normals.Add(new Vector3D(0, 0, -1));

side1Plane.TextureCoordinates.Add(new Point(1, 0));
side1Plane.TextureCoordinates.Add(new Point(1, 1));
side1Plane.TextureCoordinates.Add(new Point(0, 1));
side1Plane.TextureCoordinates.Add(new Point(0, 1));
side1Plane.TextureCoordinates.Add(new Point(0, 0));
side1Plane.TextureCoordinates.Add(new Point(1, 0));

تطبيق مواد على الطراز

للحصول على خطوط شبكية تبدو كائن ثلاثي الأبعاد, يجب أن يكون لدى تركيب مطبق لتغطية سطح معرف من قِبل القمم و مثلثات بحيث يمكن اضائتها و إعادة إسقاطها بواسطة الكاميرا. في 2-D ، تستخدم فئة Brush لتطبيق ألوان أو نقوش التدرجات أو محتوى آخر مرئي لمناطق من الشاشة. المظهر لكائنات 3-D ، ومع ذلك، دالة في طراز الإضاءة ، وليس فقط من لون أو نقش مطبق عليهم. الكائنات الحقيقية تعكس الضوء بشكل مختلف استناداً على الجودة الخاصة بالأسطح: الأسطح اللامعة لا تظهر كالأسطح الخام أو غير لامعة و يبدو أن بعض الكائنات تمتص الضوء بينما الآخرين يلمعون. يمكنك تطبيق كافة الفرشات على الكائنات 3-D التي يمكنك تطبيقها على كائنات 2-D ولكن لا يمكن تطبيقها مباشرة.

لتعريف سمات سطح أحد طرازات WPF يستخدم الفئة المجردة Material. و أقسام فرعية محددة للمواد تحدد بعض خصائص مظهر سطح الطراز ، ويقدم أيضا خاصية ال التي يمكنك تمرير SolidColorBrush ، TileBrush ، أو VisualBrush.

  • DiffuseMaterial تحدد تطبيق ال على الطراز حيث أن هذا الطراز كان مضاء بغزارة. باستخدام DiffuseMaterial تمثل باستخدام فرشات مباشرة على طرازات 2-D ; أسطح الطراز لا تعكس ضوء بالرغم من لمعانها.

  • SpecularMaterial تحديد تطبيق ال على طراز بالرغم من أن سطح الطراز قاس أو لامع، قادر على عكس التظليلات. يمكنك تعيين درجة التركيب الذي سوف يقترح هذا جودة الانعكاس أو يلمع بواسطة تعيين قيمة للخاصية SpecularPower .

  • EmissiveMaterial يسمح لك بتحديد أنه سيتم تطبيق التركيب كما لو كان انبعاث الطراز مساو للون ال. هذا لا يجعل الطراز ضوء; ومع ذلك، فإنه سيشارك بشكل مختلف في التظليل من إذا ما استخدم textured DiffuseMaterial أو SpecularMaterial.

للحصول على أداء أفضل، backfaces GeometryModel3D (تلك باسمة تكون خارج طريقة العرض نظراً لأنها على الجانب المعاكس الطراز الكاميرا) يتم culled المشهد. تحديد Material تطبيق backface طراز مثل الطائرة ، تعيين الطراز BackMaterial الخاصية.

تحقيق بعض خواص السطح مثل تأثيرات اللصق أو العاكسة قد تحتاج تطبيق والطباشير مختلفة عدة طراز بالتتابع. يمكن تطبيق مواد متعددة وإعادة باستخدام MaterialGroup class. يتم تطبيق الأطفال MaterialGroup أولاً الأخير في عدة مسارات التقديم.

التعليمة البرمجية التالية تبين الأمثلة كيفية تطبيق لون خالص و رسم كـ والطباشير 3-D طرازات.

<GeometryModel3D.Material>
    <DiffuseMaterial>
        <DiffuseMaterial.Brush>
            <SolidColorBrush Color="Cyan" Opacity="0.3"/>
        </DiffuseMaterial.Brush>
    </DiffuseMaterial>
</GeometryModel3D.Material>
<DrawingBrush x:Key="patternBrush" Viewport="0,0,0.1,0.1" TileMode="Tile">
  <DrawingBrush.Drawing>
    <DrawingGroup>
      <DrawingGroup.Children>
        <GeometryDrawing Geometry="M0,0.1 L0.1,0 1,0.9, 0.9,1z"
          Brush="Gray" />
        <GeometryDrawing Geometry="M0.9,0 L1,0.1 0.1,1 0,0.9z"
          Brush="Gray" />
        <GeometryDrawing Geometry="M0.25,0.25 L0.5,0.125 0.75,0.25 0.5,0.5z"
          Brush="#FFFF00" />
        <GeometryDrawing Geometry="M0.25,0.75 L0.5,0.875 0.75,0.75 0.5,0.5z"
          Brush="Black" />
        <GeometryDrawing Geometry="M0.25,0.75 L0.125,0.5 0.25,0.25 0.5,0.5z"
          Brush="#FF0000" />
        <GeometryDrawing Geometry="M0.75,0.25 L0.875,0.5 0.75,0.75 0.5,0.5z"
          Brush="MediumBlue" />
      </DrawingGroup.Children>
    </DrawingGroup>
  </DrawingBrush.Drawing>
</DrawingBrush>
            Dim side5Material As New DiffuseMaterial(CType(Application.Current.Resources("patternBrush"), Brush))
DiffuseMaterial side5Material = new DiffuseMaterial((Brush)Application.Current.Resources["patternBrush"]);

إضاءة المشهد

أضواء في 3-D هل الرسومات أضواء القيام في العالم: تجعل أسطح مرئية. أكثر إلى النقطة التي تحدد أضواء سيتم تضمين أي جزء من منظر في الإسقاط. ضوء الكائنات في WPF إنشاء مجموعة متنوعة من التأثيرات فاتح مظلل modeled بعد سلوك الحقيقي المتنوعة أضواء. يجب أن يتضمن ضوء واحد على الأقل في المشهد الخاص بك أو طرازات ستكون مرئية.

اشتقاق أضواء التالية الفئة الأساسية Light:

  • AmbientLight: يوفر الإضاءة ambient illuminates كافة الكائنات وأنها بغض النظر عن الخاصة بهم أو الاتجاه.

  • DirectionalLight: illuminates مثل ضوء بعيد . لدى أضواء اتجاهات على Direction المحدد مثل Vector3D ، لكن لا يوجد المحدد الموقع.

  • PointLight: illuminates مثل القريبة فاتح المصدر. يكون موضع PointLights ثم تحويل الضوء من هذا الموضع. هي illuminated الكائنات في المشهد استناداً إلى موضعها و المسافة بالنسبة للضوء. PointLightBaseالكشف عنRangeخاصية التي تحدد مسافة بعد الذي نماذج سوف لا تكون illuminated بواسطة الضوء. كشف PointLight أيضاً تخفيف التي تحدد كيفية diminishes شدة الضوء الذي مسافة. يمكنك تحديد interpolations ثابتة أو خطي أو quadratic عن تخفيف كان ضوء.

  • SpotLight الموروثة من: PointLight spotlights illuminate مثل PointLight و أن كلا موضع و . كانت المشروع الضوء في منطقة بشكل بوقي تعيين بواسطة InnerConeAngle و OuterConeAngle ، المحدد في درجة.

هي الأضواء Model3D الكائنات بحيث تتمكن من تحويل ومن تحريك ضوء ، بما في ذلك الموضع لون ، اتجاه و نطاق.

<ModelVisual3D.Content>
    <AmbientLight Color="#333333" />
</ModelVisual3D.Content>
        Private myDirLight As New DirectionalLight()
DirectionalLight myDirLight = new DirectionalLight();
            myDirLight.Color = Colors.White
            myDirLight.Direction = New Vector3D(-3, -4, -5)
myDirLight.Color = Colors.White;
myDirLight.Direction = new Vector3D(-3, -4, -5);
            modelGroup.Children.Add(myDirLight)
modelGroup.Children.Add(myDirLight);

طرازات التحويل.

عند إنشاء طرازات لديهم موقع محدد في المشهد. لتنقل هذه النماذج في المشهد ،استدارتها, أو تغيير حجمها, ليس من المنطقى تغيير المحاور التي تعرّف طرازات نفسها. بدلاً من ذلك، تماماً كما في 2-D تطبيق طرازات التحويلات.

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

لمزيد من المعلومات حول تحويل النماذج، راجع نظرة عامة حول التحويلات ثلاثية الأبعاد.

طرازات الحركة

تطبيق WPF 3-D يشترك في نفس التوقيت و الحركة مع الرسومات 2-D . بمعنى آخر،لتحريك منظر ثلاثي الأبعاد, تحريك الخصائص الخاصة بطرازاته. من الممكن تحريك خصائص الأوليات مباشرة لكنه عادةً أكثر سهولة تحريك تحويلات التى تغيير موضع أو مظهر طرازات. لأن تطبيق تحويلات لكائنات Model3DGroup بالإضافة إلى طرازات الفردية يمكن تطبيق مجموعة واحدة من حركات للأطفال على طراز المجموعة ثلاثى الابعاد و مجموعة أخرى من حركات لمجموعة من الكائنات. يمكنك أيضاً تحقيق مجموعة متنوعة من التأثيرات المرئية وذلك للتحريك خصائص الإضاءة المشهد الخاص بك. وأخيراً، قد لتحريك الإسقاط نفسه عن طريق تحريك موضع الكاميرا أو مجال الرؤية. للحصول على معلومات أساسية حول نظام توقيت وحركة WPF راجع نظرة عامة حول الحركة و نظرة عامة حول لوحات العمل و نظرة عامة حول الكائنات المجمدة.

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

بفرض تريد تأكد من ظهور طراز wobble في مكان. قد تختار تطبيق RotateTransform3D إلى الطراز ثم تحريك محور دوران الخاص به من موجه واحد إلى آخر. يوضح المثال التعليمات البرمجية التالي لتطبيق لخاصية محور الدوران ثلاثى الابعاد ، مع افتراض الدوران ثلالثى الابعاد يكون أحد التحويلات المطبقة على الطراز مع .

            'Define a rotation
            Dim myRotateTransform As New RotateTransform3D(New AxisAngleRotation3D(New Vector3D(0, 1, 0), 1))
//Define a rotation
RotateTransform3D myRotateTransform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 1));
            Dim myVectorAnimation As New Vector3DAnimation(New Vector3D(-1, -1, -1), New Duration(TimeSpan.FromMilliseconds(5000)))
            myVectorAnimation.RepeatBehavior = RepeatBehavior.Forever
Vector3DAnimation myVectorAnimation = new Vector3DAnimation(new Vector3D(-1, -1, -1), new Duration(TimeSpan.FromMilliseconds(5000)));
myVectorAnimation.RepeatBehavior = RepeatBehavior.Forever;
            myRotateTransform.Rotation.BeginAnimation(AxisAngleRotation3D.AxisProperty, myVectorAnimation)
myRotateTransform.Rotation.BeginAnimation(AxisAngleRotation3D.AxisProperty, myVectorAnimation);
            'Add transformation to the model
            cube1TransformGroup.Children.Add(myRotateTransform)
//Add transformation to the model
cube1TransformGroup.Children.Add(myRotateTransform);

إضافة محتوى ثلاثي الأبعاد للإطار

تقديم المشهد ، طرازات و أضواء Model3DGroup ، قم بتعيين Model3DGroup كما Content من ModelVisual3D. قم بإضافة ModelVisual3D إلى الخاصية Children من Viewport3D. إضافة الكاميرات إلى Viewport3D بواسطة إعداد به Camera .

وأخيراً، إضافة Viewport3D الإطار. عند Viewport3D يتم تضمين كما محتوى عنصر تخطيط مثل لوحة قماشية ، حدد حجم Viewport3D بواسطة إعداد به Height و Width خصائص (موروثة FrameworkElement).

<UserControl x:Class="HostingWpfUserControlInWf.UserControl1"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    >

    <Grid>

      <!-- Place a Label control at the top of the view. -->
      <Label 
                HorizontalAlignment="Center" 
                TextBlock.TextAlignment="Center" 
                FontSize="20" 
                Foreground="Red" 
                Content="Model: Cone"/>

      <!-- Viewport3D is the rendering surface. -->
      <Viewport3D Name="myViewport" >

        <!-- Add a camera. -->
        <Viewport3D.Camera>
          <PerspectiveCamera 
                        FarPlaneDistance="20" 
                        LookDirection="0,0,1" 
                        UpDirection="0,1,0" 
                        NearPlaneDistance="1" 
                        Position="0,0,-3" 
                        FieldOfView="45" />
        </Viewport3D.Camera>

        <!-- Add models. -->
        <Viewport3D.Children>

          <ModelVisual3D>
            <ModelVisual3D.Content>

              <Model3DGroup >
                <Model3DGroup.Children>

                  <!-- Lights, MeshGeometry3D and DiffuseMaterial objects are added to the ModelVisual3D. -->
                  <DirectionalLight Color="#FFFFFFFF" Direction="3,-4,5" />

                  <!-- Define a red cone. -->
                  <GeometryModel3D>

                    <GeometryModel3D.Geometry>
                      <MeshGeometry3D 
    Positions="0.293893 -0.5 0.404509  0.475528 -0.5 0.154509  0 0.5 0  0.475528 -0.5 0.154509  0 0.5 0  0 0.5 0  0.475528 -0.5 0.154509  0.475528 -0.5 -0.154509  0 0.5 0  0.475528 -0.5 -0.154509  0 0.5 0  0 0.5 0  0.475528 -0.5 -0.154509  0.293893 -0.5 -0.404509  0 0.5 0  0.293893 -0.5 -0.404509  0 0.5 0  0 0.5 0  0.293893 -0.5 -0.404509  0 -0.5 -0.5  0 0.5 0  0 -0.5 -0.5  0 0.5 0  0 0.5 0  0 -0.5 -0.5  -0.293893 -0.5 -0.404509  0 0.5 0  -0.293893 -0.5 -0.404509  0 0.5 0  0 0.5 0  -0.293893 -0.5 -0.404509  -0.475528 -0.5 -0.154509  0 0.5 0  -0.475528 -0.5 -0.154509  0 0.5 0  0 0.5 0  -0.475528 -0.5 -0.154509  -0.475528 -0.5 0.154509  0 0.5 0  -0.475528 -0.5 0.154509  0 0.5 0  0 0.5 0  -0.475528 -0.5 0.154509  -0.293892 -0.5 0.404509  0 0.5 0  -0.293892 -0.5 0.404509  0 0.5 0  0 0.5 0  -0.293892 -0.5 0.404509  0 -0.5 0.5  0 0.5 0  0 -0.5 0.5  0 0.5 0  0 0.5 0  0 -0.5 0.5  0.293893 -0.5 0.404509  0 0.5 0  0.293893 -0.5 0.404509  0 0.5 0  0 0.5 0  " 
    Normals="0.7236065,0.4472139,0.5257313  0.2763934,0.4472138,0.8506507  0.5308242,0.4294462,0.7306172  0.2763934,0.4472138,0.8506507  0,0.4294458,0.9030925  0.5308242,0.4294462,0.7306172  0.2763934,0.4472138,0.8506507  -0.2763934,0.4472138,0.8506507  0,0.4294458,0.9030925  -0.2763934,0.4472138,0.8506507  -0.5308242,0.4294462,0.7306172  0,0.4294458,0.9030925  -0.2763934,0.4472138,0.8506507  -0.7236065,0.4472139,0.5257313  -0.5308242,0.4294462,0.7306172  -0.7236065,0.4472139,0.5257313  -0.858892,0.429446,0.279071  -0.5308242,0.4294462,0.7306172  -0.7236065,0.4472139,0.5257313  -0.8944269,0.4472139,0  -0.858892,0.429446,0.279071  -0.8944269,0.4472139,0  -0.858892,0.429446,-0.279071  -0.858892,0.429446,0.279071  -0.8944269,0.4472139,0  -0.7236065,0.4472139,-0.5257313  -0.858892,0.429446,-0.279071  -0.7236065,0.4472139,-0.5257313  -0.5308242,0.4294462,-0.7306172  -0.858892,0.429446,-0.279071  -0.7236065,0.4472139,-0.5257313  -0.2763934,0.4472138,-0.8506507  -0.5308242,0.4294462,-0.7306172  -0.2763934,0.4472138,-0.8506507  0,0.4294458,-0.9030925  -0.5308242,0.4294462,-0.7306172  -0.2763934,0.4472138,-0.8506507  0.2763934,0.4472138,-0.8506507  0,0.4294458,-0.9030925  0.2763934,0.4472138,-0.8506507  0.5308249,0.4294459,-0.7306169  0,0.4294458,-0.9030925  0.2763934,0.4472138,-0.8506507  0.7236068,0.4472141,-0.5257306  0.5308249,0.4294459,-0.7306169  0.7236068,0.4472141,-0.5257306  0.8588922,0.4294461,-0.27907  0.5308249,0.4294459,-0.7306169  0.7236068,0.4472141,-0.5257306  0.8944269,0.4472139,0  0.8588922,0.4294461,-0.27907  0.8944269,0.4472139,0  0.858892,0.429446,0.279071  0.8588922,0.4294461,-0.27907  0.8944269,0.4472139,0  0.7236065,0.4472139,0.5257313  0.858892,0.429446,0.279071  0.7236065,0.4472139,0.5257313  0.5308242,0.4294462,0.7306172  0.858892,0.429446,0.279071  "                   TriangleIndices="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 " />
                    </GeometryModel3D.Geometry>

                    <GeometryModel3D.Material>
                      <DiffuseMaterial>
                        <DiffuseMaterial.Brush>
                          <SolidColorBrush 
                            Color="Red" 
                            Opacity="1.0"/>
                        </DiffuseMaterial.Brush>
                      </DiffuseMaterial>
                    </GeometryModel3D.Material>

                  </GeometryModel3D>

                </Model3DGroup.Children>
              </Model3DGroup>

            </ModelVisual3D.Content>

          </ModelVisual3D>

        </Viewport3D.Children>

      </Viewport3D>
    </Grid>

</UserControl>

راجع أيضًا:

المبادئ

نظرة عامة حول التحويلات ثلاثية الأبعاد

الأشكال و الرسم الأساسي في نظرة عامة WPF

رسم صور و رسومات و صور