Cách tham chiếu trên hệ trục tọa độ để vẽ một vật thể

Một phần của tài liệu B GIAO DC VA DAO TO TRNG CAO DNG c (Trang 47)

Trang 39

Chương trình TranslateTransformExperimenter.xaml cho phép bạn thử nghiệm với

TranslateTransform3D. Chương trình vẽ ra một vật thể nối giữa các đoạn thẳng đơn giản như

hình sau:

Hình 2.1-2: Hình ảnh được vẽ bằng cách nói các đoạn thẳng.

Nó là một đơn vịcao, hai đơn vị rộng, và ba đơn vị sâu. Góc bên trái phía trước là gốc.

Chương trình có ba thanh trượt trên đầu trang để thay đổi OffsetX, OffsetY, và OffsetZ

thuộc tính của một TranslateTransform3D áp dụng cho GeometryModel3D. Ba thanh cuộn

thay đổi các thuộc tính phía dưới cùng của một TranslateTransform3D áp dụng cho

PerspectiveCamera.

TranslateTransformExperimenter.xaml

<!-- ================================================================= TranslateTransformExperimenter.xaml (c) 2007 by Charles Petzold ================================================================= --> <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" WindowTitle="TranslateTransform3D Experimenter" Title="TranslateTransform3D Experimenter"> <DockPanel>

<ScrollBar Name="xMod" DockPanel.Dock="Top" Orientation="Horizontal" 1 (0, 0, -3) 5 (2, 1, -3) 4 (2, 1, 0) 3 (2, 0, 0) 2 (0, 0, 0) 6 (2, 0, -3)

Trang 40

Minimum="-5" Maximum="5" Value="0" ToolTip="Model X" />

<ScrollBar Name="yMod" DockPanel.Dock="Top" Orientation="Horizontal"

Minimum="-5" Maximum="5" Value="0" ToolTip="Model Y" />

<ScrollBar Name="zMod" DockPanel.Dock="Top" Orientation="Horizontal"

Minimum="-5" Maximum="5" Value="0" ToolTip="Model Z" />

<ScrollBar Name="zCam" DockPanel.Dock="Bottom" Orientation="Horizontal"

Minimum="-5" Maximum="5" Value="0" ToolTip="Camera Z" />

<ScrollBar Name="yCam" DockPanel.Dock="Bottom" Orientation="Horizontal"

Minimum="-5" Maximum="5" Value="0" ToolTip="Camera Y" />

<ScrollBar Name="xCam" DockPanel.Dock="Bottom" Orientation="Horizontal"

Minimum="-5" Maximum="5" Value="0" ToolTip="Camera X" /> <Viewport3D> <ModelVisual3D> <ModelVisual3D.Content> <Model3DGroup> <GeometryModel3D> <GeometryModel3D.Geometry>

<!-- Front, rear, top, right, bottom. --> <MeshGeometry3D Positions="0 0 0, 2 0 0, 2 1 0, 0 0 -3, 2 0 -3, 2 1 -3, 2 1 -3, 0 0 -3, 2 1 0, 0 0 0, 2 1 0, 2 0 0, 2 1 -3, 2 0 -3, 2 0 0, 0 0 0, 2 0 -3, 0 0 -3" TriangleIndices=" 0 1 2, 3 5 4, 6 7 8, 7 9 8, 10 11 12, 11 13 12, 14 15 16, 15 17 16" /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial Brush="Cyan" /> </GeometryModel3D.Material> <GeometryModel3D.Transform> <Transform3DGroup> <TranslateTransform3D OffsetX="{Binding ElementName=xMod, Path=Value}" OffsetY="{Binding ElementName=yMod, Path=Value}" OffsetZ="{Binding ElementName=zMod, Path=Value}" /> </Transform3DGroup> </GeometryModel3D.Transform> </GeometryModel3D> <!-- Light sources. -->

Trang 41

<AmbientLight Color="#404040" />

<DirectionalLight Color="#C0C0C0" Direction="2 -3 -1"> <DirectionalLight.Transform>

<Transform3DGroup>

<!-- Placeholder for light transform. --> </Transform3DGroup>

</DirectionalLight.Transform> </DirectionalLight>

<Model3DGroup.Transform> <Transform3DGroup>

<!-- Placeholder for group transform. --> </Transform3DGroup> </Model3DGroup.Transform> </Model3DGroup> </ModelVisual3D.Content> <ModelVisual3D.Transform> <Transform3DGroup>

