wpf create 3d cube and rotate it along x, y and z axis
11,730
Solution 1
Rotations are evaluated in respect to the origin. So the easiest way is to define the geometry that way that its origin matches the global origin:
<MeshGeometry3D x:Name="meshMain"
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 -0.5 0.5 0.5 0.5 0.5 0.5"
...
Another way is being aware of the offset. You can compensate for this offset in your transformation:
<ModelVisual3D.Transform>
<Transform3DGroup>
<Transform3DGroup.Children>
<!-- move the model to the origin -->
<TranslateTransform3D OffsetX="-0.5" OffsetY="-0.5" OffsetZ="-0.5" />
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="rotate" Axis="1 0 0"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
<!-- undo translation -->
<TranslateTransform3D OffsetX="0.5" OffsetY="0.5" OffsetZ="0.5" />
</Transform3DGroup.Children>
</Transform3DGroup>
</ModelVisual3D.Transform>
Solution 2
Change
<RotateTransform3D>
to
<RotateTransform3D CenterX="0.5" CenterY="0.5" CenterZ="0.5" >
Results:
Author by
Tono Nam
Updated on June 04, 2022Comments
-
Tono Nam almost 2 years
I have the following code:
<Window x:Class="Demo3D.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Viewport3D Name="viewport3D1"> <Viewport3D.Camera> <PerspectiveCamera x:Name="camMain" Position="6 5 4" LookDirection="-6 -5 -4"> </PerspectiveCamera> </Viewport3D.Camera> <ModelVisual3D> <ModelVisual3D.Content> <DirectionalLight x:Name="dirLightMain" Direction="-1,-1,-1"> </DirectionalLight> </ModelVisual3D.Content> </ModelVisual3D> <ModelVisual3D x:Name="MyModel"> <ModelVisual3D.Content> <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D x:Name="meshMain" Positions="0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1" TriangleIndices="2 3 1 2 1 0 7 1 3 7 5 1 6 5 7 6 4 5 6 2 0 2 0 4 2 7 3 2 6 7 0 1 5 0 5 4"> </MeshGeometry3D> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial x:Name="matDiffuseMain"> <DiffuseMaterial.Brush> <SolidColorBrush Color="Red"/> </DiffuseMaterial.Brush> </DiffuseMaterial> </GeometryModel3D.Material> </GeometryModel3D> </ModelVisual3D.Content> <ModelVisual3D.Transform> <RotateTransform3D> <RotateTransform3D.Rotation> <AxisAngleRotation3D x:Name="rotate" Axis="1 0 0"/> </RotateTransform3D.Rotation> </RotateTransform3D> </ModelVisual3D.Transform> </ModelVisual3D> </Viewport3D> <Slider Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="slider1" VerticalAlignment="Top" Width="187" Maximum="360" Value="{Binding ElementName=rotate, Path=Angle}" /> </Grid> </Window>
I am able to rotate the cube by sliding the slider. The problem is that the cube does not rotate around it's center. How can I make that cube rotate around it's center? In other words it will be nice if I could do something like http://www.youtube.com/watch?feature=player_embedded&v=a7mTytwRGqI