Vật thể được xoay với một góc 30 độ

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

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ữ nguyên. 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 khoảng cách xa hơn.

Khi bạn tăng thanh cuộn đầu tiên, các vector Direction quay xung quanh một đư ng song song với trục X để nó chỉ theo hướng Z âm. Khi bạn tăng thanh cuộn thứ ba, vector Direction

quay xung quanh một đư ng song song với trục Z để nó có nhiều điểm hơn theo hướng X dương. Các thuộc tính CenterX, CenterY, và CenterZ khơng có hiệu lực trên một RotateTransform3D áp dụng cho một DirectionalLight.

Khi thực hiên xoay Model3DGroup hoặc ModelVisual3D thì ánh sáng sẽ quay theo với nó,

và bề mặt chiếu sáng trên vật thể vẫn khơng đổi.

2.3.2. Tốn Quaternion

Xoay là một trong những nhiệm vụ phổ biến nhất của lập trình đồ họa 3D, nhưng cũng là nhiệm vụ đầy toán học nhất. May mắn là đã có sự tiện lợi của lớp RotateTransform3D và

AxisAngleRotation3D. Khi sử dụng kết hợp, hai lớp này cho phép bạn xác định một vòng quay bằng cách xác định các trục quay, một góc quay xung quanh trục, và một tâm quay tùy chọn.

Thông thư ng khi bạn xác định một hình ảnh động liên quan đến AxisAngleRotation3D, bạn chỉ quan tâm đến thay đổi Angle trong khi vẫn giữ Axis không đổi.

Quaternion là một cách khác để định nghĩa phép quay trong không gian 3D với lợi thế lớn là

có thể thống nhất vận tốc góc, đây là một hiệu ứng mà có thể khơng được bắt chước một cách dễ dàng với một trục quay.

Các ti n l i c a s ph c

Các động lực cho quaternion xuất phát từ nhiệm vụ tương đối đơn giản quay trong hai chiều. Hãy bắt đầu với các tiêu chuẩn Cartesian phối hợp hệ thống:

Trang 52

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

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

(108 trang)