<!-- Placeholder for visual transform. --> </Transform3DGroup> </ModelVisual3D.Transform> </ModelVisual3D> <!-- Camera. --> <Viewport3D.Camera> <PerspectiveCamera Position="-2 2 4" LookDirection="2 -1 -4" UpDirection="0 1 0" FieldOfView="45"> <PerspectiveCamera.Transform> <Transform3DGroup> <TranslateTransform3D OffsetX="{Binding ElementName=xCam, Path=Value}" OffsetY="{Binding ElementName=yCam, Path=Value}" OffsetZ="{Binding ElementName=zCam, Path=Value}" /> </Transform3DGroup> </PerspectiveCamera.Transform> </PerspectiveCamera> </Viewport3D.Camera> </Viewport3D> </DockPanel> </Page>

Viewport3D đây là trung tâm của một DockPanel. phía trên là ba ScrollBar điều khiển, và dưới ba ScrollBar về độ sâu của vật thể. Sáu ScrollBar đều có khoảng từ -5 đến 5. Ba ScrollBar đầu trang có tên "xMod", "yMod", và "zMod", chuyển đổi về GeometryModel3D:

<GeometryModel3D.Transform> <Transform3DGroup>

Trang 42

<TranslateTransform3D

OffsetX="{Binding ElementName=xMod, Path=Value}" OffsetY="{Binding ElementName=yMod, Path=Value}" OffsetZ="{Binding ElementName=zMod, Path=Value}" /> </Transform3DGroup>

</GeometryModel3D.Transform>

TranslateTransform3D gồm có OffsetX, OffsetY, và OffsetZ thuộc tính của nó thiết lập để gán dữ liệu giá trị gia tăng của ba ScrollBar đầu trang. Một biến đổi áp dụng cho một

GeometryModel3D ảnh hư ng đến tất cảcác điểm trong bộsưu tập Positions được xác định b i MeshGeometry3D. Khi bạn di chuyển ScrollBar trên cùng về bên phải, sẽ biến đổi vật thể

về bên phải dọc theo trục X. Bạn cũng có thể thiết lập giá trị âm để OffsetX bằng cách di chuyển thanh cuộn về bên trái. Tương tự như vậy, các giá trị dương của OffsetY di chuyển vật thể lên, và các giá trịdương của OffsetZ di chuyển con số gần hơn về phía ngư i xem.

Các thanh cuộn dưới cùng của trang được liên kết với một TranslateTransform3D áp dụng cho Camera:

<PerspectiveCamera.Transform> <Transform3DGroup>

<TranslateTransform3D

OffsetX="{Binding ElementName=xCam, Path=Value}" OffsetY="{Binding ElementName=yCam, Path=Value}" OffsetZ="{Binding ElementName=zCam, Path=Value}" /> </Transform3DGroup>

</PerspectiveCamera.Transform>

Biến đổi này ảnh hư ng đến các thuộc tính Position của máy ảnh. Khi bạn di chuyển thanh cuộn đầu của ba thanh cuộn phía dưới sang bên phải, máy ảnh này sẽ di chuyển sang phải và con số này dư ng như di chuyển sang trái. Nói chung, một biến đổi áp dụng cho một máy ảnh thực

hiện kết quả nghịch đảo của so với một biến đổi áp dụng cho một vật thể 3D.

2.2. Phép bi n đ i kích th c (ScaleTransform3D)

ScaleTransform3D này làm cho một vật thể lớn hơn hoặc nhỏ hơn bằng cách nhân X, Y, và Z của nó tọa độ thuộc tính được đặt tên ScaleX, ScaleY, và ScaleZ, tất cả đều có giá trị mặc

định là 1. Dưới đây là cách ScaleTransform3D có thể xuất hiện trong XAML để biến đổi một

GeometryModel3D: <GeometryModel3D> …

Trang 43

<ScaleTransform3D ScaleX="3" ScaleY="1" ScaleZ="2" /> </GeometryModel3D.Transform>

</GeometryModel3D>

Vật thể này được m rộng kích thước theo trục X là 3 và tăng gấp đơi kích thước dọc theo trục Z. Thuộc tính ScaleY thiết lập giá trị mặc định của nó và có thể được gỡ bỏ. Cách thức chuyển đổi công thức là:

′ = �� � ∗

′ = �� � ∗

′ = �� � ∗

Tuy nhiên, đây không phải là công thức thay đổi kích thước hồn chỉnh. Bạn có thể thay đổi

