我正在尝试使用传感器坐标和方向角画一条线。线的一端是传感器当前位置,我想找到与当前点具有相同方向的另一端。为了实现这一点,我创建了一个旋转矩阵并将其与我想要旋转的点相乘。
当线处于 (0, 90, 0) 位置时,线旋转是正确的。但是当线在z轴上倾斜和旋转时,顶部当前点似乎在一定高度上围绕当前点旋转。我该如何解决这个问题?
这是我使用的代码。
double currentpoint[3];
currentpoint[0] = sphere_x;
currentpoint[1] = sphere_y;
currentpoint[2] = sphere_z;
double topCurrentpoint[3];
topCurrentpoint[0] = sphere_x;
topCurrentpoint[1] = sphere_y;
topCurrentpoint[2] = sphere_z + (110 * scale_z);
vtkSmartPointer<vtkTransform> needleTransform_init = vtkSmartPointer<vtkTransform>::New();
needleTransform_init->Translate(currentpoint[0], currentpoint[1], currentpoint[2]);
needleTransform_init->RotateX(90);
needleTransform_init->Translate(-currentpoint[0], -currentpoint[1], -currentpoint[2]);
needleTransform_init->TransformPoint(topCurrentpoint, topCurrentpoint);
qDebug()<<" angles before rea"<<roll<<elevation<<azimuth;
vtkSmartPointer<vtkTransform> needleTransform = vtkSmartPointer<vtkTransform>::New();
needleTransform->Translate(currentpoint[0], currentpoint[1], currentpoint[2]);
needleTransform->RotateZ(180+roll); // (180+roll)
needleTransform->RotateX(elevation); // (elevation)
needleTransform->RotateY(180-azimuth); // (180-azimuth)
needleTransform->Translate(-currentpoint[0], -currentpoint[1], -currentpoint[2]);
needleTransform->TransformPoint(topCurrentpoint, topCurrentpoint);
vtkNew<vtkLineSource> lineSource;
lineSource->SetPoint1(currentpoint);
lineSource->SetPoint2(topCurrentpoint);
正是 180 滚转和 180 方位角造成了错误。
needleTransform->RotateZ(azimuth);
needleTransform->RotateX(elevation);
needleTransform->RotateY(roll);
这就是答案。