VTK 三维场景的基本要素(相机) vtkCamera 相机的运动

news2024/11/24 16:53:12

 相机的运动

当物体在处于静止位置时,相机可以在物体周围移动,摄取不同角度的图像 

 

移动

  移动分为相机的移动,和相机焦点的移动;移动改变了相机相对焦点的位置,离焦点更近或者更远;这样就会改变被渲染的物体在视野中的部分;
  相机的移动可以有水平上的移动,垂直方向的移动,前后的移动;

 vtkCamera::Dolly(double value);

    将相机与焦点的距离除以给定的推拉值。使用大于1的值向焦点推拉,
使用小于1的值远离焦点推拉。(缩放)

旋转


相机的旋转:是相机在以焦点为中心的圆球面上移动,因为相机可以水平旋转和垂直旋转;水平旋转就是在相机围绕球心过朝上方向这个轴旋转,也可以说是在球面上的维度进行旋转,但相机的镜头始终指向焦点;水平旋转就是在相机绕球面上的经线向上或者向下旋转;

围绕投影方向旋转相机。这将使摄影机绕其轴旋转:

 vtkCamera::Roll(double angle);

  围绕以焦点为中心的视图向上矢量旋转相机

请注意,视图向上矢量是通过SetViewUp设置的,不一定垂直于投影方向。结果是相机的水平旋转(纬度)

  vtkCamera::Azimuth(double angle);

    使用焦点作为旋转中心,围绕投影方向的负值与视图向上向量的叉积旋转相机。结果是场景的垂直旋转(经度)

    vtkCamera::Elevation(double angle);

    使用相机的位置作为旋转中心,围绕视图向上矢量旋转焦点

请注意,视图向上矢量是通过SetViewUp设置的,不一定垂直于投影方向。结果是场景的水平旋转(纬度)。

 vtkCamera::Yaw(double angle);

    使用相机的位置作为旋转中心,围绕视图向上矢量和投影方向的叉积旋转焦点。

结果是摄影机垂直旋转(经度)。

vtkCamera::Pitch(double angle);

缩放:

    vtkCamera::Zoom(double factor);

    在透视模式下,将视角减小指定的因子。在平行模式下,将平行比例减小指定的因子。
值大于1表示放大,
值小于1表示缩小@注意:当UseExplicitProjectionTransformMatrix为true时,
将忽略此设置。

    重置相机参数 :
 

void ResetCamera();

视频:

相机的旋转:

vtkCameraTest

视频代码:

注意这个只有初始时,旋转是对的;一但旋转后,再旋转可能是错的;

#pragma once
//#include "vtk_include.h"
#include <vtkAppendFilter.h>
#include <vtkCamera.h>
#include <vtkCellArray.h>
#include <vtkConeSource.h>
#include <vtkContourFilter.h>
#include <vtkCubeSource.h>
#include <vtkDataSetMapper.h>
#include <vtkImplicitModeller.h>
#include <vtkLODActor.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkRotationalExtrusionFilter.h>
#include <vtkSphereSource.h>
#include <vtkTextActor.h>
#include <vtkTextProperty.h>
#include <vtkTransform.h>
#include <vtkTransformFilter.h>
#include <vtkTransformPolyDataFilter.h>
#include <vtkWarpTo.h>
#include <algorithm>
#include <vtkInteractorStyleTrackballCamera.h>
#include <array>

