VTK————3D模型的旋转、交互、透明度设置

这篇具有很好参考价值的文章主要介绍了VTK————3D模型的旋转、交互、透明度设置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模型旋转

旋转模型的话可以用到以下例程,但是每次设置选择坐标时,都是累加的。可以通过SetOrientation来将模型方向设为初试方向。如果三个坐标都使用较大值来进行旋转,那么由于累加的特性。模型会在空间内进行大幅度的旋转和位移,这是需要注意的。

void rotate( double x, double y, double z,int mode){

    if (Actor== nullptr) {

        return;
    }
    if(mode==1){
    // 将模型的方向设置为初始方向(0度旋转)
    Actor->SetOrientation(0, 0, 0);

    // 触发渲染以更新视图
    render->interactor()->Render();

    }
    else{
    Actor->RotateX(x);
    Actor->RotateY(y);
    Actor->RotateZ(z);
    3DRender->AddActor(m_modelActor);

    }

    render->interactor()->Render();

}

也可以通过设置interactor 的 style 为 vtkInteractorStyleTrackballActor,来使用鼠标来控制 STL 模型的位置和方向。

    // Set the interaction style to vtkInteractorStyleTrackballActor
    vtkSmartPointer<vtkInteractorStyleTrackballActor> style = 
        vtkSmartPointer<vtkInteractorStyleTrackballActor>::New();
    m_renderWidget[3]->interactor()->SetInteractorStyle(style);

但是,存在一个问题,vtkInteractorStyleTrackballActor 和 vtkInteractorStyleTrackballCamera 之间存在冲突,因为它们控制不同的对象。vtkInteractorStyleTrackballActor 控制的是 actors,而 vtkInteractorStyleTrackballCamera 控制的是 camera,这样会导致无法实现3D模型的交互。

一种可能的解决方案是创建一个自定义的 interactor style,它在不同的模式下切换 vtkInteractorStyleTrackballActor 和 vtkInteractorStyleTrackballCamera。例如,当用户按下一个特定的键(比如 “c”)时,切换到 camera 控制模式,当用户按下另一个键(比如 “a”)时,切换到 actor 控制模式。

class CustomInteractorStyle : public vtkInteractorStyleTrackballCamera
{
public:
    static CustomInteractorStyle* New();
    vtkTypeMacro(CustomInteractorStyle, vtkInteractorStyleTrackballCamera);

    virtual void OnKeyPress() override
    {
        // Get the keypress
        vtkRenderWindowInteractor *rwi = this->Interactor;
        std::string key = rwi->GetKeySym();

        // Output the key that was pressed
        std::cout << "Pressed " << key << std::endl;

        // Handle an arrow key
        if(key == "a")
        {
            vtkInteractorStyleTrackballActor::SafeDownCast(rwi->GetInteractorStyle())->OnKeyPress();
        }
        else if(key == "c")
        {
            vtkInteractorStyleTrackballCamera::SafeDownCast(rwi->GetInteractorStyle())->OnKeyPress();
        }

        // Forward events
        vtkInteractorStyleTrackballCamera::OnKeyPress();
    }

private:

};

vtkStandardNewMacro(CustomInteractorStyle);

透明度设置

compositeOpacity:这是一个分段线性函数,用于定义不同灰度值的体素的透明度。函数的每个点由四个值定义:灰度值,透明度,左斜率和右斜率。例如,在 compositeOpacity->AddPoint(-3024, 0, 0.5, 0.0) 中,-3024 是灰度值,0 是该灰度值的透明度,0.5 和 0.0 分别是左斜率和右斜率。

color:这是一个颜色传递函数,用于定义不同灰度值的体素的颜色。函数的每个点由五个值定义:灰度值,红色分量,绿色分量,蓝色分量,中间点和中间点的斜率。例如,在 color->AddRGBPoint(-3024, 0, 0, 0, 0.5, 0.0) 中,-3024 是灰度值,0, 0, 0 分别是红色、绿色和蓝色分量,0.5 和 0.0 分别是中间点和中间点的斜率。

这两个函数通常一起使用来定义体绘制的颜色和透明度。在这个例子中,compositeOpacity 和 color 传递函数的灰度值是相同的,这意味着对于给定的灰度值,颜色和透明度都会被定义。

    vtkNew<vtkPiecewiseFunction> compositeOpacity;
    compositeOpacity->AddPoint(-3024, 0, 0.5, 0.0);
    compositeOpacity->AddPoint(-16, 0, .49, .61);
    compositeOpacity->AddPoint(641, 0.5, .5, 0.0);
    compositeOpacity->AddPoint(3071, 0.5, 0.5, 0.0);

    vtkNew<vtkColorTransferFunction> color;
    color->AddRGBPoint(-3024, 0, 0, 0, 0.5, 0.0);
    color->AddRGBPoint(-16, 0.73, 0.25, 0.30, 0.49, .61);
    color->AddRGBPoint(641, .90, .82, .56, .5, 0.0);
    color->AddRGBPoint(3071, 1, 1, 1, .5, 0.0);


如果想要实时调整模型的透明度,可以在QT界面上绑定QSlider部件,然后根据槽函数机制,来设定透明度大小。QSlider 只支持整型,而不支持浮点数(double)。但可以通过一些技巧来实现这个效果。首先,将滑块的最小值设置为0,最大值设置为20,因为1 / 0.05 = 20,这样你可以得到0.05的步进。
值得注意的是,不一定要局限于把透明度最大值设为1,超出1以后的透明值也能带来意料之外的效果。文章来源地址https://www.toymoban.com/news/detail-692806.html

    ui->horizontalSlider->setMinimum(0); // 最小值
    ui->horizontalSlider->setMaximum(20); // 最大值
    connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), this, SLOT(on_sliderValueChanged(int)));

