رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران
بهنام صباغی

معرفی و آموزش کتابخانه VTK


پست های پیشنهاد شده

کتابخانه VTK یک کتابخانه مجسم سازی سه بعدی اطلاعات و پردازش تصویر است. این شامل یک کتابخانه کلاس C++ و چندین لایه رابط تفسیری از جمله Tcl / Tk، Java و Python است. VTK یک کتابخانه کراس پلتفرم است که از سیستم‌عامل‌های لینوکس ، یونیکس ، مک و ویندوز پشتیبانی می‌کند. این ابزار پشتیبانی از پردازش موازی و ادغام با پایگاه های داده های مختلف در ابزارهای GUI مانند Qt و Tk را داراست.

در سایت رسمی این کتابخانه به آدرس VTK - The Visualization Toolkit می‌توانید منابع آموزشی متعددی برای یادگیری این کتابخانه پیدا کنید.

برای استفاده از این کتابخانه نیاز به کامپایل سورس این کتابخانه داریم . برای دریافت سورس میتوانید از صفحه دانلود سایت رسمی VTK استفاده کنید.

بعد از دریافت این کتابخانه میتوانید با توجه به سیستم‌عامل خود از صفحه wiki سایت رسمی VTK برای تنظیم و کامپایل این کتابخانه استفاده کنید.

دقت نمایید اگر نیاز دارید که از فریمورک Qt در برنامه خود استفاده کنید و صفحات گرافیکی VTK را در پنجره‌های Qt نمایش دهید باید به این مرحله پیکربندی با Cmake که مرتبط به کیوت 5 می‌باشد دقت کنید.

بعد از کامپال و نصب کتابخانه میتوانید پروژه مثال استفاده از VTK و Qt در گیتهاب را اجرا کرده و صحیح بودن پیکربندی و ساخت کتابخانه را آزمایش کنید.

برای یادگیری این کتابخانه میتوانید از کتاب یا ویدئو های موجود استفاده کنید ولی روش شخصی بنده برای یادگیری و استفاده از این کتابخانه در پروژه مشاهده و تحلیل مثال‌های کتابخانه VTK بود. این مثال ها جزء به جزء برای هر قابلیت پیاده سازی شده‌اند.

در قسمت بعد روند کلی کارکرد این کتابخانه از روی سورس مثال معرفی شده از گیتهاب را برای شما عزیزان شرح می‌دهم.

  • پسندیدن 2

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

در این پست قصد دارم به توضیح کد بخش VTK در مثال استفاده از VTK با Qt در گیتهاب بپردازم.

از فایل VTKmain.h شروع میکنم :

#include "qobject.h"
#include "vtkCubeSource.h"
#include "vtkOrientationMarkerWidget.h"
#include <QVTKWidget.h>
#include <vtkActor.h>
#include <vtkAxesActor.h>
#include <vtkDataSetSurfaceFilter.h>
#include <vtkIdFilter.h>
#include <vtkOBJReader.h>
#include <vtkPLYReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>

در بخش بالا کتابخانه های مورد نیاز در پروژه اینکلود شدند . یک سری از این کتابخانه‌ها مثل #include "qobject.h"   کتابخانه‌های کیوت هستند. و یک سری کتابخانه‌ها که در اسم آن‌ها VTK به چشم می‌خورد کتابخانه‌های VTK هستند. برای اطلاعت بیشتر از هرکدام از این کتابخانه‌ها می‌توانید نام آن را جستجو کنید و به داکیومنت VTK برای آن کتابخانه و همچنین سورس آن کتابخانه دست یابید.

بخش دوم کد :

class VTKmain : public QVTKWidget {
      public:
	VTKmain(QWidget *parent = nullptr);
	~VTKmain();

	// vtk renderer
	vtkSmartPointer<vtkRenderer> renderer;
	vtkSmartPointer<vtkPolyDataMapper> mapper;
	vtkSmartPointer<vtkActor> actor;
      public slots:
};

در این بخش یک کلاس به اسم VTKmain ساخته شده است و از QVTKWidget به ارث برده که یک کتابخانه توسعه داده شده توسط توسعه‌دهندگان VTK برای تعبیه کردن صفحه سه بعدی VTK در رابط کاربری گرافیکی Qt است.

درون کلاس هم سه تعریف داریم که در فایل سورس بیشتر در مورد آنها توضیح خواهم داد.

توضیحات فایل VTKmain.cpp :

همانطور که مشاهده می کنید در این مثال ساده فقط در تابع سازنده کد نوشته شده است :