#include<stdio.h>
#include<iostream>
using namespace std;

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

	//virtual void OnLeftButtonDown(void);
	//virtual void OnLeftButtonUp(void);
	//virtual void OnRightButtonDown(void);
	//virtual void OnRightButtonUp(void);
	//virtual void OnMiddleButtonDown(void);
	//virtual void OnMiddleButtonUp(void);
	//virtual void OnMouseWheelForward(void);
	//virtual void OnMouseWheelBackward(void);
	//virtual void OnMouseMove(void);

	//	/**
	//* OnChar is triggered when an ASCII key is pressed. Some basic key presses
	//* are handled here ('q' for Quit, 'p' for Pick, etc)
	//*/
	//virtual void OnChar();

	 OnKeyDown is triggered by pressing any key (identical to OnKeyPress()).
	 An empty implementation is provided. The behavior of this function should
	 be specified in the subclass.
	//virtual void OnKeyDown();

	 OnKeyUp is triggered by releaseing any key (identical to OnKeyRelease()).
	 An empty implementation is provided. The behavior of this function should
	 be specified in the subclass.
	//virtual void OnKeyUp();

	 OnKeyPress is triggered by pressing any key (identical to OnKeyDown()).
	 An empty implementation is provided. The behavior of this function should
	 be specified in the subclass.
	//virtual void OnKeyPress();

	 OnKeyRelease is triggered by pressing any key (identical to OnKeyUp()).
	 An empty implementation is provided. The behavior of this function should
	 be specified in the subclass.
	//virtual void OnKeyRelease();

	void  OnKeyPress()
	{

		switch (this->Interactor->GetKeyCode())
		{
		case 'a':
		case 'A':
			cout << "A " << endl;
			m_Camera->Azimuth(1);
			break;

		case 'b':
		case 'B':
			m_Camera->Roll(1);
			cout << "b " << endl;
			break;
		case 'v':
		case 'V':
			m_Camera->Elevation(1);

			cout << "v " << endl;
			break;
		}
		m_RenderWindows->Render();
	}

public:
	vtkCamera * m_Camera;
	vtkRenderWindow* m_RenderWindows;
};


vtkStandardNewMacro(Normal3DCameraStyle);//必须加!!!!

