How to rotate an object in C # 3D?

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

+4
source share
5 answers

Multiply all vertices by the rotation matrix

alt text

+10
source

It depends on which API you want to use:

In WPF, you can 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 should use soemthing like Matrix.CreateRotationY and apply this instance of ModelMesh to you.

Of course, there are tons of third-party engines and apis that you could use. An interesting choice might be SlimDX , which is a thin shell around Direct3D, sort of like Managed DirectX.

+2
source

Let's add some details to this.

Given the specifications for the angle of rotation and the axis of rotation, we can perform the rotation in a few steps.

  1. Move the object so that the axis of rotation passes through the origin of the coordinate system.
  2. Rotate the object so that the axis of rotation coincides with one of the coordinate axes
  3. Perform the indicated rotation around the selected coordinate axis.
  4. Apply reverse rotation to return the axis of rotation to its original position.
  5. Apply reverse translation to return the axis of rotation to the original spatial position.

Codex is an exercise for the reader, since for me it is brain training (computer graphics have long been: d). Maybe when I do this, I'll post a little more.

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

Where to:

  • T = translation matrix
  • Rx = rotation around x, etc.

Brain simulator

Oh, we can simplify (without even using Quaternaries)

alt text
(source: gamedev.net )

alt text

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

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

+1
source

I had a similar problem. I'm not sure what you want to rotate, but let's say you want to convert 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]); } 
+1
source

You can use Skiasharp , an open source library

Check this code to find out how to do this.

0
source

All Articles