kích thước bằng cách thay đổi ba thuộc tính của ScaleTransform3D tên CenterX, CenterY,

và CenterZ, tất cảđều có giá trị mặc định là 0. Cách thức chuyển đổi bằng các công thức: ′ =�� � ∗ − � � +� �

′= �� � ∗ − � � +� � ′ =�� � ∗ − � � + � �

Hãy lấy một ví dụ: Giả sử một đối tượng 3D có các giá trị X khoảng từ0 đến 2. Nếu ScaleX là 2, các giá trị này sẽ chuyển đổi khoảng từ 0 đến 4. Nhưng nếu CenterX được thiết lập là 1, X

ban đầu giá trị 0 là giảm đi b i 1 để được -1, sau đó nhân với 2 để được -2, và sau đó CenterX được thêm vào là -1. Giá trị X của 2 là giảm đi b i CenterX được 1, nhân với 2 được 2, và sau đó được thêm một lần nữa CenterX được 3. Các đối tượng chuyển bây gi kéo dài dọc theo trục X từ -1 đến 3. Nó vẫn cịn tăng gấp đơi kích thước, nhưng đó là một phần của đối tượng trong đó X là giá trị của 1 CenterX.

Bạn có thể thêm trực tiếp các thuộc tính sau đây vào ScaleTransform3D trong file XAML:

CenterX = "1" CenterY = "0,5" CenterZ = "-1,5"

K t h p phép d ch chuy n và phép bi n đ i

Ngư i ta thư ng áp dụng nhiều biến đổi trong cùng một mơ hình hay hình ảnh. Để làm điều này, bạn cần phải xác định các biến đổi để biến đổi trong Transform3DGroup:

<GeometryModel3D.Transform> <Transform3DGroup>

...

</Transform3DGroup>

Trang 44

Transform3DGroup này có thể có nhiều biến đổi bên trong, các phép biến đổi tương đương

với phép nhân ma trận, và không phải là phép nhân ma trận giao hốn. Trình tự các biến đổi xuất hiện trong Transform3DGroup sẽđược thực hiện khác nhau.

Đối với nhiều biến đổi của TranslateTransform3D, kết quả chỉ đơn giản là tổng của thuộc tính OffsetX, OffsetY, và OffsetZ. Nếu một Transform3DGroup có chứa nhiều liên kết

TranslateTransform3D liên tiếp với giá trị rõ ràng, thì có thể cải thiện kết quả bằng cách kết hợp chúng lại thành một. Tuy nhiên, nếu một TranslateTransform3D đặc biệt bị ảnh hư ng b i một dữ liệu ràng buộc hoặc hình ảnh động, có thể sẽ khơng có khả năng kết hợp nó với các biến đổi khác.

Tương tự, nếu các thuộc tính CenterX, CenterY, và CenterZ của một

ScaleTransform3D với giá trị măc định là 0, tương đương ScaleTransform3D với một

chuyển đổi chỉ chứa các thuộc tính ScaleX, ScaleY, và ScaleZ.

Nhưng kết hợp một TranslateTransform3D và một ScaleTransform3D, hoặc quy mô nhiều biến đổi với các tâm điểm không phải mặc định, và bạn thực sự cần phải biết những gì bạn

đang làm.

Trư ng hợp kết hợp một TranslateTransform3D và một ScaleTransform3D với tâm

điểm mặc định. Nếu TranslateTransform3D thực hiện trước, các công thức chuyển đổi là:

′ = +�

′= +� ′ = + �

Các ScaleTransform3D (với tâm điểm mặc định) sau đó được tổng hợp là:

′′ = �� � ∗ ′ =�� � ∗( +� )

′′ = �� � ∗ ′ =�� � ∗( +� )

′′ = �� � ∗ ′ = �� � ∗( +� )

Bây gi hãy thử thứ tự khác. Các ScaleTransform3D thực hiện trước:

′ = �� � ∗

′ = �� � ∗

Trang 45

Các TranslateTransform3D:

′′ = ′ +� = �� � ∗ +�

′′ = ′ +� =�� � ∗ +�

′′ = ′ +� =�� � ∗ +�

Trong thực tế, các thuộc tính CenterX, CenterY, và CenterZ của ScaleTransform3D có thểđược hình dung như là một biến đổi kép nơi một biến đổi dịch chuyển được thực hiện trước và sau đó là phép biến đổi kích thước. Đây là một biến đổi kích thước với tất cả các thuộc tính của nó thiết lập để các giá trị tượng trưng:

