2017-02-15 11 views
1

6 축 로봇이 있습니다.헬릭스 툴킷, 새 회전 벡터 받기

각 축을 독립적으로 이동하려고합니다. 로봇 축은 원점이 원점 일 때 모두 올바르게 이동하지만 수정 된 경우 다른 모든 축이 잘못 이동합니다. 그들은 새로운 벡터가 아닌 올바른 회전 지점을 유지합니다.

The Skewed axis

나는 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);   
} 

답변

0

U'll뿐만 아니라 벡터 변환해야이 튜토리얼을 따라 갔다.

//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; 

또한 회전 중심에서의 과부하를 선호합니다. 그런 다음 나중에 센터를 설정할 필요가 없습니다. 하지만 그건 내 의견 :

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