| 256 | } |
| 257 | |
| 258 | void vtkInteractorStyle3D::SetScale(vtkCamera* camera, double newScale) |
| 259 | { |
| 260 | vtkRenderWindowInteractor3D* rwi = static_cast<vtkRenderWindowInteractor3D*>(this->Interactor); |
| 261 | |
| 262 | double* trans = rwi->GetPhysicalTranslation(camera); |
| 263 | double physicalScale = rwi->GetPhysicalScale(); |
| 264 | double* dop = camera->GetDirectionOfProjection(); |
| 265 | double* pos = camera->GetPosition(); |
| 266 | double hmd[3]; |
| 267 | hmd[0] = (pos[0] + trans[0]) / physicalScale; |
| 268 | hmd[1] = (pos[1] + trans[1]) / physicalScale; |
| 269 | hmd[2] = (pos[2] + trans[2]) / physicalScale; |
| 270 | |
| 271 | double newPos[3]; |
| 272 | newPos[0] = hmd[0] * newScale - trans[0]; |
| 273 | newPos[1] = hmd[1] * newScale - trans[1]; |
| 274 | newPos[2] = hmd[2] * newScale - trans[2]; |
| 275 | |
| 276 | // Note: New camera properties are overridden by virtual reality render |
| 277 | // window if head-mounted display is tracked |
| 278 | camera->SetFocalPoint( |
| 279 | newPos[0] + dop[0] * newScale, newPos[1] + dop[1] * newScale, newPos[2] + dop[2] * newScale); |
| 280 | camera->SetPosition(newPos[0], newPos[1], newPos[2]); |
| 281 | |
| 282 | rwi->SetPhysicalScale(newScale); |
| 283 | |
| 284 | if (this->AutoAdjustCameraClippingRange && this->CurrentRenderer) |
| 285 | { |
| 286 | this->CurrentRenderer->ResetCameraClippingRange(); |
| 287 | } |
| 288 | } |
| 289 | VTK_ABI_NAMESPACE_END |