python vtk mousemove_VTK的视点研究之三维空间漫游(转载)

VTK的视点研究之三维空间漫游(转载)

分类:计算机

2009-08-17 16:19

阅读(?)评论(0)

#include

#include "vtkConeSource.h"

#include "vtkPolyDataMapper.h"

#include "vtkRenderWindow.h"

#include "vtkCamera.h"

#include "vtkActor.h"

#include "vtkRenderer.h"

#include "vtkDICOMImageReader.h"

#include "vtkSphereSource.h"

#include "vtkRenderWindowInteractor.h"

#include "vtkImageCast.h"

#include "vtkCallbackCommand.h"

#include "vtkRenderWindowInteractor.h"

#include "vtkImageDataGeometryFilter.h"

#include "vtkWarpScalar.h"

#include "vtkWindowLevelLookupTable.h"

#include "vtkImageMapToWindowLevelColors.h"

#include "vtkInteractorStyleTrackballCamera.h"

#include "vtkInteractorStyle.h"

#include "vtkInteractorEventRecorder.h"

#include "vtkTextActor.h"

#include "vtkSphereSource.h"

#include

#include

#include "vtkTextProperty.h"

#include "vtkOrientationMarkerWidget.h"

#include "vtkAxesActor.h"

#include "vtkCaptionActor2D.h"

#include

#include

#include

#include "vtkSphereSource.h"

#include "vtkPlane.h"

#include "vtkClipPolyData.h"

#include "vtkTextureMapToCylinder.h"

#include "vtkPolyDataNormals.h"

#include "vtkTextureMapToCylinder.h"

#include "vtkTransformTextureCoords.h"

#include "vtkDataSetMapper.h"

vtkRenderWindowInteractor *iren;

vtkCamera *aCamera;

vtkRenderer *ren1;

vtkRenderWindow *renWin;

vtkTextActor *txt;

vtkActor *feidie;

vtkInteractorEventRecorder *recorder;

int pos;

float dis;

char BoxWidgetEventLog[] =

"LeftButtonPressEvent 153 253 0 0 0 0 i\n"

"MouseMoveEvent 153 252 0 0 0 0 i\n"

"LeftButtonReleaseEvent 153 252 0 0 0 0 i\n"

;

void keypress(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata);

int main()