void main()
	{
		vtkNew<vtkNamedColors> colors;

		// Set the colors.
		std::array<unsigned char, 4> azArrowColor{ {255, 77, 77} };
		colors->SetColor("AzimuthArrowColor", azArrowColor.data());
		std::array<unsigned char, 4> elevArrowColor{ {77, 255, 77} };
		colors->SetColor("ElevationArrowColor", elevArrowColor.data());
		std::array<unsigned char, 4> rollArrowColor{ {255, 255, 77} };
		colors->SetColor("RollArrowColor", rollArrowColor.data());
		std::array<unsigned char, 4> spikeColor{ {255, 77, 255} };
		colors->SetColor("SpikeColor", spikeColor.data());
		// Set the background color.
		std::array<unsigned char, 4> bkg{ {26, 51, 102} };
		colors->SetColor("BkgColor", bkg.data());

		// Create the RenderWindow, Renderer and both Actors
		vtkNew<vtkRenderer> ren1;
		vtkNew<vtkRenderWindow> renWin;
		renWin->AddRenderer(ren1);
		vtkNew<vtkRenderWindowInteractor> iren;
		iren->SetRenderWindow(renWin);

		// create a camera model
		vtkNew<vtkConeSource> camCS;
		camCS->SetHeight(1.5);
		camCS->SetResolution(12);
		camCS->SetRadius(0.4);

		vtkNew<vtkCubeSource> camCBS;
		camCBS->SetXLength(1.5);
		camCBS->SetZLength(0.8);
		camCBS->SetCenter(0.4, 0, 0);

		vtkNew<vtkAppendFilter> camAPD;
		camAPD->AddInputConnection(camCS->GetOutputPort());
		camAPD->AddInputConnection(camCBS->GetOutputPort());

		vtkNew<vtkDataSetMapper> camMapper;
		camMapper->SetInputConnection(camAPD->GetOutputPort());

		vtkNew<vtkLODActor> camActor;
		camActor->SetMapper(camMapper);
		camActor->SetScale(2, 2, 2);

		// draw the arrows
		vtkNew<vtkPolyData> pd;
		vtkNew<vtkCellArray> ca;
		vtkNew<vtkPoints> fp;
		fp->InsertNextPoint(0, 1, 0);
		fp->InsertNextPoint(8, 1, 0);
		fp->InsertNextPoint(8, 2, 0);
		fp->InsertNextPoint(10, 0.01, 0);
		fp->InsertNextPoint(8, -2, 0);
		fp->InsertNextPoint(8, -1, 0);
		fp->InsertNextPoint(0, -1, 0);
		ca->InsertNextCell(7);
		ca->InsertCellPoint(0);
		ca->InsertCellPoint(1);
		ca->InsertCellPoint(2);
		ca->InsertCellPoint(3);
		ca->InsertCellPoint(4);
		ca->InsertCellPoint(5);
		ca->InsertCellPoint(6);
		pd->SetPoints(fp);
		pd->SetPolys(ca);

		vtkNew<vtkPolyData> pd2;
		vtkNew<vtkCellArray> ca2;
		vtkNew<vtkPoints> fp2;
		fp2->InsertNextPoint(0, 1, 0);
		fp2->InsertNextPoint(8, 1, 0);
		fp2->InsertNextPoint(8, 2, 0);
		fp2->InsertNextPoint(10, 0.01, 0);
		ca2->InsertNextCell(4);
		ca2->InsertCellPoint(0);
		ca2->InsertCellPoint(1);
		ca2->InsertCellPoint(2);
		ca2->InsertCellPoint(3);
		pd2->SetPoints(fp2);
		pd2->SetLines(ca2);

		vtkNew<vtkImplicitModeller> arrowIM;
		arrowIM->SetInputData(pd);
		arrowIM->SetSampleDimensions(50, 20, 8);

		vtkNew<vtkContourFilter> arrowCF;
		arrowCF->SetInputConnection(arrowIM->GetOutputPort());
		arrowCF->SetValue(0, 0.2);

		vtkNew<vtkWarpTo> arrowWT;
		arrowWT->SetInputConnection(arrowCF->GetOutputPort());
		arrowWT->SetPosition(5, 0, 5);
		arrowWT->SetScaleFactor(0.85);
		arrowWT->AbsoluteOn();

		vtkNew<vtkTransform> arrowT;
		arrowT->RotateY(60);
		arrowT->Translate(-1.33198, 0, -1.479);
		arrowT->Scale(1, 0.5, 1);

		vtkNew<vtkTransformFilter> arrowTF;
		arrowTF->SetInputConnection(arrowWT->GetOutputPort());
		arrowTF->SetTransform(arrowT);

		vtkNew<vtkDataSetMapper> arrowMapper;
		arrowMapper->SetInputConnection(arrowTF->GetOutputPort());
		arrowMapper->ScalarVisibilityOff();

		// draw the azimuth arrows
		vtkNew<vtkLODActor> a1Actor;
		a1Actor->SetMapper(arrowMapper);
		a1Actor->RotateZ(180);
		a1Actor->SetPosition(1, 0, -1);
		a1Actor->GetProperty()->SetColor(colors->GetColor3d("AzimuthArrowColor").GetData());
		a1Actor->GetProperty()->SetSpecularColor(colors->GetColor3d("White").GetData());
		a1Actor->GetProperty()->SetSpecular(0.3);
		a1Actor->GetProperty()->SetSpecularPower(20);
		a1Actor->GetProperty()->SetAmbient(0.2);
		a1Actor->GetProperty()->SetDiffuse(0.8);

		vtkNew<vtkLODActor> a2Actor;
		a2Actor->SetMapper(arrowMapper);
		a2Actor->RotateZ(180);
		a2Actor->RotateX(180);
		a2Actor->SetPosition(1, 0, 1);
		a2Actor->GetProperty()->SetColor(colors->GetColor3d("AzimuthArrowColor").GetData());
		a2Actor->GetProperty()->SetSpecularColor(colors->GetColor3d("White").GetData());
		a2Actor->GetProperty()->SetSpecular(0.3);
		a2Actor->GetProperty()->SetSpecularPower(20);
		a2Actor->GetProperty()->SetAmbient(0.2);
		a2Actor->GetProperty()->SetDiffuse(0.8);

		// draw the elevation arrows
		vtkNew<vtkLODActor> a3Actor;
		a3Actor->SetMapper(arrowMapper);
		a3Actor->RotateZ(180);
		a3Actor->RotateX(90);
		a3Actor->SetPosition(1, -1, 0);
		a3Actor->GetProperty()->SetColor(colors->GetColor3d("ElevationArrowColor").GetData());
		a3Actor->GetProperty()->SetSpecularColor(colors->GetColor3d("White").GetData());
		a3Actor->GetProperty()->SetSpecular(0.3);
		a3Actor->GetProperty()->SetSpecularPower(20);
		a3Actor->GetProperty()->SetAmbient(0.2);
		a3Actor->GetProperty()->SetDiffuse(0.8);

		vtkNew<vtkLODActor> a4Actor;
		a4Actor->SetMapper(arrowMapper);
		a4Actor->RotateZ(180);
		a4Actor->RotateX(-90);
		a4Actor->SetPosition(1, 1, 0);
		a4Actor->GetProperty()->SetColor(colors->GetColor3d("ElevationArrowColor").GetData());
		a4Actor->GetProperty()->SetSpecularColor(colors->GetColor3d("White").GetData());
		a4Actor->GetProperty()->SetSpecular(0.3);
		a4Actor->GetProperty()->SetSpecularPower(20);
		a4Actor->GetProperty()->SetAmbient(0.2);
		a4Actor->GetProperty()->SetDiffuse(0.8);

		// draw the DOP
		vtkNew<vtkTransform> arrowT2;
		arrowT2->Scale(1, 0.6, 1);
		arrowT2->RotateY(90);

		vtkNew<vtkTransformPolyDataFilter> arrowTF2;
		arrowTF2->SetInputData(pd2);
		arrowTF2->SetTransform(arrowT2);

		vtkNew<vtkRotationalExtrusionFilter> arrowREF;
		arrowREF->SetInputConnection(arrowTF2->GetOutputPort());
		arrowREF->CappingOff();
		arrowREF->SetResolution(30);

		vtkNew<vtkPolyDataMapper> spikeMapper;
		spikeMapper->SetInputConnection(arrowREF->GetOutputPort());

		vtkNew<vtkLODActor> a5Actor;
		a5Actor->SetMapper(spikeMapper);
		a5Actor->SetScale(.3, .3, .6);
		a5Actor->RotateY(90);
		a5Actor->SetPosition(-2, 0, 0);
		a5Actor->GetProperty()->SetColor(colors->GetColor3d("SpikeColor").GetData());
		a5Actor->GetProperty()->SetAmbient(0.2);
		a5Actor->GetProperty()->SetDiffuse(0.8);

		// focal point
		vtkNew<vtkSphereSource> fps;
		fps->SetRadius(0.5);
		vtkNew<vtkPolyDataMapper> fpMapper;
		fpMapper->SetInputConnection(fps->GetOutputPort());
		vtkNew<vtkLODActor> fpActor;
		fpActor->SetMapper(fpMapper);
		fpActor->SetPosition(-9, 0, 0);
		fpActor->GetProperty()->SetSpecularColor(colors->GetColor3d("White").GetData());
		fpActor->GetProperty()->SetSpecular(0.3);
		fpActor->GetProperty()->SetAmbient(0.2);
		fpActor->GetProperty()->SetDiffuse(0.8);
		fpActor->GetProperty()->SetSpecularPower(20);

		// create the roll arrows
		vtkNew<vtkWarpTo> arrowWT2;
		arrowWT2->SetInputConnection(arrowCF->GetOutputPort());
		arrowWT2->SetPosition(5, 0, 2.5);
		arrowWT2->SetScaleFactor(0.95);
		arrowWT2->AbsoluteOn();

		vtkNew<vtkTransform> arrowT3;
		arrowT3->Translate(-2.50358, 0, -1.70408);
		arrowT3->Scale(0.5, 0.3, 1);

		vtkNew<vtkTransformFilter> arrowTF3;
		arrowTF3->SetInputConnection(arrowWT2->GetOutputPort());
		arrowTF3->SetTransform(arrowT3);

		vtkNew<vtkDataSetMapper> arrowMapper2;
		arrowMapper2->SetInputConnection(arrowTF3->GetOutputPort());
		arrowMapper2->ScalarVisibilityOff();

		// draw the roll arrows
		vtkNew<vtkLODActor> a6Actor;
		a6Actor->SetMapper(arrowMapper2);
		a6Actor->RotateZ(90);
		a6Actor->SetPosition(-4, 0, 0);
		a6Actor->SetScale(1.5, 1.5, 1.5);
		a6Actor->GetProperty()->SetColor(colors->GetColor3d("RollArrowColor").GetData());
		a6Actor->GetProperty()->SetSpecularColor(colors->GetColor3d("White").GetData());
		a6Actor->GetProperty()->SetSpecular(0.3);
		a6Actor->GetProperty()->SetSpecularPower(20);
		a6Actor->GetProperty()->SetAmbient(0.2);
		a6Actor->GetProperty()->SetDiffuse(0.8);

		// Add the actors to the renderer, set the background and size
		ren1->AddActor(camActor);
		ren1->AddActor(a1Actor);
		ren1->AddActor(a2Actor);
		ren1->AddActor(a3Actor);
		ren1->AddActor(a4Actor);
		ren1->AddActor(a5Actor);
		ren1->AddActor(a6Actor);
		ren1->AddActor(fpActor);
		ren1->SetBackground(colors->GetColor3d("BkgColor").GetData());
		ren1->SetBackground(colors->GetColor3d("SlateGray").GetData());
		renWin->SetSize(640, 480);
		renWin->SetWindowName("CameraModel1");

		// render the image

		vtkCamera* cam1 = (ren1->GetActiveCamera());
		ren1->ResetCamera();


		cam1->Azimuth(150);
		cam1->Elevation(30);
		cam1->Dolly(1.5);
		ren1->ResetCameraClippingRange();

		// Create a TextActor for azimuth  (a1 and a2 actor's color)
		vtkNew<vtkTextActor> text;
		text->SetInput("Azimuth");
		vtkTextProperty* tprop = text->GetTextProperty();
		tprop->SetFontFamilyToArial();
		tprop->ShadowOff();
		tprop->SetLineSpacing(1.0);
		tprop->SetFontSize(36);
		tprop->SetColor(a1Actor->GetProperty()->GetColor());
		text->SetDisplayPosition(20, 50);
		ren1->AddActor2D(text);

		// Create a TextActor for elevation  (a3 and a4 actor's color)
		vtkNew<vtkTextActor> text2;
		text2->SetInput("Elevation");
		tprop = text2->GetTextProperty();
		tprop->SetFontFamilyToArial();
		tprop->ShadowOff();
		tprop->SetLineSpacing(1.0);
		tprop->SetFontSize(36);
		tprop->SetColor(a3Actor->GetProperty()->GetColor());
		text2->SetDisplayPosition(20, 100);
		ren1->AddActor2D(text2);

		// Create a TextActor for roll (a6 actor's color)
		vtkNew<vtkTextActor> text3;
		text3->SetInput("Roll");
		tprop = text3->GetTextProperty();
		tprop->SetFontFamilyToArial();
		tprop->ShadowOff();
		tprop->SetLineSpacing(1.0);
		tprop->SetFontSize(36);
		tprop->SetColor(a6Actor->GetProperty()->GetColor());
		text3->SetDisplayPosition(20, 150);
		ren1->AddActor2D(text3);

		vtkNew<Normal3DCameraStyle> style;

		cam1->SetFocalPoint(fpActor->GetPosition());
		cam1->SetPosition(camActor->GetPosition());

		style->m_Camera = cam1;
		style->m_RenderWindows = renWin;
		iren->SetInteractorStyle(style);


		renWin->Render();
		iren->Initialize();
		iren->Start();
	}
 

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

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