<ScaleTransform3D ScaleX="SX" ScaleY="SY" ScaleZ="SZ" CenterX="CX" CenterY="CY" CenterZ="CZ" />

Điều đó tương đương với:

<TranslateTransform3D OffsetX="-CX" OffsetY="-CY" OffsetZ="-CZ" /> <ScaleTransform3D ScaleX="SX" ScaleY="SY" ScaleZ="SZ" />

<TranslateTransform3D OffsetX="CX" OffsetY="CY" OffsetZ="CZ" />

Nó cũng tương đương với:

<ScaleTransform3D ScaleX="SX" ScaleY="SY" ScaleZ="SZ" />

<TranslateTransform3D OffsetX="CX(1 -SX)" OffsetY="CY(1-SY)" OffsetZ="CZ(1-SZ)" />

Hoặc:

<TranslateTransform3D OffsetX="CX/SZ-CX" OffsetY="CY/SY-CY" OffsetZ="CZ/SZ-CZ" /> <ScaleTransform3D ScaleX="SX" ScaleY="SY" ScaleZ="SZ" />

Trong một số trư ng hợp, bạn có thể kết hợp một ScaleTransform3D và

TranslateTransform3D theo những cách làm giảm tổng số biến đổi.

2.3. Phép xoay (RotateTransform3D)

Loại biến đổi tiếp theo là xoay. Về khái niệm và cú pháp thì phép xoay phức tạp hơn phép dịch chuyển và phép biến đổi kích thước. Kết hợp của phép quay tại một số mặt phẳngcó thể rất phức tạp vì thế nó sử dụng một cơng cụ tốn học đặc biệt được gọi là quaternion. Tuy nhiên, bản

thân các quaternion này cũng rất phức tạp.

Phép xoay này bao gồm hai phương pháp cơ bản đó là xoay theo trục và góc hoặc xoay bằng một phép tốn có tên là Quaternion.

2.3.1. Tr c vƠ góc

Lớp RotateTransform3D định nghĩa bốn đặc tính. Giống như ScaleTransform3D, RotateTransform3D cũng định nghĩacác thuộc tính CenterX, CenterY, và CenterZ với giá

Trang 46

trị mặc định bằng 0. Nó cũng chỉ ra một điểm trên mặt phẳng khi xoay. Nhưng phép xoay được định nghĩa tronglớp trừu tượng Rotation3D như được hiển thị trong hệ thống sau đây:

Object DispatcherObject (abstract) DependencyObject Freezable (abstract) Animatable (abstract) Rotation3D (abstract) AxisAngleRotation3D (sealed) QuaternionRotation3D (sealed)

Các khai báo cho một RotationTransform3D thì dài hơn các biến đổi khác: <RotateTransform3D … >

<RotateTransform3D.Rotation>

<AxisAngleRotation3D … />

</RotateTransform3D.Rotation> </RotateTransform3D>

Bạn có thể tránh yếu tố này nếu đối tượng s hữu Rotation3D được xác định hoặc kiểm soát b i một Rotation3DAnimation.

Trong RotateTransform3D.Rotation là từ khóa mà bạn chỉ định một AxisAngleRotation3D hoặc một QuaternionRotation3D. Như tên cho thấy, một con số AxisAngleRotation3D quay quanh một trục được tính bằng độ.

AxisAngleRotation3D định nghĩa hai thuộc tính. Các thuộc tính Axis là của loại Vector3D và có giá trị mặc định là (0, 1, 0), mà vector theo hướng trục Y dương. Xoay quanh

một trục song song với vector đó. Thuộc tínhthứ hai là Angle, đó là góc quay.

Nếu bạn bỏ các thuộc tính CenterX, CenterY, và CenterZ được xác định b i RotateTransform3D mặc định của chúng là 0, mặc định giá trị của Axis (0, 1, 0) tạo ra con số để xoay quanh trục Y. Bạn có thể xác định đư ng thẳng mà thực sự nằm từ CenterZ và

CenterX của đối tượng RotateTransform3D. Tất cả các điểm của vật thể (CenterX, y,

CenterZ) vẫn cùng một vị trí trong th i gian quay. Tương tự như vậy, nếu giá trị Axis là (1, 0, 0), tất cả các điểm của vật thể (x, CenterY, CenterZ) vẫn cùng một chỗ. Nếu giá trị Axis là (0, 0, 1), tất cả các điểm của vật thể (CenterX, CenterY, z) không thay đổi.

