J.John
J.John

Reputation: 41

How to rotate an object in C# 3D?

I need to rotate an 3D mesh object on an axis in C#.
Could you show me how this is done?

Upvotes: 4

Views: 8103

Answers (5)

bastijn
bastijn

Reputation: 5953

Lets put some more detail in this.

Given the specifications for the rotation angle and rotation axis we can accomplish the rotation in a few steps.

  1. Translate the object so that the rotation axis passes through the coordinate system origin
  2. Rotate the object so that the axis of rotation coincides with one of the coordinate axes
  3. Perform the specified rotation about the selected coordinate axis.
  4. Apply inverse rotations to bring the rotation axis back to its original orientation.
  5. Apply the inverse translation to bring the rotation axis back to its original spatial position.

The code is an exercise for the reader as this is a brain training for me (computer graphics is a long time ago :d). Maybe when I'm up for it I'll post a bit more.

I believe it was something like: R(theta) = T^-1 . Rx^-1(alpha) . Ry^-1(Beta) . Rz(theta) . Ry(beta) . Rx(alpha) . T

Where:

  • T = translation matrix
  • Rx = rotation about x etc

Brain trainer edit

O we can simplify (even without using quarternations)

alt text
(source: gamedev.net)

alt text

and (x,y,z) is a unit vector on the axis of rotation and is the angle of rotation.

if I may believe google. The prove is left as an exercise to the reader but I believe it is correct as far as I can see (source: Graphics Gems (Glassner, Academic Press, 1990).)

Upvotes: 1

FindOutIslamNow
FindOutIslamNow

Reputation: 1236

You can use Skiasharp, the open source library

Check this code for how to do it.

Upvotes: 0

cdiggins
cdiggins

Reputation: 18203

I had a similar problem. I'm not sure what you want to rotate, but lets assume you want to transform a MeshGeometry3D. Here is my solution.

    public void RotateMesh(MeshGeometry3D mesh, Vector3D axis, double angle)
    {
        var transform = new RotateTransform3D(); 
        transform.Rotation = new AxisAngleRotation3D(axis, angle);

        for (int i = 0; i < mesh.Positions.Count; ++i) 
            mesh.Positions[i] = transform.Transform(mesh.Positions[i]);
    }

Upvotes: 2

bitbonk
bitbonk

Reputation: 49619

It depends what API you want to use:

In WPF you could do it like this:

   <Viewport3D>
       <Viewport3D.Camera>
          <PerspectiveCamera Position="-40,40,40" LookDirection="40,-40,-40 " 
                             UpDirection="0,0,1" />
       </Viewport3D.Camera>
       <ModelVisual3D>
          <ModelVisual3D.Content>
             <Model3DGroup>
                <DirectionalLight Color="White" Direction="-1,-1,-3" />
                   <GeometryModel3D>
                   <Model3DGroup.Transform>
                      <RotateTransform3D>
                          <RotateTransform3D.Rotation>
                                <!-- here you do the rotation -->
                                <AxisAngleRotation3D x:Name="rotation" Axis="0 0 1" Angle="45" />
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                      </Model3DGroup.Transform>
                      <GeometryModel3D.Geometry>
                         <MeshGeometry3D Positions="0,0,0 10,0,0 10,10,0 0,10,0 0,0,10 
                            10,0,10 10,10,10 0,10,10"
                            TriangleIndices="0 1 3 1 2 3  0 4 3 4 7 3  4 6 7 4 5 6 
                                             0 4 1 1 4 5  1 2 6 6 5 1  2 3 7 7 6 2"/>
                      </GeometryModel3D.Geometry>
                      <GeometryModel3D.Material>
                         <DiffuseMaterial Brush="Red"/>
                      </GeometryModel3D.Material>
                   </GeometryModel3D>
                </Model3DGroup>
             </ModelVisual3D.Content>
          </ModelVisual3D>
    </Viewport3D>

Or in codebehind c#:

this.rotation.Angle = 90;

If you use XNA you would use soemthing like Matrix.CreateRotationY and apply that to you ModelMesh instance.

Of course there are tons of 3rd party engines and apis that you could utilize. AN interesting choice might be SlimDX which is a slim wrapper around Direct3D sort of like Managed DirectX once was.

Upvotes: 2

Szczepan
Szczepan

Reputation: 217

Multiply all vertexes by rotation matrix

alt text

Upvotes: 10

Related Questions