Пример #1
0
  void Transform::GetVtkOpenGlMatrix(vtkMatrix4x4* matrix) const
  {
    vnl_matrix<mitk::ScalarType> vnlRotation
        = this->GetVnlRotationMatrix().as_matrix();

    // normalize rows of rotation matrix
    vnlRotation.normalize_rows();

    vnl_matrix<mitk::ScalarType> vnlInverseRotation(3,3);
    // invert rotation
    vnlInverseRotation = vnl_matrix_inverse<mitk::ScalarType>(vnlRotation);

    vnl_vector<mitk::ScalarType> vnlTranslation
        = this->GetPosition().GetVnlVector();
    // rotate translation vector by inverse rotation P = P'
    vnlTranslation = vnlInverseRotation * vnlTranslation;
    vnlTranslation *= -1;  // save -P'

    // set position
    mitk::Transform::Pointer tmp = mitk::Transform::New();

    tmp->SetTranslation( vnlTranslation );
    tmp->SetRotation( vnlRotation );
    tmp->GetMatrix(matrix);
  }
void mitk::NavigationDataToOpenGLFilter::GenerateData()
{
  this->CreateOutputsForAllInputs(); // make sure that we have the same number of outputs as inputs

  /* update outputs with tracking data from tools */
  unsigned int numberOfOutputs = this->GetNumberOfOutputs();
  for (unsigned int i = 0; i < numberOfOutputs ; ++i)
  {
    mitk::NavigationData* output = this->GetOutput(i);
    assert(output);
    const mitk::NavigationData* input = this->GetInput(i);
    assert(input);

    if (input->IsDataValid() == false || !input->GetHasOrientation()
      || !input->GetHasOrientation())
    {
      MITK_WARN("mitk::NavigationDataToOpenGLFilter::GenerateData()")
        << "Input Navigation Data is either invalid or has no position or "
        << "has no orientation.";
      continue;
    }

    /*
    vnl_vector<mitk::ScalarType> vnlTranslation
        = input->GetPosition().GetVnlVector();

    vnl_matrix<mitk::ScalarType> vnlRotation(
      input->GetOrientation().rotation_matrix_transpose());

    vnl_matrix_fixed<mitk::ScalarType, 4, 4> m;
    m.fill(0);
    m(3,3) = 1;
    m.update(vnlRotation);
    m.set_column(3, vnlTranslation);
    MITK_DEBUG << "left handed matrix: " << m;

    // switch to right/left handed
    m[1][0] = -m[1][0];
    m[1][1] = -m[1][1];
    m[1][2] = -m[1][2];
    m[1][3] = -m[1][3];
    m[2][0] = -m[2][0];
    m[2][1] = -m[2][1];
    m[2][2] = -m[2][2];
    m[2][3] = -m[2][3];

    MITK_DEBUG << "right handed matrix: " << m;

    vnlTranslation = m.get_column(3);
    vnlTranslation = vnlTranslation.extract(3);
    vnlRotation = m.extract(3, 3);

    output->SetPosition( mitk::Point3D( vnlTranslation.data_block() ) );
    output->SetOrientation( vnl_quaternion<mitk::ScalarType> ( vnlRotation ) );
    */

    output->Graft(input); // First, copy all information from input to output

    vnl_matrix<mitk::ScalarType> vnlRotation(
      input->GetOrientation().rotation_matrix_transpose());

    // normalize rows of rotation matrix
    vnlRotation.normalize_rows();

    vnl_matrix<mitk::ScalarType> vnlInverseRotation(3,3);
    // invert rotation
    vnlInverseRotation = vnl_matrix_inverse<mitk::ScalarType>(vnlRotation);

    vnl_vector<mitk::ScalarType> vnlTranslation
        = input->GetPosition().GetVnlVector();
    // rotate translation vector by inverse rotation P = P'
    vnlTranslation = vnlInverseRotation * vnlTranslation;
    vnlTranslation *= -1;  // save -P'

    // set new translation and rotation on output navdata objects
    mitk::Point3D position;
    mitk::FillVector3D(position,
                       vnlTranslation[0],
                       vnlTranslation[1],
                       vnlTranslation[2]);

    // set position
    output->SetPosition( mitk::Point3D( vnlTranslation.data_block() ) );
    output->SetOrientation( mitk::Quaternion( vnlRotation ) );

  }
}