{

ren1= vtkRenderer::New();

renWin = vtkRenderWindow::New();

renWin->AddRenderer( ren1 );

iren = vtkRenderWindowInteractor::New();

iren->SetRenderWindow(renWin);

vtkInteractorStyleTrackballCamera *style=vtkInteractorStyleTrackballCamera::New();

pos=3;

dis=0.7;

vtkDICOMImageReader   *dr = vtkDICOMImageReader::New();

dr->SetDataByteOrderToLittleEndian();

dr->SetFileName("E://CT/100098.dcm");

dr->SetDataOrigin(0.0,0.0,0.0);

vtkLookupTable *hueLut=vtkLookupTable::New();

hueLut->SetTableRange (0, 2000);

hueLut->SetHueRange (0, 1);

hueLut->SetSaturationRange (1, 1);

hueLut->SetValueRange (1, 1);

hueLut->SetAlpha(1);

hueLut->Build(); //effective built

vtkImageMapToWindowLevelColors* pImageMapToColors = vtkImageMapToWindowLevelColors ::New();

pImageMapToColors->SetOutputFormatToRGBA();

pImageMapToColors->SetInput((vtkDataObject *)dr->GetOutput());

pImageMapToColors->SetLookupTable(hueLut);

vtkImageDataGeometryFilter *geo=vtkImageDataGeometryFilter::New();

geo->SetInput((vtkDataObject *)pImageMapToColors->GetOutput());

vtkWarpScalar *scalar=vtkWarpScalar::New();

scalar->SetInput(geo->GetOutput());

scalar->SetScaleFactor(0.06);

scalar->UseNormalOff ( );

scalar->SetUseNormal (60);

vtkPolyDataMapper *skinMapper1 = vtkPolyDataMapper::New();

skinMapper1->SetInputConnection(scalar->GetOutputPort());

//   skinMapper1->SetScalarRange(-1000,2000);

//   skinMapper1->ImmediateModeRenderingOff();

vtkActor *skin1 = vtkActor::New();

skin1->SetMapper(skinMapper1);

txt = vtkTextActor::New();

txt->SetDisplayPosition(0, 0);

txt->SetInput("Information Shown!");

txt->GetTextProperty()->SetFontSize(18);

txt->GetTextProperty()->SetFontFamilyToArial();

txt->GetTextProperty()->BoldOff();

txt->GetTextProperty()->ItalicOn();

txt->GetTextProperty()->ShadowOn();

txt->GetTextProperty()->SetColor(0, 0, 1);

vtkSphereSource *sphere = vtkSphereSource::New();

sphere->SetThetaResolution(10);

sphere->SetPhiResolution(10);

sphere->SetRadius(0.3);

vtkTransform *aTransform = vtkTransform::New();

aTransform->Scale(1,1,0.2);

vtkTransformFilter *transFilter = vtkTransformFilter::New();

transFilter->SetInput(sphere->GetOutput());

transFilter->SetTransform(aTransform);

vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();

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

feidie = vtkActor::New();

feidie->SetMapper(mapper);

/

vtkCallbackCommand * cmd1 = vtkCallbackCommand::New();

cmd1->SetCallback(keypress);

style-> AddObserver (vtkCommand::KeyPressEvent,cmd1);

/

//方向

vtkAxesActor* axes2 = vtkAxesActor::New();

axes2->SetShaftTypeToCylinder();

axes2->SetXAxisLabelText( "X" );

axes2->SetYAxisLabelText( "Y" );

axes2->SetZAxisLabelText( "Z" );

axes2->SetTotalLength( 1.5, 1.5, 1.5 );

axes2->SetCylinderRadius( 0.500 * axes2->GetCylinderRadius() );

axes2->SetConeRadius   ( 1.025 * axes2->GetConeRadius() );

axes2->SetSphereRadius ( 1.500 * axes2->GetSphereRadius() );

vtkTextProperty* tprop2 = axes2->GetXAxisCaptionActor2D()->GetCaptionTextProperty();

tprop2->ItalicOn();

tprop2->ShadowOn();

tprop2->SetFontFamilyToTimes();

axes2->GetYAxisCaptionActor2D()->GetCaptionTextProperty()->ShallowCopy( tprop2 );

axes2->GetZAxisCaptionActor2D()->GetCaptionTextProperty()->ShallowCopy( tprop2 );

vtkOrientationMarkerWidget *widget = vtkOrientationMarkerWidget::New();

widget->SetOutlineColor( 0.9300, 0.5700, 0.1300 );

widget->SetOrientationMarker( axes2 );

widget->SetInteractor( iren );

widget->SetViewport( 0.85, 0.0, 1, 0.2 );

widget->SetEnabled( 1 );

widget->InteractiveOff();

widget->InteractiveOn();

/天空纹理

vtkJPEGReader *pnm1=vtkJPEGReader::New();

pnm1-> SetFileName("高山云海_04.jpg");

vtkTexture *atext=vtkTexture::New();

atext-> SetInputConnection(pnm1->GetOutputPort());

atext-> InterpolateOn();

vtkSphereSource *sphere1 = vtkSphereSource::New();

sphere1->SetThetaResolution(100);

sphere1->SetPhiResolution(100);

sphere1->SetRadius(100);

vtkPlane *plane1=vtkPlane::New();

plane1->SetNormal(0,0,1);//设置切平面的法向量

plane1->SetOrigin(1,0,0);

vtkClipPolyData *clipper=vtkClipPolyData::New();

clipper->SetInputConnection(sphere1-> GetOutputPort());

clipper->SetClipFunction(plane1);

clipper->InsideOutOff();

vtkPolyDataNormals *normals=vtkPolyDataNormals::New();

normals-> SetInputConnection (clipper->GetOutputPort());

normals-> FlipNormalsOn();

vtkTextureMapToCylinder *tmapper=vtkTextureMapToCylinder::New();

tmapper->SetInput(normals->GetOutput());

tmapper->PreventSeamOn();

vtkTransformTextureCoords *xform=vtkTransformTextureCoords::New();

xform-> SetInputConnection(tmapper-> GetOutputPort());

xform-> SetScale( 1, 1, 1);

vtkDataSetMapper *franMapper=vtkDataSetMapper::New();

franMapper-> SetInputConnection(xform-> GetOutputPort());

vtkActor *franActor =vtkActor::New();

franActor -> SetMapper (franMapper);

franActor -> SetTexture (atext);

franActor -> SetPosition(100,100,0);

ren1->AddActor(skin1);

ren1->AddActor(txt);

ren1->AddActor(feidie);

ren1->AddActor(franActor);

ren1->SetBackground( 0.0, 0.6, 1.0 );

aCamera = vtkCamera::New();

ren1->SetActiveCamera(aCamera);

ren1->ResetCamera();

aCamera->SetPosition(100,100,5);

aCamera->SetFocalPoint(110,100,5);

aCamera->SetViewUp(0,0,1);

feidie->SetPosition(103,100,5);

// record events

recorder = vtkInteractorEventRecorder::New();

recorder->SetInteractor(iren);

recorder->ReadFromInputStringOn();

recorder->SetInputString(BoxWidgetEventLog);

//调整视窗大小

renWin->SetSize( 800, 600 );

iren-> SetInteractorStyle(style);

iren->Initialize();

renWin->Render();

recorder->Play();

recorder->Off();

iren->Start();

//   dr->Delete();

ren1->Delete();

renWin->Delete();

iren->Delete();

return 0;

}