void on_ValueChanged(int value)
{
    double doubleValue = value / 20.0;
    vtkNew<vtkPiecewiseFunction> compositeOpacity;
    compositeOpacity->AddPoint(-3024, 0, 0.5, 0.0);
    compositeOpacity->AddPoint(-16, 0, .49, .61);
    compositeOpacity->AddPoint(641,doubleValue, .5, 0.0);
    compositeOpacity->AddPoint(3071, doubleValue, 0.5, 0.0);


    Volume->GetProperty()->SetScalarOpacity(newCompositeOpacity);
    render->interactor()->Render();

}

到了这里,关于VTK————3D模型的旋转、交互、透明度设置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • WPF 控件设置透明度的方法

    WPF 控件设置透明度的方法

    方法一:通过 Opacity 属性设置背景色透明度。范围从0-1,0表示完全透明,看不见。     通过 Opacity 属性去改变控件透明度 会影响子控件的透明度,是因为Opacity属性是在UIElement 类(以及Brush基类)中定义,所有元素都具有该属性; 界面如下图图  方法二:通过Background 属性的

    2024年02月11日
    浏览(13)
  • uniapp中map组件打点/地图上显示圆/设置map圆的透明度(十六进制颜色透明度)

    uniapp中map组件打点/地图上显示圆/设置map圆的透明度(十六进制颜色透明度)

    一般来说我们都是想设置成透明的圆,十六进制的后两位表示颜色 eg:#0000006A 6A就是表示透明度,数字越大透明度越高

    2024年02月12日
    浏览(10)
  • iOS 使用Hex色值设置颜色(可设置透明度使用4个字节色值赋值)

    简单来说就是用十六机制来表示三原色,三原色不同强度组合出不同颜色; 详见:Hex色值是什么(含透明度) iOS不如 Kotlin 有API可直接支持HEX赋值,得自己写个扩展方法 普通无透明度代码如下: 带透明度的代码如下(注意此处解析顺序是RGBA,如仿Kotlin可改为ARGB):

    2024年04月27日
    浏览(11)
  • matlab中画有重影的机器人运动过程【给另一个机器人设置透明度】

    matlab中画有重影的机器人运动过程【给另一个机器人设置透明度】

    1、前言如题 2、参考连接如下 How to plot two moving robot in the same figure and change one of them transparency? - MATLAB Answers - MATLAB Central (mathworks.cn)3、代码:【找到figure中对应对象并设置属性】 4、结果【同样的轨迹,实影的先运动几个步数,虚影后续运动】    

    2024年02月17日
    浏览(13)
  • 在direct3D中,透明度处理和D2D1_ALPHA_MODE_PREMULTIPLIED含义?

    D2D1_ALPHA_MODE_PREMULTIPLIED 是 Direct2D 中定义的一种 Alpha 模式,用于描述像素颜色值和其 Alpha 通道(透明度)之间的关系。 在非预乘 Alpha (Straight or Unpremultiplied Alpha) 图像中,每个颜色分量(红、绿、蓝)是独立于 Alpha 值的。而在预乘 Alpha 图像中,每个颜色分量已经被其对应的

    2024年01月25日
    浏览(11)
  • 透明度和透明贴图制作玻璃水杯

    透明度和透明贴图制作玻璃水杯

    模型透明度是指一个物体或模型在呈现时的透明程度。它决定了物体在渲染时,是否显示其后面的物体或背景。 在图形渲染中,透明度通常以0到1之间的值表示。值为0表示完全透明,即物体不可见,背景或其他物体完全穿透;值为1表示完全不透明,即物体完全可见,没有透

    2024年02月07日
    浏览(10)
  • 【CSS 23】颜色 RGBA HSLA 不透明度opacity 线性渐变 径向渐变 透明度渐变 重复渐变

    颜色 CSS 支持 140 多种颜色名称,以及十六进制值、RGB 值、RGBA 值、HSL 值、HSLA 值和不透明度 RGBA颜色 RGBA 颜色值是 RGB 颜色值的扩展,带有 alpha 通道 - 该通道规定颜色的不透明度 RGBA 颜色值是这样规定的:rgba(red, green, blue, alpha) alpha 参数是介于 0.0(完全透明)和 1.0(完全不

    2024年02月13日
    浏览(10)
  • Unity之透明度混合与ps的透明度混合计算结果不一致(gamma矫正和线性空间)

    Unity之透明度混合与ps的透明度混合计算结果不一致(gamma矫正和线性空间)

    前段时间学习shader时发现了一个问题,一张纯红色透明度为128的图片叠加在一张纯绿色的图片上在unity中得出的结果与ps中的结果不一致。网上查找了ps中的透明混合的公式为  color = A.rgb*A.alpha + B.rgb*(1-A.alpha)。自己计算了一下结果总是不对。  红色透明度128的图           

    2024年02月05日
    浏览(40)
  • Android中设置颜色透明度

    1.布局中的xml设置 2.在代码中用的话就是用Java代码设置是这样设置的 3.从FF开始表示完全不透明,到00表示完全透明。左边的是透明百分比,右边是透明的代号,如果你想设置颜色透明50%,就是 #809E9E9E

    2024年02月14日
    浏览(8)
  • 人工智能透明度的最新进展

    作者:禅与计算机程序设计艺术 人工智能(AI)已经成为社会发展的重要组成部分。随着人工智能技术的不断发展,在法律界也逐渐将其作为重要的驱动力之一。然而,由于人工智能算法和模型的黑箱特性,加之对人工智能模型的理解能力有限,因此导致人工智能系统产生的

    2024年02月08日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包