Тема 2
.pdfren1->AddLight (light); ren1-> AddActor (Actor5);
ren1->SetBackground(0,0,0); // задание параметра рендернинга - цвета фона ren1->Render() ; //инициация функциональной процедуры рендеринга
……………………
Результатом выполнения данной функциональной процедуры будет статическое проекционное графическое изображение текущей (сформированной к данному моменту времени) сцены на графическом терминале.
Результатом рендеринга может быть также и анимационное (динамическое, зависящее от времени) проекционное графическое изображение, которое представляет собой соответствующую временную последовательность статических проекционных графических изображений рассматриваемой сцены. Так, например, если каждое такое статическое проекционное изображение получено с помощью перемещающейся в пространстве камеры (т.е. камера, как параметр рендеринга, задана для ряда фиксированных значений времени), то результатом такой «фотосъемки» будет анимационное проекционное графическое изображение (упорядоченная совокупность соответствующих статических проекционных графических изображений).
Приведем фрагмент программы визуализации, содержащий вызов функциональной процедуры рендеринга, результатом которой будет построение такого анимационного проекционного графического изображения пространственной сцены.
Пример 2.35
………………
int i;
for (i = 0; i < 360; ++i)
{
//render the image renWin->Render();
//rotate the active camera by one degree ren1->GetActiveCamera()->Azimuth( 1 );
}
…………….
Здесь показано обращение к функциональной процедуре задания компьютерного представления камеры, меняющейся во времени.
Приведем пример прикладной программы визуализации исходных данных из примера 2.25. Результатом работы этой программы будет статическое проекционное графическое изображение пространственной сцены, описание которой получается в результате мэппинга, описанного в примере 2.28.
Пример 2.36
Задание исходных данных
Фильтрация
данных
#include "vtkXYZMolReader.h" #include "vtkBox.h"
#include "vtkClipPolyData.h" #include "vtkSphereSource.h" #include "vtkGlyph3D.h"
#include "vtkTubeFilter.h" #include "vtkPolyDataMapper.h" #include "vtkRenderWindow.h" #include "vtkCamera.h" #include "vtkActor.h"
#include "vtkLight.h" #include "vtkCamera.h" #include "vtkRenderer.h"
#include "vtkRenderWindowInteractor.h" #include "vtkProperty.h"
int main()
{
vtkXYZMolReader *pdb0= vtkXYZMolReader::New();
pdb0-> SetFileName ("caffeine.xyz"); vtkBox * box=vtkBox::New();
box-> SetXMin (-2, -2, -2); box ->SetXMax (2, 2, 2);
vtkClipPolyData* clipper= vtkClipPolyData::New();
|
clipper-> SetInputConnection (pdb0-> GetOutputPort()); |
|
clipper-> SetClipFunction (box); |
|
clipper->InsideOutOn(); |
|
vtkSphereSource* Sphere0= vtkSphereSource::New(); |
|
Sphere0-> SetCenter (0, 0, 0 ); |
|
Sphere0-> SetRadius (0.5); |
|
Sphere0-> SetThetaResolution (18); |
|
Sphere0-> SetStartTheta ( 0); |
|
Sphere0-> SetEndTheta (360); |
Мэппинг |
vtkGlyph3D* Glyph0= vtkGlyph3D::New(); |
отфильтрованных |
|
данных |
Glyph0 ->SetInputConnection(clipper-> GetOutputPort()); |
|
Glyph0-> SetOrient (1); |
|
Glyph0-> SetColorMode (1); |
|
Glyph0-> ScalingOn(); |
|
Glyph0-> SetScaleMode ( 2); |
|
Glyph0-> SetScaleFactor (.25); |
|
Glyph0-> SetSource (Sphere0 ->GetOutput()); |
|
vtkPolyDataMapper* Mapper5= vtkPolyDataMapper::New(); |
|
Mapper5 ->SetInputConnection (Glyph0 ->GetOutputPort()); |
Мэппинг |
Mapper5-> SetImmediateModeRendering (1); |
отфильтрованных |
|
данных |
Mapper5-> UseLookupTableScalarRangeOff(); |
|
Mapper5-> SetScalarVisibility (1); |
|
Mapper5-> SetScalarModeToDefault(); |
vtkActor* Actor5= vtkActor::New(); Actor5 ->SetMapper (Mapper5); vtkCamera* camera= vtkCamera::New(); camera-> SetViewAngle(30);
camera-> SetPosition (8.3761, 4.94858, 4.12505); vtkLight* light= vtkLight::New();
light-> SetPosition (8.3761, 4.94858, 4.12505); vtkRenderer *ren1 = vtkRenderer::New(); vtkRenderWindow *renWin = vtkRenderWindow::New();
Рендеринг renWin->AddRenderer(ren1);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin); ren1-> AddActor (Actor5); ren1->SetActiveCamera (camera); ren1->AddLight (light); ren1->SetBackground(0,0,0); renWin->Render();
iren->Start();
}
При заданных в файле « caffeine.xyz» исходных данных
24 Caffeine
H -3.3804130 -1.1272367 0.5733036
N 0.9668296 -1.0737425 -0.8198227
C 0.0567293 0.8527195 0.3923156
N-1.3751742 -1.0212243 -0.0570552
C-1.2615018 0.2590713 0.5234135
C-0.3068337 -1.6836331 -0.7169344
C1.1394235 0.1874122 -0.2700900
N0.5602627 2.0839095 0.8251589
O-0.4926797 -2.8180554 -1.2094732
C-2.6328073 -1.7303959 -0.0060953
O-2.2301338 0.7988624 1.0899730
H2.5496990 2.9734977 0.6229590
C2.0527432 -1.7360887 -1.4931279
H-2.4807715 -2.7269528 0.4882631
H-3.0089039 -1.9025254 -1.0498023
H2.9176101 -1.8481516 -0.7857866
H2.3787863 -1.1211917 -2.3743655
H1.7189877 -2.7489920 -1.8439205
C-0.1518450 3.0970046 1.5348347
C1.8934096 2.1181245 0.4193193
N2.2861252 0.9968439 -0.2440298
H-0.1687028 4.0436553 0.9301094
H0.3535322 3.2979060 2.5177747
H-1.2074498 2.7537592 1.7203047
получим проекционное графическое изображение, представленное на Рис.2.5
1 2
3 4
Рис.2.5
Анализ четырех проекционных графических изображений позволяет сделать вывод , что количество отфильтрованных точек равняется 12-ти при параметрах фильтрации, от (-2, -2, -2) до (2, 2, 2), заданных в прикладной программе (исходное количество точек равнялось 24). Точки размещаются в пространстве в виде «плоской» пятиконечной «звезды».
Заканчивая рассмотрение использования программного средства VTK в качестве инструментального средства для решения прикладных задач анализа данных методом научной визуализации, отметим, что более подробное описание VTK можно найти на официальном сайтеwww.vtk.org.
Заканчивая рассмотрение использования инструментальных средств научной визуализации, отметим, что при написании прикладных программ визуализации возможно использование этих средств как автономно, так и совместно, что позволяет наиболее эффективно использовать достоинства каждого из них. Примеры такого использования приведены в части 3.
Оглавление