void keypress(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata)

{

char key=iren->GetKeyCode();

double normal[3];

double focal[3];

double position[3];

double view[3];

switch (key)

{

case '8':

aCamera->GetViewPlaneNormal (normal);

aCamera->GetFocalPoint(focal);

aCamera->GetPosition(position);

position[0]=position[0]-pos*normal[0];

position[1]=position[1]-pos*normal[1];

//position[2]=position[2]-pos*normal[2];

focal[0]=focal[0]-pos*normal[0];

focal[1]=focal[1]-pos*normal[1];

//focal[2]=focal[2]-pos*normal[2];

aCamera->SetPosition(position);

aCamera->SetFocalPoint(focal);

break;

case '5':

aCamera->GetViewPlaneNormal (normal);

aCamera->GetFocalPoint(focal);

aCamera->GetPosition(position);

position[0]=position[0]+pos*normal[0];

position[1]=position[1]+pos*normal[1];

//position[2]=position[2]+pos*normal[2];

focal[0]=focal[0]+pos*normal[0];

focal[1]=focal[1]+pos*normal[1];

//focal[2]=focal[2]+pos*normal[2];

aCamera->SetPosition(position);

aCamera->SetFocalPoint(focal);

break;

case '6':

aCamera->Yaw (-pos);

break;

case '4':

aCamera->Yaw (pos);

break;

case 'n':

aCamera->Pitch(-pos);

break;

case 'm':

aCamera->Pitch(pos);

break;

case '+':

pos=pos+1;

printf("%d\n",pos);

break;

case '-':

pos=pos-1;

printf("%d\n",pos);

break;

case '.':

aCamera->GetViewPlaneNormal (normal);

aCamera->GetFocalPoint(focal);

focal[0]=focal[0]+normal[0];

focal[1]=focal[1]+normal[1];

focal[2]=focal[2]+normal[2];

aCamera->SetFocalPoint(focal);

break;

case ',':

aCamera->GetViewPlaneNormal (normal);

aCamera->GetFocalPoint(focal);

focal[0]=focal[0]-normal[0];

focal[1]=focal[1]-normal[1];

focal[2]=focal[2]-normal[2];

aCamera->SetFocalPoint(focal);

break;

case 'v':

aCamera->SetViewUp(0,0,1);

break;

case 'c':

case '0':

aCamera->SetPosition(100,100,5);

aCamera->SetFocalPoint(110,100,5);

aCamera->SetViewUp(0,0,1);

recorder->Play();

recorder->Off();

break;

case 'b':

if (feidie->GetVisibility())

feidie->VisibilityOff();

else

feidie->VisibilityOn();

break;

case '*'://上

aCamera->GetFocalPoint(focal);

aCamera->GetPosition(position);

position[2]=position[2]-pos/3.0;

focal[2]=focal[2]-pos/3.0;

aCamera->SetPosition(position);

aCamera->SetFocalPoint(focal);

break;

case '/'://下

aCamera->GetFocalPoint(focal);

aCamera->GetPosition(position);

position[2]=position[2]+pos/3.0;

focal[2]=focal[2]+pos/3.0;

aCamera->SetPosition(position);

aCamera->SetFocalPoint(focal);

break;

}

aCamera->GetViewPlaneNormal (normal);

aCamera->GetFocalPoint(focal);

aCamera->GetPosition(position);

aCamera->GetViewUp(view);

double length;

length=sqrt((focal[0]-position[0])*(focal[0]-position[0])+

(focal[1]-position[1])*(focal[1]-position[1])+

(focal[2]-position[2])*(focal[2]-position[2]));

char text[300];

sprintf(text," Distance of focus: %f\n normal: %f,%f,%f\n position: %f,%f,%f\n focal: %f,%f,%f\n viewup: %f,%f,%f\n",

length,

normal[0],normal[1],normal[2],

position[0],position[1],position[2],

focal[0],focal[1],focal[2],

view[0],view[1],view[2]);

txt->SetInput(text);

if (feidie->GetVisibility())

{

double dp[3];

dp[0]=position[0]*dis+focal[0]*(1-dis);

dp[1]=position[1]*dis+focal[1]*(1-dis);

dp[2]=position[2]*dis+focal[2]*(1-dis);

feidie->SetPosition(dp);

}

renWin->Render();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php实现金币提现,PHP实现微信提现功能

本文实例为大家分享了PHP实现微信提现功能的具体代码,供大家参考,具体内容如下一、实现功能这几天在小程序里要实现用户从系统中提现到零钱的功能,查了一下文档可以使用 企业付款到用户零钱 来实现;官方文档注意事项:商…

oracle 同义词_【干货7】Oracle知识关键代码摘要

(如果我分享的干货内容对你有帮助,可以通过赞或者评论的方式告诉我,我会持续分享;或者留言你想要的IT方面的支持,我将分享大家感兴趣的IT类技术干货;如果没有收到大家的反馈,10天后我将停止技术…

php new static,PHP面向对象中new self( )和 new static( ) 的区别

首先阐明结论,在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类。接下来通过一个例子来证明上面的结果class A{public static $_a Class A;public static function echoProperty(){echo self::$_a . PHP_EOL;}}class B exten…

python 动态规划_DP动态规划(Python实现)

前言_我们遇到的问题中,有很大一部分可以用动态规划(简称DP)来解。 解决这类问题可以很大地提升你的能力与技巧,我会试着帮助你理解如何使用DP来解题。 这篇文章是基于实例展开来讲的,因为干巴巴的理论实在不好理解。注意:如果你对…

php gif 透明,解决PHP剪切缩略图生成png,gif透明图时,黑色背景问题

背景图填充白色背景$white imagecolorallocate($dstim,255,255,255);imagefilledrectangle($dstim,0,0,$width,$height,$white);imagecolortransparent($dstim,$white);设置图片走透明通道$img imagecreatefrompng($src);imagesavealpha($img,true);//这里很重要;$thumb ima…

qt做的接收串口数据并显示曲线_QT无人机地面站设计与制作

近年来,无人机可谓是大火。无论是军事,还是民用,它的地位更是不用说。但,如何利用利用现有技术对无人机的信息进行操作,实现人、机合一呢?“无人机地面站”应运而生,结合仿真系统为地面工作人员…

php直接读取csv文件,php实现的读取CSV文件函数示例

本文实例讲述了php实现的读取CSV文件函数。分享给大家供大家参考,具体如下:function read_csv($cvs) {$shuang false;$str file_get_contents($cvs);for ($i0;$iif($str{$i}") {if($shuang) {if($str{$i1}") {$str{$i} *;$str{$i1} *;} el…

系统背景描述_【计算机论文】管件加工管理系统和数据库的结构探析

摘 要:结合"中国制造2025"及德国"工业4.0"的发展趋势,概述目前国内管件生产加工流程的现状和不足,基于对管件加工过程中管件之间的差别、管件加工批次的混合等特点导致的管理难点分析,介绍管件生产加工管理系统的设计思路和工作流程,并对该系统未来可进一步…

python中的命令行参数_python学习笔记6:命令行参数

1. 使用步骤使用步骤如下:# 导入模块import argparse# 获取parser, description文本会显示在help信息中parser argparse.ArgumentParser(descriptionargs discrip)# 添加选项, 具体选项类型见后面各节parser.add_argument(-a)# 解析选项args parser.parse_args(sys.argv[1:])…

php 年的第几天,收藏-php中某年第几天计算出日期年月日的代码

很实用的小功能,希望对大家有帮助。这个索引值除了方便面数据的记录和搜索,还起着记录日期信息的作用,信息量很可观。那么,如何还原索引值为可用的日期资讯呢?date(z)返回的是一年中的第几天,返回值为从0开…

shell tr 替换 空格_Shell 字符串分隔符!!!(全网最详细总结)

前言:在shell脚本编程中,我们经常会用到切割字符串,类似于python中的split。但shell中的命令比较五花八门,小编也是苦扰了很久,终于下定决心对它做一个总结。方法一:字符串替换法#/bin/bashstring"Hel…

php where 不包含,php – 除非它们包含“where”或“like”子句,否则不允许删除

我的查询 –$shortlistpartners是数组$this->db->delete(shortlist_partners);$this->db->where(opp_id,$this->input->post(opp_id));$this->db->where_in(partner_id,$shortlistpartners);除非它们包含“where”或“like”子句,否则不允许删除.错误即…

本机用域名不能访问_域名注册申请网站域名注意事项

互联网用户越来越多,也有越来越多人搭建网站,做个人博客也好、搭建企业官网也好,数量都在逐步上升。做网站的数量在上升,域名注册量肯定也在上升。有的朋友头一次注册域名,对域名不了解也不知道申请网站域名该注意哪些…

电脑微信不用手机确认_不用安装第三方软件,手机投屏到电脑就这么简单

在头条上收到网友的提问,如果想把手机的内容投影到电脑上,该怎么做?为此我做一个简单的教程,不用安装第三方软件,就用Windows 10自带的无线显示功能和安卓手机的自带无线显示功能来实现。前提条件:1. 电脑是…

php图片截取后缀,PHP抓取远程图片(含不带后缀的)教程详解

一、创建项目作为演示,我们在www根目录创建项目grabimg,创建一个类GrabImage.php和一个index.php。二、编写类代码我们定义一个和文件名相同的类:GrabImageclass GrabImage{}三、属性接下来定义几个需要使用的属性。1、首先定义一个需要抓取的…

tomcat7 https 拒绝连接_物与网怎么连接呢?物联网架构及五大通信协议

消息触达能力是物联网(internet ofthings, IOT)的重要支撑,而物联网很多技术都源于移动互联网。柳猫将阐述移动互联网消息推送技术在物联网中的应用和演进。一、物联网架构和关键技术从开发的角度,无线接入是物联网设备端的核心技术,身份设备…

安卓手机浏览器排行_5g时代已来临!五月安卓手机性价比排行:两千元以上5G手机屠榜...

5月已经过去,同时也标志着今年上半年手机的发布已经告一段落。那么在这段时间里,智能手机的性价比如何呢?考虑到现在已经开始步入5G时代,所以智能手机的价格也是普遍上涨,想要找到一款性价比不错的手机似乎有些难度。现…

noclassdeffounderror java,从终端运行Java文件时出现java.lang.NoClassDefFoundError

我是Java新手。我一直在使用Eclipse测试一个简单的Java类(名为NewHelloWorld),它在控制台中运行良好。当我尝试从终端执行相同的操作时,它会正确编译(创建HelloWorld.class而不给出任何错误),但是随后javaNewHelloWorld显示以下错误Exception…

tp3.2 不能提交到action方法_什么是死锁,如何避免死锁(4种方法)

当两个线程相互等待对方释放资源时,就会发生死锁。Python 解释器没有监测,也不会主动采取措施来处理死锁情况,所以在进行多线程编程时应该采取措施避免出现死锁。一旦出现死锁,整个程序既不会发生任何异常,也不会给出任…

虚拟局域网软件开源_ZeroTier虚拟局域网免费远程桌面体验--替代TeamViewer

本文主要是关于使用ZeroTier创建虚拟局域网来实现免费远程桌面的方案的体验,包含了一些对不同方案的优缺点的描述。最近因为疫情在家不得不通过远程连接实验室电脑,有两种基本的解决方案:连接学校VPN,然后使用系统自带的远程桌面连…