相关文章

ZigBee学习——在官方例程实现组网

✨Z-Stack版本&#xff1a;3.0.2 ✨IAR版本&#xff1a;10.10.1 ✨这篇博客是在善学坊BDB组网实验的基础上进行完善&#xff0c;并指出实现的过程中会出现的各种各样的问题&#xff01; 善学坊教程地址&#xff1a; ZigBee3.0 BDB组网实验 文章目录 一、基础工程选择二、可能遇…

耳机壳UV树脂制作耳机壳的工艺流程是什么?

使用耳机壳UV树脂制作耳机壳的工艺流程如下&#xff1a; 获取耳模&#xff1a;首先&#xff0c;需要获取用户的耳模。这通常是通过使用一种柔软的材料注入到用户的耳朵中&#xff0c;然后取出并用来制作耳机的内芯。选择UV树脂&#xff1a;接下来&#xff0c;需要选择合适的UV…

小游戏和GUI编程(6) | 基于 SFML 的井字棋

小游戏和GUI编程(6) | 基于 SFML 的井字棋 0. 简介 使用 SFML 实现井字棋(tic-tac-toe), 规划如下: 了解规则&#xff0c; 使用命令行实现(已经实现了)使用 SFML&#xff0c;提供极简的交互(预计 1 小时)制作 SVG 图像&#xff0c; 美化界面(预计 1 小时) 1. 基于命令行的实…

