日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

VTK修炼之道9:坐标系统及空间变换(窗口-视图分割)

發(fā)布時間:2025/3/15 windows 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VTK修炼之道9:坐标系统及空间变换(窗口-视图分割) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.坐標(biāo)系統(tǒng)

計算機(jī)圖形學(xué)里常用的坐標(biāo)系統(tǒng)主要有四種,分別是:Model坐標(biāo)系統(tǒng)、World坐標(biāo)系統(tǒng)、View坐標(biāo)系統(tǒng)和Display坐標(biāo)系統(tǒng),以及兩種表示坐標(biāo)點的方式:以屏幕像素值為單位和歸一化坐標(biāo)值(各坐標(biāo)軸取值都為[-1, 1])。
Model坐標(biāo)系統(tǒng)是定義模型時所采用的坐標(biāo)系統(tǒng),通常是局部的笛卡爾坐標(biāo)系。例如,我們要定義一個表示球體的Actor,一般的做法是將該球體定義在一個柱坐標(biāo)系統(tǒng)里。
World坐標(biāo)系統(tǒng)是放置Actor的三維空間坐標(biāo)系,Actor其中的一個功能就是負(fù)責(zé)將模型從Model坐標(biāo)系統(tǒng)變換到World坐標(biāo)系統(tǒng)。每一個模型可以定義有自己的Model坐標(biāo)系統(tǒng),但World坐標(biāo)系只有一個,每一個Actor必須通過放縮、旋轉(zhuǎn)、平移等操作將Model坐標(biāo)系變換到World坐標(biāo)系。World坐標(biāo)系同時也是相機(jī)和光照所在的坐標(biāo)系統(tǒng)。
View坐標(biāo)系統(tǒng)表示的是相機(jī)所看見的坐標(biāo)系統(tǒng)。X、Y、Z軸取值為[-1, 1],X、Y值表示像平面上的位置,Z值表示到相機(jī)的距離。相機(jī)負(fù)責(zé)將World坐標(biāo)系變換到View坐標(biāo)系。

坐標(biāo)之間的關(guān)系如下圖所示:


Display坐標(biāo)系統(tǒng)跟View坐標(biāo)系統(tǒng)類似,但是各坐標(biāo)軸的取值不是[-1, 1],而是使用屏幕像素值。屏幕上顯示的不同窗口的大小會影響View坐標(biāo)系的坐標(biāo)值[-1, 1]到Display坐標(biāo)系的映射。可以把不同的渲染場景放在同一個窗口進(jìn)行顯示,例如,在一個窗口里,分為左右兩個渲染場景,這左右的渲染場景(vtkRenderer)就是不同的視口(Viewport)。

2.一個窗口分割為多個視窗

/***************************************************** *Overview:窗口分割 2016-11-25 *Tsinghua Univ. All Rights Reserved@Shenchunxu ******************************************************/ #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkConeSource.h> #include <vtkCubeSource.h> #include <vtkCylinderSource.h> #include <vtkSphereSource.h> #include <vtkPolyDataMapper.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkActor.h> #include <vtkRenderWindowInteractor.h> #include <vtkSmartPointer.h>int main() {vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New();vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();vtkSmartPointer<vtkSphereSource> sphere = vtkSmartPointer<vtkSphereSource>::New();vtkSmartPointer<vtkPolyDataMapper> coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();coneMapper->SetInputConnection(cone->GetOutputPort());vtkSmartPointer<vtkPolyDataMapper> cubeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();cubeMapper->SetInputConnection(cube->GetOutputPort());vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();cylinderMapper->SetInputConnection(cylinder->GetOutputPort());vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();sphereMapper->SetInputConnection(sphere->GetOutputPort());vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();coneActor->SetMapper(coneMapper);vtkSmartPointer<vtkActor> cubeActor = vtkSmartPointer<vtkActor>::New();cubeActor->SetMapper(cubeMapper);vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();cylinderActor->SetMapper(cylinderMapper);vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();sphereActor->SetMapper(sphereMapper);vtkSmartPointer<vtkRenderer> renderer1 = vtkSmartPointer<vtkRenderer>::New();renderer1->AddActor(coneActor);renderer1->SetBackground(1.0,0.0,0.0);renderer1->SetViewport(0.0,0.0,0.5,0.5);vtkSmartPointer<vtkRenderer> renderer2 = vtkSmartPointer<vtkRenderer>::New();renderer2->AddActor(cubeActor);renderer2->SetBackground(0.0,1.0,0.0);renderer2->SetViewport(0.5,0.0,1.0,0.5);vtkSmartPointer<vtkRenderer> renderer3 = vtkSmartPointer<vtkRenderer>::New();renderer3->AddActor(cylinderActor);renderer3->SetBackground(0.0,0.0,1.0);renderer3->SetViewport(0.0,0.5,0.5,1.0);vtkSmartPointer<vtkRenderer> renderer4 = vtkSmartPointer<vtkRenderer>::New();renderer4->AddActor(sphereActor);renderer4->SetBackground(1.0,1.0,0.0);renderer4->SetViewport(0.5,0.5,1.0,1.0);vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();renWin->AddRenderer(renderer1);renWin->AddRenderer(renderer2);renWin->AddRenderer(renderer3);renWin->AddRenderer(renderer4);renWin->SetSize( 640, 480 );renWin->Render();renWin->SetWindowName("ViewPort");vtkSmartPointer<vtkRenderWindowInteractor> interactor =vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renWin);renWin->Render();interactor->Initialize();interactor->Start();return EXIT_SUCCESS; }運行結(jié)果:


3.空間變換

遵循幾何變換,已經(jīng)詳細(xì)論述過,不在多談!

4.總結(jié)視圖

一張圖可以考驗之前學(xué)過的知識是否真正的理解了!


總結(jié)

以上是生活随笔為你收集整理的VTK修炼之道9:坐标系统及空间变换(窗口-视图分割)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。