ViewTransform stores three vectors in the first three rows and position information in the forth column.

We can rotate camera around view up direction [ `Azimuth` operation ] and horizontal line (sideway) [ `Elevation` operation ] easily.

The relative implementation details in VTK:

``````void vtkCamera::ComputeViewTransform()
{
// main view through the camera
this->Transform->Identity();
if (this->UserViewTransform)
{
this->Transform->Concatenate(this->UserViewTransform);
}
this->Transform->SetupCamera(this->Position, this->FocalPoint, this->ViewUp);
this->ViewTransform->Identity();
this->ViewTransform->Concatenate(this->Transform->GetMatrix());
}

void vtkPerspectiveTransform::SetupCamera(const double position[3],
const double focalPoint[3],
const double viewUp[3])
{
double matrix[4][4];
vtkMatrix4x4::Identity(*matrix);

// the view directions correspond to the rows of the rotation matrix,
// so we'll make the connection explicit
double *viewSideways =    matrix[0];
double *orthoViewUp =     matrix[1];
double *viewPlaneNormal = matrix[2];

// set the view plane normal from the view vector
viewPlaneNormal[0] = position[0] - focalPoint[0];
viewPlaneNormal[1] = position[1] - focalPoint[1];
viewPlaneNormal[2] = position[2] - focalPoint[2];
vtkMath::Normalize(viewPlaneNormal);

// orthogonalize viewUp and compute viewSideways
vtkMath::Cross(viewUp,viewPlaneNormal,viewSideways);
vtkMath::Normalize(viewSideways);
vtkMath::Cross(viewPlaneNormal,viewSideways,orthoViewUp);

// translate by the vector from the position to the origin
double delta[4];
delta[0] = -position[0];
delta[1] = -position[1];
delta[2] = -position[2];
delta[3] = 0.0; // yes, this should be zero, not one

vtkMatrix4x4::MultiplyPoint(*matrix,delta,delta);

matrix[0][3] = delta[0];
matrix[1][3] = delta[1];
matrix[2][3] = delta[2];

// apply the transformation
this->Concatenate(*matrix);
}``````
Categories: VTK

Article Rating
Subscribe
Notify of