160基于matlab的负熵和峭度信号的盲分离

基于matlab的负熵和峭度信号的盲分离。基于峭度的FastICA算法的收敛速度要快&#xff0c;迭代次数比基于负熵的FastICA算法少四倍以上。SMSE随信噪比增大两种判据下的FastICA算法都逐渐变小&#xff0c;但是基于峭度的算法的SMSE更小&#xff0c;因此基于峭度的FastICA算法性能…

Spark MLlib

目录 一、Spark MLlib简介 &#xff08;一&#xff09;什么是机器学习 &#xff08;二&#xff09;基于大数据的机器学习 &#xff08;三&#xff09;Spark机器学习库MLlib 二、机器学习流水线 &#xff08;一&#xff09;机器学习流水线概念 &#xff08;二&#xff09…

车载电子电器架构 —— 电子电气系统控制器开发体系

车载电子电器架构 —— 电子电气系统控制器开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费…

idea:如何连接数据库

1、在idea中打开database: 2、点击 ‘’ ---> Data Source ---> MySQL 3、输入自己的账号和密码其他空白处可以不填&#xff0c;用户和密码可以在自己的mysql数据库中查看 4、最后选择自己需要用的数据库&#xff0c;点击运用ok&#xff0c;等待刷新即可 最后&#xff1a…