Bạn cũng có thể chỉ định một giá trị Axis khơng song song với trục X, Y, hay Z, ví dụ, (1, 1, 0). Đó là một vector hướng về phía trên bên phải.

Trang 47

Xoay quanh trục bất kỳ có thể được thực hiện một trong hai cách: xoay theo chiều kim đồng hồ và quay ngược chiều kim đồng hồ. Nếu bạn trỏ ngón tay cái của bàn tay phải của bạn theo hướng của vector Axis, các đư ng cong của ngón tay khác chỉ hướng quay theo các giá trị góc

dương.

Ví dụ, giả sử giá trị Axis là (0, 0, 1), và các CenterX, CenterY, và CenterZ chưa được thay đổi giá trị mặc định. Phép quay xảy ra xoay quanh trục Z. Angle dương gây ra các giá trị điểm trên trục dương X sau đó di chuyển về hướng trục dương Y, và các điểm trên trục dương Y sẽ di chuyển về hướng trục âm X... Đây là một vòng quay của 30 độ:

Hình 2.3.1-1: Vật thể được xoay với một góc 30 độ.

Nếu bạn muốn xảy ra kết quả quay theo hướng ngược lại, thì có hai cách hoặc sử dụng các âm

của Axis (0, 0, -1), hoặc sử dụng giá trị âm Angle. Đây phép quay xung quanh (0, 0, -1) của 30

độ, hoặc một phép quay xung quanh (0, 0, 1) của -30 độ:

Hình 2.3.1-2: Vật thểđược xoay với một góc -30 độ.

Chương trình sau đây cho phép bạn thử nghiệm với trục quay: AxisRotationExperimenter.xaml

<!-- =========================================================== AxisRotationExperimenter.xaml (c) 2007 by Charles Petzold

Trang 48 =========================================================== --> <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" WindowTitle="AxisAngleRotation3D Experimenter" Title="AxisAngleRotation3D Experimenter"> <DockPanel>

<ScrollBar Name="xMod" DockPanel.Dock="Top" Orientation="Horizontal"

Minimum="-180" Maximum="180" LargeChange="10" Value="1" ToolTip="X Model" />

<ScrollBar Name="yMod" DockPanel.Dock="Top" Orientation="Horizontal"

Minimum="-180" Maximum="180" LargeChange="10" Value="1" ToolTip="Y Model" />

<ScrollBar Name="zMod" DockPanel.Dock="Top" Orientation="Horizontal"

Minimum="-180" Maximum="180" LargeChange="10" Value="1" ToolTip="Z Model" />

<ScrollBar Name="zCam" DockPanel.Dock="Bottom" Orientation="Horizontal" Minimum="-180" Maximum="180" LargeChange="10" Value="1" ToolTip="Z Camera" />

<ScrollBar Name="yCam" DockPanel.Dock="Bottom" Orientation="Horizontal" Minimum="-180" Maximum="180" LargeChange="10" Value="1" ToolTip="Y Camera" />

<ScrollBar Name="xCam" DockPanel.Dock="Bottom" Orientation="Horizontal" Minimum="-180" Maximum="180" LargeChange="10" Value="1" ToolTip="X Camera" /> <Viewport3D> <ModelVisual3D> <ModelVisual3D.Content> <Model3DGroup> <GeometryModel3D> <GeometryModel3D.Geometry>

<!-- Front, rear, top, right, bottom. --> <MeshGeometry3D Positions="0 0 0, 2 0 0, 2 1 0, 0 0 -3, 2 0 -3, 2 1 -3, 2 1 -3, 0 0 -3, 2 1 0, 0 0 0, 2 1 0, 2 0 0, 2 1 -3, 2 0 -3, 2 0 0, 0 0 0, 2 0 -3, 0 0 -3" TriangleIndices=" 0 1 2, 3 5 4, 6 7 8, 7 9 8, 10 11 12, 11 13 12, 14 15 16, 15 17 16" /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial Brush="Cyan" /> </GeometryModel3D.Material> <GeometryModel3D.Transform> <Transform3DGroup> <RotateTransform3D> <RotateTransform3D.Rotation> <AxisAngleRotation3D Axis="1 0 0"

Trang 49 Angle="{Binding ElementName=xMod, Path=Value}" /> </RotateTransform3D.Rotation> </RotateTransform3D> <RotateTransform3D> <RotateTransform3D.Rotation>

<AxisAngleRotation3D Axis="0 1 0" Angle="{Binding ElementName=yMod,

