VTK包围盒,AABB包围盒

1. 概述

包围盒是指能够包含三维图形的长方体,常常用于模型的碰撞检测。包围盒可以分成:轴对齐包围盒(AABB),有向包围盒(OBB)和凸包(Convex Hull)

今天就来实践一下AABB包围盒

2.绘制一个锥体

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkConeSource.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLight.h>
#include <vtkCamera.h>
#include <vtkOBBTree.h>
#include <vtkActor2D.h>
#include <vtkMath.h>
#include <vtkTransform.h>
#include <vtkTransformFilter.h>
#include <vtkMatrix4x4.h>
#include <vtkInteractorObserver.h>
#include <vtkPolyDataNormals.h>
#include <vtkOutlineFilter.h>
#include <vtkPoints.h>
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkCommand.h"
#include "vtkBoxWidget.h"
#include "vtkTransform.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkBoundingBox.h"
#include "vtkProperty.h"
#include "vtkStructuredData.h"
#include "vtkCellArray.h"
#include<vector>

#include "vtkStructuredData.h"
#include "vtkCellArray.h"



int main()
{
    setbuf(stdout, nullptr);
    vtkSmartPointer<vtkConeSource> cone =
        vtkSmartPointer<vtkConeSource>::New();
    cone->SetDirection(1, 1, 0);
    cone->Update();

    vtkSmartPointer<vtkPolyDataMapper> mapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    //mapper->SetInputData( polydata );
    mapper->SetInputData(cone->GetOutput());

    vtkSmartPointer<vtkActor> actor =
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);


    vtkSmartPointer<vtkRenderer> renderer =
        vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(0, 0, 0);

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

   


    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->GetInteractorStyle()->SetCurrentRenderer(renderer);
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderer->ResetCamera();
    renderWindow->Render();
    renderWindowInteractor->Start();
    return 0;
}

3.绘制包围盒,主要是利用了vtkOutlineFilter

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkConeSource.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLight.h>
#include <vtkCamera.h>
#include <vtkOBBTree.h>
#include <vtkActor2D.h>
#include <vtkMath.h>
#include <vtkTransform.h>
#include <vtkTransformFilter.h>
#include <vtkMatrix4x4.h>
#include <vtkInteractorObserver.h>
#include <vtkPolyDataNormals.h>
#include <vtkOutlineFilter.h>
#include <vtkPoints.h>
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkCommand.h"
#include "vtkBoxWidget.h"
#include "vtkTransform.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkBoundingBox.h"
#include "vtkProperty.h"
#include "vtkStructuredData.h"
#include "vtkCellArray.h"
#include<vector>

#include "vtkStructuredData.h"
#include "vtkCellArray.h"



int main()
{
    setbuf(stdout, nullptr);
    vtkSmartPointer<vtkConeSource> cone =
        vtkSmartPointer<vtkConeSource>::New();
    cone->SetDirection(1, 1, 0);
    cone->Update();

    vtkSmartPointer<vtkPolyDataMapper> mapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    //mapper->SetInputData( polydata );
    mapper->SetInputData(cone->GetOutput());

    vtkSmartPointer<vtkActor> actor =
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // --------------------- start to draw bounding box ------------------------
    vtkSmartPointer<vtkOutlineFilter> outlineFilter =
        vtkSmartPointer<vtkOutlineFilter>::New();
	outlineFilter->SetInputData(cone->GetOutput());
    vtkSmartPointer<vtkPolyDataMapper> outLinemapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    outLinemapper->SetInputConnection(outlineFilter->GetOutputPort());

    vtkSmartPointer<vtkActor> outlineActor = vtkSmartPointer<vtkActor>::New();
    outlineActor->SetMapper(outLinemapper);
    outlineActor->GetProperty()->SetColor(1, 1, 1);
    // --------------------- Drawing bounding box end------------------------


	




    vtkSmartPointer<vtkRenderer> renderer =
        vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->AddActor(outlineActor);
    renderer->SetBackground(0, 0, 0);

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

   


    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->GetInteractorStyle()->SetCurrentRenderer(renderer);
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderer->ResetCamera();
    renderWindow->Render();
    renderWindowInteractor->Start();
    return 0;
}

效果图:

3.修改包围盒的颜色