《CSS 简易速速上手小册》第9章:CSS 最佳实践(2024 最新版)

文章目录 9.1 维护大型项目的 CSS9.1.1 基础知识9.1.2 重点案例&#xff1a;构建一个可复用的 UI 组件库9.1.3 拓展案例 1&#xff1a;优化现有项目的 CSS 结构9.1.4 拓展案例 2&#xff1a;实现主题切换功能 9.2 BEM、OOCSS 和 SMACSS 方法论9.2.1 基础知识9.2.2 重点案例&…

【从Python基础到深度学习】3. Winscp与Ubuntu使用及配置

一、Ubuntu的使用 1.1 开启与关闭 1.2 修改Ubuntu分辨率 选择适合自己电脑大小的分辨率 1.3 Ubuntu终端 1.4 网络测试 终端中输入&#xff1a; ping www.baidu.com ctr C 退出ping命令 1.5 下载软件 连通安装源 sudo apt update 安装 ssh vim sudo apt install ss…

零基础学python之高级编程(2)---面向对象编程组合用法及其继承特性

面向对象编程组合用法及其继承特性 文章目录 面向对象编程组合用法及其继承特性前言一、面向对象编程组合用法1 直接在类中创建实例化对象2 给入参数&#xff0c;在结尾给一个类实例化传参变成对象&#xff0c;然后再在另一个类中传入对象参数 二、面向对象编程----继承1.继承定…