Path=Value}" /> </RotateTransform3D.Rotation>

</RotateTransform3D> <RotateTransform3D>

<RotateTransform3D.Rotation>

<AxisAngleRotation3D Axis="0 0 1" Angle="{Binding ElementName=zMod, Path=Value}" /> </RotateTransform3D.Rotation> </RotateTransform3D> </Transform3DGroup> </GeometryModel3D.Transform> </GeometryModel3D> <!-- Light sources. --> <AmbientLight Color="#404040" />

<DirectionalLight Color="#C0C0C0" Direction="2 -3 -1"> <DirectionalLight.Transform>

<Transform3DGroup>

<!-- Placeholder for light transform. --> </Transform3DGroup>

</DirectionalLight.Transform> </DirectionalLight>

<Model3DGroup.Transform> <Transform3DGroup>

<!-- Placeholder for group transform. --> </Transform3DGroup> </Model3DGroup.Transform> </Model3DGroup> </ModelVisual3D.Content> <ModelVisual3D.Transform> <Transform3DGroup>

<!-- Placeholder for visual transform. --> </Transform3DGroup> </ModelVisual3D.Transform> </ModelVisual3D> <!-- Camera. --> <Viewport3D.Camera> <PerspectiveCamera Position="-2 2 4" LookDirection="2 -1 -4" UpDirection="0 1 0" FieldOfView="45"> <PerspectiveCamera.Transform> <Transform3DGroup> <RotateTransform3D>

Trang 50

<RotateTransform3D.Rotation>

<AxisAngleRotation3D Axis="1 0 0" Angle="{Binding ElementName=xCam, Path=Value}" />

</RotateTransform3D.Rotation> </RotateTransform3D>

<RotateTransform3D>

<RotateTransform3D.Rotation>

<AxisAngleRotation3D Axis="0 1 0" Angle="{Binding ElementName=yCam, Path=Value}" />

</RotateTransform3D.Rotation> </RotateTransform3D>

<RotateTransform3D>

<RotateTransform3D.Rotation>

<AxisAngleRotation3D Axis="0 0 1" Angle="{Binding ElementName=zCam, Path=Value}" /> </RotateTransform3D.Rotation> </RotateTransform3D> </Transform3DGroup> </PerspectiveCamera.Transform> </PerspectiveCamera> </Viewport3D.Camera> </Viewport3D> </DockPanel> </Page>

Ba thanh trượt đầu trang được liên kết với một thuộc tính Angle của một nguyên tố AxisAngleRotation3D khác nhau. Ba yếu tố AxisAngleRotation3D có thuộc tính Axis thiết lập là (1, 0, 0), (0, 1, 0), và (0, 0, 1), do đó, ba thanh cuộn xoay quanh trục X, Y, và Z tương ứng. Di chuyển thanh cuộn bên phải làm tăng Angle từ 0 đến180 độ, di chuyển mỗi thanh cuộn

bên trái làm cho các thuộc tính Angle giảm từ 0 đến -180 độ.

Bất kể quay như thế nào, góc trái phía trước của vật thể này vẫn cịn giữ nguntại gốc. Bạn có thể thay đổi ba yếu tố RotateTransform3D áp dụng cho các GeometryModel3D như sau:

<RotateTransform3D CenterX="1" CenterY="0.5" CenterZ="-1.5">

Bây gi tâm của vật thể này vẫn còn giữ ngun. Thiết lập một thuộc tính CenterX là khơng

cần thiết khi quay quanh trục X, b i vì khi xoay quanh truc X thì tất cả các giá trị X vẫn luôn luôn

giữ nguyên. Quy tắc tương tự áp dụng cho các thuộc tính CenterY và CenterZ.

Ba thanh cuộn dưới cùng của trang áp dụng cho máy ảnh. Như bạn thấy, hiệu quả của phép xoay được đảo ngược b i vì máy ảnh này đang được quay chứ khơng phải là hình vẽ được quay.

Trang 51

Trong ba phép quay áp dụng cho máy ảnh, thay đổi các yếu tố RotateTransform3D như

sau:

<RotateTransform3D CenterX="1" CenterZ="-10">

Bạn có hiệu quả có thể xoay camera xung quanh vật thể và xem nó từ phía sau nhưng

Một phần của tài liệu B GIAO DC VA DAO TO TRNG CAO DNG c (Trang 47)

Tải bản đầy đủ (PDF)

(108 trang)