Search code examples
c#wpf3dhelix-3d-toolkit

Helix toolkit, getting a new rotation vector


I have a 6 axis robot.

I am trying to get each axis to move independently. The robots axis all move correctly when axis one is at its origin angle, but when it has been modified all other axis move incorrectly. They retain the correct point of rotation just not the new vector.

The Skewed axis

I followed this tutorial http://www.barth-dev.de/getting-started-3d-wpf/

//moves axis_1
void move_axis_1(double angle)
{
    //rotate the object by "angle", the vector describes the axis
    RotateTransform3D axis_1_transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), angle));
    //tells where the point of rotation is
    axis_1_transform.CenterX = 77.5;
    axis_1_transform.CenterY = 21.5;
    axis_1_transform.CenterZ = -8;
    //apply transformation
    axis_1.Transform = axis_1_transform;
    //also move the axis 2
    move_axis_2(axis_2_angle);            
}

//moves axis_2
void move_axis_2(double angle)
{
    //new group of transformations, the group will "add" movements
    var Group_3D = new Transform3DGroup();
    Group_3D.Children.Add(axis_1.Transform);

    //we need to find out where our old point is now
    Point3D origin = Group_3D.Transform(new Point3D(84.6, 21, -2));

    //create new transformation
    RotateTransform3D axis_2_transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), angle));
    axis_2_transform.CenterX = origin.X;
    axis_2_transform.CenterY = origin.Y;
    axis_2_transform.CenterZ = origin.Z;

    //add it to the transformation group (and therefore to axis_1 movement
    Group_3D.Children.Add(axis_2_transform);

    //Apply the transform
    axis_2.Transform = Group_3D;

    //also move
    move_axis_3(axis_3_angle);         
}

//moves axis_3
void move_axis_3(double angle)
{
    //new group of transformations, the group will "add" movements
    var Group_3D = new Transform3DGroup();
    Group_3D.Children.Add(axis_2.Transform);

    //we need to find out where our old point is now
    Point3D origin = Group_3D.Transform(new Point3D(84.6, 17, 16.2));

    //create new transformation
    RotateTransform3D axis_3_transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), angle));
    axis_3_transform.CenterX = origin.X;
    axis_3_transform.CenterY = origin.Y;
    axis_3_transform.CenterZ = origin.Z;

    //add it to the transformation group 
    Group_3D.Children.Add(axis_3_transform);

    //Apply the transform
    axis_3.Transform = Group_3D;

    //also move
    move_axis_4(axis_4_angle);           
}

Solution

  • U'll have to transform the Vector as well.

    //we need to find out where our old point is now
    Point3D origin = Group_3D.Transform(new Point3D(84.6, 21, -2));
    
    //we also need to find out where our old vector is pointing now
    Vector3D vector = Group_3D.Transform(new Vector3D(0, 1, 0));
    
    //create new transformation
    RotateTransform3D axis_2_transform = new RotateTransform3D(new AxisAngleRotation3D(vector, angle));
    axis_2_transform.CenterX = origin.X;
    axis_2_transform.CenterY = origin.Y;
    axis_2_transform.CenterZ = origin.Z;
    

    I also prefer the overload with the rotation center. Then you don't need to set the center afterwards. But thats just my opinion:

    //create new transformation
    RotateTransform3D axis_2_transform = 
           new RotateTransform3D(new AxisAngleRotation3D(vector, angle), origin);