نظرة عامة حول التحويلات ثلاثية الأبعاد
يصف هذا الموضوع كيفية تطبيق تحويلات إلى طراز ثلاثي الأبعاد في الرسومات Windows Presentation Foundation (WPF) . التحويلات تسمح للمطور صواب تغيير موضع و تغيير حجم إتجاه طرازات دون تغيير القيم الأساسية التي تعريفها.
يشتمل هذا الموضوع على الأقسام التالية.
- إحداثيات الفراغ ثلاثي الأبعاد
- طرازات التحويل.
- تحويلات الترجمة
- تحويلات المقياس
- تحويلات الدوران
- باستخدام مجموعات تحويل
- تحويلات الحركة.
- موضوعات ذات صلة
إحداثيات الفراغ ثلاثي الأبعاد
محتوى الرسومات فيWindows Presentation Foundation (WPF) يتم تغليفها في عنصر ماViewport3D ، الذي يمكنه المشاركة في بنية عنصر ثنائي الأبعاد. الرسومات يعامل منفذ العرض ثلاثى الابعاد كعنصر مرئى ثنائية الأبعاد مثل العديد من الآخرين في Windows Presentation Foundation (WPF). منفذ العرض ثلاثى الابعاد يعمل كإطار — منفذ العرض — في منظر ثلاثي الأبعاد. بشكل أكثر دقة هو السطح الذي يتم عليه إسقاط مشهد ثلاثى الابعاد . على الرغم من أنك يمكنك استخدام منفذ العرض ثلاثى الابعاد مع الكائنات الرسومية الأخرى الثنائية الابعاد في رسم مشهد واحد لا يمكنك تتداخل الكائنات ثنائي الأبعاد مع ثلاثي الأبعاد داخل منفذ العرض ثلاثى الابعاد . في المناقشة التالية الإحداثيات الموصوفة محتواه بعنصر منفذ العرض ثلاثى الابعاد.
نظام الإحداثياتWindows Presentation Foundation (WPF) للرسومات الثتائية الابعاد يحدد نقطة الأصل في أعلى يمين مساحة العرض (عادةً الشاشة). في النظام الثنائى الابعاد، قيم المحور س موجبة إلى اليمين، و قيم المحور ص موجبة إلى أسفل. في نظام الإحداثيات الثلالثى الابعاد ، على الرغم من ذلك، نقطة الأصل موجودة في وسط منطقة العرض ،مع قيم المحور س موجبة متابعة إلى اليمين ولكن القيم الموجبة للمحور ص متابعة إلى أعلى و قيم المحور ع الموجبة متابعة إلى الخارج من نقطة الأصل باتجاه العارض.
مقارنة نظام إحداثيات
الفضاء المعرّف من قِبل هذه المحاور هو المرجع من إطارا ثابتًا للكائنات ثلالثية الابعاد فى Windows Presentation Foundation (WPF) . أثناء إنشاء نماذج في هذا الفراغ و إنشاء أضواء والكاميرات عرضها ، يكون من المفيد التمييز لهذا الإطار الثابت من المرجع ، أو العالم الفراغي، من المرجع من الإطار المحلي يمكنك إنشاء لكل طراز عند تطبيق تحويلات عليه. تذكر أيضاً أن الكائنات في العالم الفراغي قد تبدو مختلفة تماماً أو تكون غير مرئية على الإطلاق اعتماداً على إعدادات الضوء و الكاميرا و لكن تغيير موضع الكاميرا لا يغير من موضع الكائنات في العالم الفراغي.
طرازات التحويل.
عند إنشاء طرازات لديهم موقع محدد في المشهد. لتنقل هذه النماذج في المشهد ،استدارتها, أو تغيير حجمها, ليس من المنطقى تغيير المحاور التي تعرّف طرازات نفسها. بدلاً من ذلك، تماماً كما في ثنائي الأبعاد تطبيق طرازات التحويلات.
يحتوي كل كائن الطراز على خاصيةTransform التي تمكنك من نقل،تغيير إتجاه أو تغيير حجم طراز. عند تطبيق تحويل،يمكنك بفاعلية إزاحة كافة نقاط للطراز بواسطة أي خط متجه أو القيمة تحدد بواسطة التحويل. بمعنى آخر، تم تحويل فضاء الإحداثى حيث تم تعريف الطراز ("طراز الفضاء '') ، ولكن لم يتم تغيير القيم التي تكون هندسة الطراز في نظام الإحداثيات المشهد بالكامل (" فضاء العالم ").
تحويلات الترجمة
ترث التحويلات ثلاثية فئة أساسية مجردة Transform3D; وتتضمن فئات التحويل TranslateTransform3D ، ScaleTransform3D ، و RotateTransform3D. نظامWindows Presentation Foundation (WPF)الثلاثي الأبعاد MatrixTransform3D الفئة التي تمكنك من تحديد تحويلات نفسه في أكثر إيجازاً لعمليات المصفوفات.
TranslateTransform3D تنقل كافة نقاط في طراز ثلاثى الابعاد في اتجاه متجه الإزاحة التي تحددها معOffsetX ،OffsetY ، و خصائصOffsetZ . على سبيل المثال، إعطاء قمة رأس واحد من مكعب في (2,2,2) ، متجه إزاحة من (0,1.6,1) ستنقل تلك القمة (2,2,2) إلى (2,3.6,3). قمة رأس المكعب لا تزال (2,2,2) فى فضاء الطراز ولكن الآن تم تغييرعلاقة تلك الفضاء طراز لفضاء العالم حتى ان (2,2,2) في مساحة طراز (2,3.6,3) في مساحة العالم.
الترجمة مع الإزاحة
الأمثلة البرمجية التالية تبين كيفية تطبيق الترجمة.
<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="600" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="600" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- Defines the camera used to view the 3D object. -->
<Viewport3D.Camera>
<PerspectiveCamera x:Name="myPerspectiveCamera" Position="0,0,2" LookDirection="0,0,-1"
FieldOfView="60" />
</Viewport3D.Camera>
<!-- The ModelVisual3D children contain the 3D models -->
<Viewport3D.Children>
<!-- This ModelVisual3D defines the light cast in the scene. Without light, the
3D object cannot be seen. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created. -->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5 " />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Cyan" Opacity="0.3"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The OffsetX property is animated
in the Storyboard below. -->
<GeometryModel3D.Transform>
<TranslateTransform3D x:Name="myTranslateTransform3D" OffsetX="0" OffsetY="0" OffsetZ="0" />
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the TranslateTransform3D animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- This animation animates the OffsetX property of the TranslateTransform3D. -->
<DoubleAnimation
Storyboard.TargetName="myTranslateTransform3D"
Storyboard.TargetProperty="OffsetX"
To="-0.8"
AutoReverse="True" RepeatBehavior="Forever" />
<!-- If you want to animate OffsetY and/or OffsetZ, create similar DoubleAnimations
respectively. -->
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
تحويلات المقياس
ScaleTransform3D تغير مقياس الطراز بواسطة المحدد المتجه مع الإشارة إلى نقطة الوسط. حدد مقياس موحد ،لتحجيم الطراز بواسطة نفس القيمة في المحاور س و ص و ع لتغيير حجم الطراز بشكل متناسب. على سبيل المثال، تعيين خصائص التحويل ScaleX ، ScaleY ، و ScaleZ إلى 0.5 حجم الطراز; تعيين نفس الخصائص إلى ضعفين المقياس في كافة المحاور الثلاثة.
مثال للمقياس الناقل.
عن طريق تحديد تحويل غير موحد — تحويل المقياس عند قيم س و ص و ع ليست كافة متماثلة — قد يؤدي ذلك إلى تمدد أو العقد في بعد واحد أو اثنتين للطراز دون التأثير على الآخرين . على سبيل المثال، تعيين ScaleX إلى 1، ScaleY إلى 2، و ScaleZ إلى 1 يؤدي الطراز المحول إلى إزدوجاً في الارتفاع ولكن تبقى بدون تغيير طول محاور X وZ .
بشكل افتراضي، يتسبب تحويل المقياس ثلالثى الابعاد فى توسيع أو عقد قمة الرؤوس حول الأصل (0,0,0). إذا لم يتم رسم مساحة الطراز الذي تريد التحويل من نقطة الأصل ، على الرغم من ذلك، تحجيم الطراز من الأصل لن يحجم الطراز "في مكانه". بدلاً من ذلك، عند قمة رؤوس الطراز يتم ضربها فى خط متجه ، عملية المقياس سيكون لها تأثير ترجمة الطراز بالإضافة إلى تغيير مقياسه .
مثال مركز المقياس
لتحجيم نموذج "في المكان" تحديد وسط الطراز بواسطة إعداد تحويل المقياس ثلاثى الابعاد الخاص ب CenterX ، CenterY ، و خصائص CenterZ . هذا يضمن تحجيم مساحة طرازلنظام الرسومات ومن ثم يترجمها إلى الوسط على Point3Dالمحدد. وعلى العكس، في حالة إنشاء الطراز حول الأصل و تحديد نقطة وسط مختلفة، تتوقع ترجمة الطراز بعيداً عن الأصل.
تحويلات الدوران
يمكنك تدوير طراز ثلاثي الأبعاد بعدة طرق مختلفة. تحويل استدارة نموذجية تحدد محور و زاوية الاستدارة حول هذا المحور. الفئة RotateTransform3D تتيح لك تحديد Rotation3D مع الخاصية Rotation الخاصة به. يمكنك تحديد Axis و خصائص Angle على الدوران ثلاثى الابعاد، في هذه الحالة AxisAngleRotation3D ، لتعريف التحويل. هذا المثال يوضحاستدارة النموذج بواسطة 60 درجة حول ص.
<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- Defines the camera used to view the 3D object. -->
<Viewport3D.Camera>
<PerspectiveCamera x:Name="myPerspectiveCamera" Position="0,0,2" LookDirection="0,0,-1"
FieldOfView="60" />
</Viewport3D.Camera>
<!-- The ModelVisual3D children contain the 3D models -->
<Viewport3D.Children>
<!-- Two ModelVisual3D define the lights cast in the scene. Without light, the
3D object cannot be seen. Also, the direction of the lights affect shadowing. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created. -->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5 " />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The properties of the
Rotation object are animated causing the 3D object to rotate and "wobble" (see Storyboard below).-->
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="myAngleRotation" Axis="0,3,0" Angle="40" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the rotation animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- This animation animates the Angle property of the AxisAngleRotation3D
making the 3D object rotate from -60 degrees to 60 degrees. -->
<DoubleAnimation
Storyboard.TargetName="myAngleRotation"
Storyboard.TargetProperty="Angle"
From="-60" To="60" Duration="0:0:4" AutoReverse="True" RepeatBehavior="Forever"/>
<!-- This animation animates the Axis property of the AxisAngleRotation3D
making the 3D wobble as it rotates. -->
<Vector3DAnimation
Storyboard.TargetName="myAngleRotation"
Storyboard.TargetProperty="Axis"
From="0,3,0" To="1,0,1" Duration="0:0:4" AutoReverse="True" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
ملاحظة:Windows Presentation Foundation (WPF) ثلاثي الأبعاد هو نظام اليداليمني،قيمة زاوية موجبة للحصول على نتائج استدارة في استدارة عكس اتجاه عقارب الساعة حول المحور.
دوران المحور-الزاوية يفترض الاستدارة حول الأصل إذا لم يتم تحديد قيمة CenterX ، CenterY ، و خصائص CenterZ على دوران ثلاثى الابعاد. كما مع التحجيم، يكون من المفيد تذكر أن تحويلات الاستدارة تحول كامل احداثى فضاء الطراز . إذا لم يتم إنشاء الطراز حول نقطة الأصل أو قد تم ترجمة سابقاً، الدوران قد "يدور على محور" حول نقطة الاصل بدلاً من التدوير في نفس المكان.
استدارة بنقطة مركز جديدة محددة.
لاستدارة الطراز "في مكانه" حدد مركز الطراز الفعلى كمركز الاستدارة. لأنه يتم عادةً عمل نموذج الهندسة حول الأصل, يمكنك الحصول غالباً على النتيجة المتوقعة من مجموعة من تحويلات بواسطة تغيير الحجم الاولى للطراز (تحجيم عليه) ، ثم تعيين اتجاه الخاص به (تدوير عليه) ، ونقلها وأخيراً تحريكها للموقع المطلوب (ترجمة عليه).
مثال للدوران
دوران المحاور-زاوية للعمل بشكل جيد لتحويلات ثابتة و بعض الحركات. ومع ذلك،اعتبر تدوير طراز مكعب 60 درجة حول محور X ، ثم 45 درجة حول محور Z . يمكنك وصف هذا التحويل كجهازي تحويلات منفصلة أو كما هو مصفوفة. ومع ذلك، قد يكون صعبًا تشجيع بشكل متجانس الاستدارة بهذه الطريقة المعرفة. على الرغم من أن مواضع طراز محسوبة من قبل أسلوب آخر فالبداية والنهاية هي نفسها، مواضع المتوسطة تم التقاطها بواسطة الطراز غير مؤكدة حسابيا. تمثل الكواتيرنيون طريقة بديلة لحساب التداخل بين بداية ونهاية الاستدارة.
يمثل الكواتيرنيون محور فى فضاء ثلاثى الأبعاد والاستدارة حول هذا المحور. على سبيل المثال، قد يمثل الكواتيرنيون (1,1,2) محور و استدارة 50 درجة. يأتي طاقة الكواتيرنيون في تعريف الدوران من عمليتين التي يمكن القيام بها: التركيب و التداخل. تركيب الكواتيرنيون جهازي تطبق على هندسة يعني "استدارة الهندسة حول محور آخر بإستدارة أخرى ثم استدارة حول المحور الاول بالدوران الاول." يمكنك ضم دورانين على الهندسة باستخدام التركيب للحصول على الكواتيرنيون واحد يمثل الناتج. لأنه يمكن تداخل الكواتيرنيون حساب مسار متجانس و معقول من المحور وفوق اتجاه آخر, يمكنك التداخل من الأصلي للكواتيرنيون لتحقيق انتقال متجانسة من أحد لأخر، يمكنك تحريك التحويل لها. للطرازات التي تريد تحريكها يمكنك تحديد وجهة Quaternion لاستدارة باستخدام QuaternionRotation3D للخاصية Rotation .
باستخدام مجموعات تحويل
عند إنشاء منظر ، من الشائع تطبيق اكر من تحويل للطراز. إضافة التحويلات إلى Children مجموعة من فئة Transform3DGroup لتحويل المجموعة بصورة مناسبة لتطبق على نماذج متعددة في المشهد. غالباً ملائمة إعادة استخدام التحويل في عدة مجموعات مختلفة، في معظم الطرق يمكنك إعادة استخدام طراز بتطبيق مجموعة مختلفة من التحويلات لكل نموذج. لاحظ أن الترتيب التحويلات يتم إضافتها في المجموعة الهامة: ويتم تطبيق التحويلات في المجموعة من الأول إلى الأخير.
تحويلات الحركة.
تطبيق Windows Presentation Foundation (WPF) ثلاثي الابعاد يشترك في نفس توقيت والحركة مع الرسومات ثنائية الأبعاد. بمعنى آخر،لتحريك منظر ثلاثي الأبعاد, تحريك الخصائص الخاصة بطرازاته. من الممكن تحريك خصائص الأوليات مباشرة لكنه عادةً أكثر سهولة تحريك تحويلات التى تغيير موضع أو مظهر طرازات. لأن تطبيق تحويلات لكائنات Model3DGroup بالإضافة إلى طرازات الفردية يمكن تطبيق مجموعة واحدة من حركات للأطفال على طراز المجموعة ثلاثى الابعاد و مجموعة أخرى من حركات لمجموعة من الكائنات. للحصول على معلومات أساسية حول نظام توقيت وحركة Windows Presentation Foundation (WPF) راجع نظرة عامة حول الحركة و نظرة عامة حول لوحات العمل.
لتحريك كائن في Windows Presentation Foundation (WPF) أو إنشاء مخطط زمني أو تعريف حركة (الذي هو فعلاً تغيير في بعض قيم الخاصية عبر الوقت) ، حدد الخاصية الذي يتم تطبيق الحركة. هذه الخاصية يجب أن تكون خاصية من FrameworkElement. لأن كافة الكائنات الموجودة في منظر ثلاثي الأبعاد أطفال لمنفذ العرض ثلاثى الابعاد ، الخصائص المستهدفة بواسطة أي حركة للتطبيق على المشهد يتم كخصائص منفذ العرض ثلاثى الابعاد. من المهم العمل خارج الخاصية لمسار الحركة بعناية ، لأنه يمكن أن يكون بناء الجملة مطوّل.
بفرض تريد إجراء استدارة كائن في مكان, ولكن أيضاً تأرجح الحركة لعرض أكثر من كائن للعرض. قد تختار تطبيق تحيل الدوران ثلالثى الابعاد إلى الطراز ثم تحريك محور دوران الخاص به من موجه واحد إلى آخر. يوضح المثال التعليمات البرمجية التالي لتطبيق Vector3DAnimation لخاصية محور الدوران ثلاثى الابعاد ، مع افتراض الدوران ثلالثى الابعاد يكون أحد التحويلات المطبقة على الطراز مع TransformGroup.
'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;
استخدم بناء جملة مشابهة لاستهداف خصائص أخرى للتحويل ، نقل أو تغيير حجم الكائن. على سبيل المثال، قد تطبق Point3DAnimation إلى خاصية مركز التحجيم على مقياس تحويل لتسببتشوه الطراز بشكل متجانس .
على الرغم من أن الأمثلة السابقة تحويل الخصائص GeometryModel3D, من الممكن أيضاً تحويل خصائص الطرازات الأخرى في المشهد. عن طريق تحريك الكائنات المطبقة على الكائنات المضيئة, على سبيل المثال، يمكنك إنشاء ضوء متنقل وتأثيرات الظل التي يمكن تغيير مظهر طرازات الخاص بك بشكل كبير.
لأن الكاميرات أيضاً طرازات, فمن الممكن تحويل خصائص الكاميرا أيضاً. بينما يمكنك تغيير مظهر المشهد بالتأكيد قبل تحويل مسافات الطائرة أو موقع الكاميرا — سارية المفعول تحويل الإسقاط المشهد بأكمله — لاحظ أن العديد من تأثيرات تحقيق بهذه الطريقة قد لا معنى قدر “ المرئية ” للعارض مثل تطبيق تحويلات موقع أو موضع النماذج في المشهد.