1.vtkBoundingBox 使用这个类,获取包围盒8个点的坐标

2.vtkPoints,vtkCellArray。设置8个点的坐标信息,拓扑信息,生成对应的vtkPolyData。

3.修改颜色成红色

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkConeSource.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLight.h>
#include <vtkCamera.h>
#include <vtkOBBTree.h>
#include <vtkActor2D.h>
#include <vtkMath.h>
#include <vtkTransform.h>
#include <vtkTransformFilter.h>
#include <vtkMatrix4x4.h>
#include <vtkInteractorObserver.h>
#include <vtkPolyDataNormals.h>
#include <vtkOutlineFilter.h>
#include <vtkPoints.h>
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkCommand.h"
#include "vtkBoxWidget.h"
#include "vtkTransform.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkBoundingBox.h"
#include "vtkProperty.h"
#include "vtkStructuredData.h"
#include "vtkCellArray.h"
#include<vector>

#include "vtkStructuredData.h"
#include "vtkCellArray.h"

typedef struct PointStruct_ {

	PointStruct_(double x, double y, double z)
	{
		point[0] = x;
		point[1] = y;
		point[2] = z;
	}
	double point[3];
	//double pointY;
	//double pointZ;
}PointStruct;



int main()
{
    setbuf(stdout, nullptr);
    vtkSmartPointer<vtkConeSource> cone =
        vtkSmartPointer<vtkConeSource>::New();
    cone->SetDirection(1, 1, 0);
    cone->Update();

    vtkSmartPointer<vtkPolyDataMapper> mapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    //mapper->SetInputData( polydata );
    mapper->SetInputData(cone->GetOutput());

    vtkSmartPointer<vtkActor> actor =
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // --------------------- start to draw bounding box ------------------------
    vtkSmartPointer<vtkOutlineFilter> outlineFilter =
        vtkSmartPointer<vtkOutlineFilter>::New();
	outlineFilter->SetInputData(cone->GetOutput());
    vtkSmartPointer<vtkPolyDataMapper> outLinemapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    outLinemapper->SetInputConnection(outlineFilter->GetOutputPort());

    vtkSmartPointer<vtkActor> outlineActor = vtkSmartPointer<vtkActor>::New();
    outlineActor->SetMapper(outLinemapper);
    outlineActor->GetProperty()->SetColor(1, 1, 1);
    // --------------------- Drawing bounding box end------------------------


	vtkBoundingBox boundingBox;
	for (int i = 0; i < cone->GetOutput()->GetNumberOfPoints(); ++i)
	{
		boundingBox.AddPoint(cone->GetOutput()->GetPoint(i));
	}
	double bounds[6] = { 0 };
	boundingBox.GetBounds(bounds);

	std::vector<PointStruct> pts;
	for (int i = 0; i < 2; ++i)
	{
		for (int j = 2; j < 4; ++j)
		{
			for (int k = 4; k < 6; ++k)
			{
				pts.push_back(PointStruct(bounds[i], bounds[j], bounds[k]));
			}
		}
	}
	for (auto it : pts)
	{
		// cout << it;
		cout << std::to_string(it.point[0]) << "," << std::to_string(it.point[1]) << "," << std::to_string(it.point[2]) << endl;
	}

	vtkSmartPointer<vtkPolyData> boundsPolydata =
		vtkSmartPointer<vtkPolyData>::New();
	vtkSmartPointer<vtkPoints> boundsPoints =
		vtkSmartPointer<vtkPoints>::New();
	for (int i = 0; i < 8; ++i)
	{
		boundsPoints->InsertNextPoint(pts[i].point);
	}
	boundsPolydata->SetPoints(boundsPoints);
	vtkSmartPointer<vtkCellArray> cells =
		vtkSmartPointer<vtkCellArray>::New();
	vtkIdType cell[2] = { 0, 1 };
	cells->InsertNextCell(2, cell);
	cell[0] = 0; cell[1] = 2;
	cells->InsertNextCell(2, cell);
	cell[0] = 3; cell[1] = 2;
	cells->InsertNextCell(2, cell);
	cell[0] = 3; cell[1] = 1;
	cells->InsertNextCell(2, cell);
	cell[0] = 4; cell[1] = 5;
	cells->InsertNextCell(2, cell);
	cell[0] = 4; cell[1] = 6;
	cells->InsertNextCell(2, cell);
	cell[0] = 7; cell[1] = 5;
	cells->InsertNextCell(2, cell);
	cell[0] = 7; cell[1] = 6;
	cells->InsertNextCell(2, cell);
	cell[0] = 1; cell[1] = 5;
	cells->InsertNextCell(2, cell);
	cell[0] = 0; cell[1] = 4;
	cells->InsertNextCell(2, cell);
	cell[0] = 2; cell[1] = 6;
	cells->InsertNextCell(2, cell);
	cell[0] = 3; cell[1] = 7;
	cells->InsertNextCell(2, cell);
	boundsPolydata->SetLines(cells);

    vtkSmartPointer<vtkPolyDataMapper> boundsMapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    boundsMapper->SetInputData(boundsPolydata);

    vtkSmartPointer<vtkActor> boundsActor =
        vtkSmartPointer<vtkActor>::New();
    boundsActor->SetMapper(boundsMapper);
    boundsActor->GetProperty()->SetColor(1, 0, 0);




    vtkSmartPointer<vtkRenderer> renderer =
        vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->AddActor(outlineActor);
	renderer->AddActor(boundsActor);
    renderer->SetBackground(0, 0, 0);

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

   


    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->GetInteractorStyle()->SetCurrentRenderer(renderer);
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderer->ResetCamera();
    renderWindow->Render();
    renderWindowInteractor->Start();
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

任务弹窗更新为任务对话框

1.设计初心 在玩家接取任务/交付任务时&#xff0c;界面弹出的UI &#xff0c;需要与玩家互动&#xff0c;点击“接取”“完成”。等等字样【改动前】频繁的手动点击会中断玩家跑图的流畅性&#xff0c;也降低了任务寻路系统的实际体验。于是现在变成类似FakeObj 对话框的模式…

Filebeat(Beats)详细介绍与使用

1. 什么是 Beats? Beats 是开源数据传送器&#xff0c;将其作为代理安装在服务器上&#xff0c;以将操作数据发送到 Elasticsearch。 Elastic提供Beats用于捕获&#xff1a; 审核数据&#xff1a;Auditbeat 日志文件和日志&#xff1a;Filebeat 云数据&#xff1a;Functio…

网络学习:9个计算机的“网络层”知识点

目录 一、IP 地址 1.1 分类表示法&#xff1a; 1.1.1 分类表示地址的其他说明 1.2 无分类编址 CIDR 二、IP 数据报文格式 Q: IP 报文里有什么&#xff1f;可以不按顺序或者字节来讲一讲 三、 路由概念 3.1 路由表 3.2 路由网络匹配 3.3 ARP 解析 3.4 RARP 逆地址解析…

matplotlib系统学习记录

日期&#xff1a;2024.03.12 内容&#xff1a;将matplotlib的常用方法做一个记录&#xff0c;方便后续查找。 基本使用 # demo01 from matplotlib import pyplot as plt # 设置图片大小,也就是画布大小 fig plt.figure(figsize(20,8),dpi80)#图片大小&#xff0c;清晰度# 准…

代码学习记录18

随想录日记part18 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.13 主要内容&#xff1a;今天的主要内容是二叉树的第七部分&#xff0c;主要涉及二叉搜索树的最近公共祖先 &#xff1b;二叉搜索树的最近公共祖先&#xff1b;删除二叉搜索树中的节点 。 23…

HQChart实战教程70-K线图增加成本线

HQChart实战教程70-K线图增加成本线 成本线Y轴子自定义刻度HQChart插件地址步骤1. 创建成本线2. 动态计算盈利值3. 删除成本线交流示例源码成本线 在K线图上,显示一个根当前账户持仓的成本线,可以快速看到盈利状态。方便盯盘。 效果入下图: 第1行是成本价 第2行是盈利点数…

【C#】.net core 6.0 使用第三方日志插件Log4net,配置文件详细说明

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

基于大模型的 Agent 进行任务规划的10种方式

本文首发自博客 基于大模型的 Agent 进行任务规划的10种方式 基于大模型的 Agent 基本组成应该包含规划&#xff08;planning)&#xff0c;工具&#xff08;Tools)&#xff0c;执行(Action)&#xff0c;和记忆(Memory)四个方面&#xff0c;上一篇中重点讲了进行长记忆管理的 8…

MFC 添加MFC类方法

1、打开工程目录的"类视图" 2、工程名右键添加"MFC类" 3、填写"类名"并选择“基类”CDialog&#xff0c;对话框ID填写添加好的对话框ID

Vue3 前端生成随机id( 生成 UUID )

效果展示 封装工具&#xff08;代码展示&#xff09; 重新创建一个文件**/utils/someTools.js**&#xff0c;并在里面写入如下代码。 function Tools() {}Tools.prototype.guid function () {return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replace(/[xy]/g, function (c) {v…

Junit4入门之什么是单元测试?

干了一年多的后端了&#xff0c;从来没有了解过单元测试。虽然我知道测试不仅仅是测试们的任务&#xff0c;后端也要进行自测来保证自己的代码的可用性&#xff0c;但我一直都只是用postman来实施的&#xff0c;调用调通了即可。虽然我也知道Junit是用于测试的软件&#xff0c;…

汽车屏类产品(五):仪表Cluster常用芯片i.MX117x

前言: 仪表一般就是指方向盘前面那个表盘。做仪表的芯片最主要需要支持显示Display,而仪表的主要排版布局多种多样,但是主旨显示内容不尽相同。 仪表需求: 1、rpm转速表盘 仪表Cluster一般会有转速表盘rpm,单位一般是x1000,大部分汽车仪表范围就是0~8,也就是最高8000…

【Vue3】深入理解Vue3路由器的工作原理to的两种写法

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

大数据 - HBase《一》- Hbase基本概念

目录 1.1. Hbase简介 1.2 Hbase,Hive, Mysql对比 1.3 Hbase数据模型 &#x1f959;region(区域) &#x1f959;rowkey(行键) &#x1f959;列族&#xff08;column family) &#x1f959;列&#xff08;column Qualifier) &#x1f959;版本&#xff08;version)-默认按…

Sui与数据平台ZettaBlock达成合作,为其公测提供数据

Sui一向以闪电般的速度、无限水平扩展著称&#xff0c;现已迅速成为DeFi活动的重要场所。近期&#xff0c;数据平台ZettaBlock宣布在其开创性的Web3数据平台发布中&#xff0c;选择Sui作为基础集成合作伙伴之一。在ZettaBlock的开放测试版发布之际&#xff0c;构建者和开发者将…

【node】初识node以及fs操作,path操作以及http操作(一)

1、不同浏览器使用不同的javaScript引擎 chrome > v8 Firefox > OdinMonkey&#xff08;奥丁猴&#xff09; safri > JSCore IE浏览器>Chakra(查克拉) 2、node是一个基于chrome v8引擎的javaScript运行环境 浏览器是JavaScript的前端运行环境&#xff0c;…

AcrelEMS-MED医院综合能效管理平台在医院电力中的应用

彭姝麟 Acrelpsl 0引言 全医院是公共服务组织&#xff0c;其机构的特殊性决定了医院在提供医疗服务的同时&#xff0c;也需要发挥榜样作用&#xff0c;通过进行能源管理系统的应用&#xff0c;为医院的电力使用和能源消耗进行好的管理&#xff0c;从而减少电能消耗&#xff0…

Web端3D图形引擎HOOPS Commuicator如何实现BIM轻量化?

面对建筑信息模型&#xff08;BIM&#xff09;中复杂大型模型的挑战&#xff0c;如何实现轻量化&#xff0c;并使其能在Web端流畅运行是我们需要解决的问题。而HOOPS Communicator正可凭借其出色的Web端3D模型敏捷解决性&#xff0c;为我们提供强有力的支撑。 HOOPS Communica…

【四】【算法分析与设计】贪心算法的初见

455. 分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都有…

阿里云数据盘挂载目录

1、先登录服务器创建新目录aaa 2、云盘都快照备份下。后续操作完核实无误了&#xff0c;您根据您需求删除快照就行&#xff0c; 然后登录服务器内执行&#xff1a; fdisk -l lsblk blkid ll /aaa 3、执行&#xff1a;&#xff08;以下命令是进行数据盘做ext4文件系统并挂载到…