VTKmain::VTKmain(QWidget *parent) : QVTKWidget(parent)

در دو خط زیر پنجره را به اندازه مورد نظر ریسایز می‌کنیم و حداقل سایز پنجره را مشخص می‌کنیم :

resize(1920, 1000);
setMinimumSize(400, 200);

در خط زیر با استفاده از vtkSmartPointer یک نمونه از vtkRenderer میسازیم و در اشاره‌گر هوشمند VTK که با اسم renderer در هدر تعریف کردیم میریزیم این روند کلی ایجاد یک شی با استفاده از اسمارت پوینتر VTK است و برای بقیه کلاس‌ها هم به همین منوال عمل می‌کنیم  :

renderer = vtkSmartPointer<vtkRenderer>::New();

در خط 19 رنگ پس‌زمینه را تنظیم می‌کنیم مقادیر ورودی این تابع بین 0 و 1 هستند و نشانگر استاندارد رنگی قرمز-سبز-آبی است :

renderer->SetBackground(0, 0, 0);

در خط 20 پنجره رندر از کلاس (به ارث برده شده از QVTKWidget ) را می‌گیریم و رندرر را به آن اضافه میکنیم :

GetRenderWindow()->AddRenderer(renderer);

در خط 22 و 23 یک مکعب ایجاد می‌کنیم :

vtkSmartPointer<vtkCubeSource> cube =
vtkSmartPointer<vtkCubeSource>::New();

در خط 26 یک نمونه برای mapper ایحاد می‌کنیم :

mapper = vtkSmartPointer<vtkPolyDataMapper>::New();

در خط 27 پورت خروجی مکعب را به اتصال ورودی mapper می‌دهیم :

mapper->SetInputConnection(cube->GetOutputPort());

در خطوط 29 تا 32 یک اکتور ایجاد کرده و mapper را که در بالا ساختیم برای ان تنظیم می‌کنیم و اندازه‌ی نقاط را برای ان تنظیم می‌کنیم و در خط 32 رنگ آن را تنظیم می‌کنیم :

actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);
	actor->GetProperty()->SetPointSize(1000);
actor->GetProperty()->SetColor(1, 1, 0); //(R,G,B)

در خط 33 این اکتور را به رندرر اضافه می‌کنیم :

renderer->AddActor(actor);

در خطوط 35 و 36 یک نمونه از axes برای نمایش جهت در کنار صفحه به صورت سه بعدی ایجاد می‌کنیم :

vtkSmartPointer<vtkAxesActor> axes =
vtkSmartPointer<vtkAxesActor>::New();

در خطوط 38 و 39 یک ویوپورت برای نمایش این جهت‌نما درست می‌کنیم چون نمیخواهیم با جابجایی سه بعدی صحنه این جهت‌نما از گوشه پنجره نکان بخورد و حرکت انتقالی در سه بعد داشته باشد:

vtkSmartPointer<vtkOrientationMarkerWidget> axesViewPort =
vtkOrientationMarkerWidget::New();

در خطوط 41 تا 46 به ترتیب رنگ دور ویوپورت ، اکتور جهت نمایش ، اینتراکتور رندر ویندو ، اندازه و مکان دو بعدی ویو پورت در صفحه ( بین پراپرتی‌ها بین 0 و 1 هستند ) ، فعال بودن و تعاملی بودن را تنظیم می‌کنیم که این گزینه آخر در صورت فعال بودن این امکان را به کاربر می‌دهد که با موس ویوپورت ساخته شده را جابجا کند :

axesViewPort->SetOutlineColor(0.9300, 0.5700, 0.1300);
axesViewPort->SetOrientationMarker(axes);
axesViewPort->SetInteractor(GetRenderWindow()->GetInteractor());
axesViewPort->SetViewport(0.9, 0.0, 1.0, 0.1);
axesViewPort->SetEnabled(1);
axesViewPort->InteractiveOff();

در خط 48 مکان دوربین فعال را تنظیم می‌کنیم :

renderer->GetActiveCamera()->SetPosition(1000, 2500, 1000);

در خط 49 تابع رندر از رندرر را صدا زده :

renderer->GetActiveCamera()->SetPosition(1000, 2500, 1000);

و در خط 50 تابع ریست دوربین رندرر را صدا میزنیم تا تغییراتی که انجام دادیم قابل مشاهده شوند :

renderer->ResetCamera();

 

  • پسندیدن 2
  • تشکر شده 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
مهمان
این موضوع برای عدم ارسال قفل گردیده است.

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...