浅谈人工智能之深度学习~

目录 前言&#xff1a;深度学习的进展 一&#xff1a;深度学习的基本原理和算法 二&#xff1a;深度学习的应用实例 三&#xff1a;深度学习的挑战和未来发展方向 四&#xff1a;深度学习与机器学习的关系 五&#xff1a;深度学习与人类的智能交互 悟已往之不谏&#xff0…

2023年智能可穿戴行业市场分析(电商数据查询分析):智能手表销额增长21%,手环明显下滑

近年来&#xff0c;随着技术的进步&#xff0c;智能可穿戴设备在社交网络、医疗保健、导航等诸多领域有着非常广泛的应用&#xff0c;这为大众生活带来了诸多便利。 当前的可穿戴产品形态纷繁多样&#xff0c;主要包括智能手表、智能眼镜、智能手环、健康穿戴和体感控制等等&am…

Unity学习笔记(零基础到就业)|Chapter02:C#基础

Unity学习笔记&#xff08;零基础到就业&#xff09;&#xff5c;Chapter02:C#基础 前言一、复杂数据&#xff08;变量&#xff09;类型part01&#xff1a;枚举数组1.特点2.枚举&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;申明枚举变量&#xff08;3&#xff…

生态位模拟——草稿笔记

文章目录 前言ENM初识一、所需软件安装1.1. 下载ArcGIS软件&#xff1a;1.2. 下载 MaxEnt软件&#xff1a;1.3. 下载ENMtools&#xff1a; 二、数据准备与处理2.1. 物种分布数据2.2. 环境因子数据2.3. 地图数据2.4. 物种分布点去冗余2.4.1. 使用spThin包中的thin函数2.4.2. 或者…

使用耳机壳UV树脂制作私模定制耳塞有什么优点和缺点呢?

使用耳机壳UV树脂制作私模定制耳塞具有以下优点&#xff1a; 个性化定制&#xff1a;UV树脂可以根据用户的耳型进行个性化定制&#xff0c;使耳塞与用户的耳朵形状完美契合&#xff0c;提高舒适度和佩戴稳定性。高强度和耐磨性&#xff1a;UV树脂具有高强度和耐磨性&#xff0…

Spring Native 解放 JVM

一、Spring Native 是什么 Spring Native可以通过GraalVM将Spring应用程序编译成原生镜像&#xff0c;提供了一种新的方式来部署Spring应用。与Java虚拟机相比&#xff0c;原生镜像可以在许多场景下降低工作负载&#xff0c;包括微服务&#xff0c;函数式服务&#xff0c;非常…

C语言printf函数详解..

1.printf函数解析 前面我们有讲过printf函数的格式为&#xff1a; printf(“占位1 占位2 占位3……”, 替代1, 替代2, 替代3……); 今天我们进一步深入的解析一下这个函数 2.printf函数的特点 1.printf函数是一个变参函数(即参数的数量和类型都不确定) 2.printf函数的第一个…

Linux笔记之xhost +和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解

Linux笔记之xhost 和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解 ——2024-02-11 code review! 文章目录 Linux笔记之xhost 和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解xhost 的作用xhost 与 Docker 的关系 -e GDK_SCALE 和 -e GDK_DPI_SCALE详解GDK_SCALEGDK_DPI_SC…

Java集合 LinkedList

目录 LinkedList实例 LinkedList LinkedList是Java中的一个重要的数据结构&#xff0c;它实现了List接口&#xff0c;提供了链表数据结构的实现。LinkedList类中包含了各种常用的链表操作&#xff0c;如添加、删除、查找等。 LinkedList的特点是元素可以动态地添加到链表的任…

【转载】原生社区交友婚恋视频即时通讯双端APP源码 ONE兔2.0版

原生社区交友婚恋视频即时通讯双端APP源码下载ONE兔2.0版 包含后端、H5源码源码&#xff0c;Android源码&#xff0c;IOS源码