【三维向量旋转】基于Matlab的三维坐标旋转

news2024/9/21 14:32:06

一、问题描述

若空间中存在三个点A,B,C,其中A点是不动点,B点是当前方向向量上的一个点,C是目标方向上的一个点。如果要让AB向量沿着BC方向进行旋转,使得AB最终旋转到AC。这个过程就是三维向量的旋转过程。我们关注的是这个过程,即确定好A,B,C三点后,指定任意的旋转角度,可以得到B点旋转到C点过程中的对应轨迹点

在这里插入图片描述

二、求解思路

第一步:求解ABC 平面的法向量

要求三维屏幕的法向量,你可以使用这三个点来计算。假设这三个点分别为 A,B,C

法向量可以通过计算两个向量的叉积来获得。在这种情况下,可以选择两个向量为AB,AC,然后计算这两个向量的叉积来得到法向量。

具体步骤如下:

在这里插入图片描述
下面是一个示例 MATLAB 代码,演示如何计算三维空间中由三个点定义的平面的法向量:

% 定义三个屏幕上的点
A = [1, 2, 3]; % 举例点 A
B = [4, 5, 6]; % 举例点 B
C = [7, 8, 9]; % 举例点 C

% 计算向量 AB 和 AC
AB = B - A;
AC = C - A;

% 计算法向量
n = cross(AB, AC);

disp('屏幕的法向量 n:');
disp(n);

这段代码将计算由三个点定义的平面的法向量。你可以替换示例点的实际值,并运行代码来获得平面的法向量。
在这里插入图片描述

第二步求解旋转后的向量

当涉及三维空间向量沿特定方向旋转时,可以使用旋转矩阵来实现这一点。假设我们有一个三维向量 v= [x, y, z],我们希望将其绕一个单位向量u= [u_x, u_y, u_z]所表示的方向进行旋转。以下是一个基本的步骤:

  1. 计算旋转矩阵:首先需要计算一个旋转矩阵,该矩阵描述了如何将向量旋转到新的方向。这个旋转矩阵通常是一个3x3的矩阵。

  2. 进行旋转:将向量 v 与旋转矩阵相乘,即可得到旋转后的向量。
    在这里插入图片描述

三、代码实现

clc
close all
clear all
dbstop if error


% 定义三个屏幕上的点
A = [0, 0, 0]; % 举例点 A 
B = [0, 1, 0]; % 举例点 B 
C = [0, 0, 1]; % 举例点 C 

% 计算向量 AB 和 AC
AB = B - A;
AC = C - A;

% 计算法向量
n = cross(AB, AC);

disp('屏幕的法向量 n:');
disp(n);


figure
view(3)
plot3([A(1)],[A(2)],[A(3)],'ro','DisplayName','A点')
hold on
% 
plot3([B(1)],[B(2)],[B(3)],'go','DisplayName','B点')

hold on
plot3([C(1)],[C(2)],[C(3)],'bo','DisplayName','C点')

plot3([0 n(1)],[0 n(2)],[0 n(3)],'r','DisplayName','ABC平面的法向量')

grid on

xlabel('x')
ylabel('y')
zlabel('z')
legend
xlim([-2 2])
ylim([-2 2])
zlim([-2 2])

v=B-A;

u = n;          % 旋转轴(单位向量)
theta = pi *0.25;         % 旋转角度(45度)

% 计算旋转后的向量
v_rot = round(rotate_vector(v, u, theta));

% 显示结果
disp('旋转后的向量:');
disp(v_rot);

figure
view(3)
plot3([0 v(1)],[0 v(2)],[0 v(3)],'r','DisplayName','旋转前')
hold on
plot3([0 u(1)],[0 u(2)],[0 u(3)],'b','LineWidth',2,'DisplayName','法向量')
hold on
plot3([0 v_rot(1)],[0 v_rot(2)],[0 v_rot(3)],'g','DisplayName','旋转后')
grid on
axis equal

xlabel('x')
ylabel('y')
zlabel('z')
legend

hold on

C=v_rot(:)+A(:);
B=v(:)+A(:);
xlim([-2 2])
ylim([-2 2])
zlim([-2 2])
% figure
view(3)
plot3([A(1)],[A(2)],[A(3)],'ro','DisplayName','A')
hold on
plot3([B(1)],[B(2)],[B(3)],'go','DisplayName','B')
hold on
plot3([C(1)],[C(2)],[C(3)],'bo','DisplayName','B’')
grid on
legend

四、结果分享

擅长matlab,python 各类算法的实现 长期提供①源码分享②辅导答疑③项目定制 欢迎咨询

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

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

相关文章

JAVA 课设 满汉楼餐厅点餐系统

一、代码详解 1.总体结构展示 2.总体代码 2.1 libs文件 链接:https://pan.baidu.com/s/1nH-I7gIlsqyMpXDDCFRuOA 提取码:3404 2.2 配置的德鲁连接池 #keyvalue driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/mhl?rewriteBa…

爱了!8款超好用的PC端办公软件!

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 你电脑中用的最久的软件是哪些?以下是否有你曾经使用过的软件呢?工欲善其事,必先利其器,今天继续…

打造属于自己的脚手架工具并发布到npm仓库

一、创建项目 使用 npm init -y 创建项目创建项目入口文件 index.js在 package.json 中添加 bin 字段使用 npm link 命令将文件映射至全局,使可以在本地测试 zp 命令 // "zp" 为用于全局执行脚手架的命令,vue-cli中使用的是vue命令 "bi…

STM32-I2C

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. I2C通信1.1 I2C通信简介1.2 硬件电路1.3 I2C时序基本单元1.3.1 起始条件和终止条件1.3.2 发送一个字节1.3.3 接收一个字节1.3.4 发送应答和接收应答 1.4 I2C时序1.4.1 指定地址写1.4.2 当前地址读1.4.3 指定地址读…

利用docker搭建漏洞环境,使用SSRF+Redis写入centos以及ubuntu的公钥,实现免密登录

一、实验环境 kali:在kali中搭建docker容器环境,这里我主要是使用第一个; redis作为一种数据库,它可以将数据写入内存中去,我们通过利用ssrf请求,实现服务器对自己的公钥写入,从而实验免密登录;…

el-table 树形数据与懒加载 二级数据不展示

返回的数据中 children和hasChildren只能有一个,不能同时存在,否则加载数据会失败

优化后Day53 动态规划part11

LC1143最长公共子序列 1.dp数组的含义:dp[i][j]表示以下标i结尾的text1子序列和以下标j结尾的text2子序列的最长公共子序列 2. 初始化:跟LC718一样,i结尾的需要初始化,i-1结尾不需要初始化 3. 递推公式 如果charAt(i)charAt(j)&…

集成测试技术栈

前端 浏览器操作:playwright、selenium 后端 testcontainercucumbervitestcypressmsw

Threejs将场景生成全景图导出

实现思路: 创建全景相机CubeCamera(六个方位的透视相机)并渲染场景 读取六个面的纹理数据 填充进canvas中 即可按照常规的canvas导出图片了 demo https://gitee.com/honbingitee/three-template-next.js/tree/HDR 核心代码 const cubeRender…

《python程序语言设计》2018版第5章第53题利用turtle绘制sin和cos函数 sin蓝色,cos红色和52题类似

直接上题和代码 5.53 (Turtle:绘制sin和cos函数)编写程序绘制蓝色的sin函数和红色的cos函数。 代码和结果 turtle.speed(10) turtle.penup() # sin 用蓝色 turtle.color("blue") #这道题和上道题一样,先把turtle放到起始…

数列结构(3.9)——队列应用

树的层次遍历 树的层次遍历,也称为树的广度优先遍历,是一种按照树的层次顺序,从上到下、从左到右遍历树中所有节点的算法。在二叉树中,这种遍历方式通常使用队列来实现。下面是层次遍历的基本步骤: 创建一个空队列&a…

排序(2)

我们在排序&#xff08;1&#xff09;中说到选择排序的代码&#xff1a; void SelectSort(int* a,int n) {int begin0,endn-1;int minibegin,maxbegin;for(int ibegin1;i<end;i){if(a[i]>a[max]){maxii;}if(a[i]<a[mini]){minii;}begin;--end;}Swap(&a[beign],&a…

UE5 05-利用 timeline 插值运动

理解成 unity Dotween DoMove 插值运动即可 AddTimeLine 节点 物体插值运动 物体插值缩放 一个timeline 可以K多个动画帧

C语言 printf 函数多种输出格式以及占位输出

一、输出格式 在C语言中&#xff0c;printf 函数提供了多种输出格式&#xff0c;用于控制不同类型数据的输出方式。 1.整数输出格式 %d&#xff1a;以十进制形式输出整数。 %o&#xff1a;以八进制形式输出整数&#xff08;无前导0&#xff09;。 %x 或 %X&#xff1a;以十六进…

包/final/权限修饰符/代码块

包package 1、包的作用 包用来管理不同的类。 2、包名 包名要全部小写&#xff0c;一般是域名反写&#xff0c;如com.liu。在Java中&#xff0c;java解释器会将package中的.解释为目录分隔符/&#xff0c;也就是说该文件的目录结构为&#xff1a;...com/liu/... 3、全类名…

Nginx 报错问题汇总

目录 一、nginx: [emerg] invalid number of arguments in "include" directive in C:\Program Files\nginx-1.15.4/conf/nginx.conf:61 总结&#xff1a; 二、nginx: [error] OpenEvent("Global\ngx_reload_2152") failed (5: Access is denied) 解决…

《昇思25天学习打卡营第14天|onereal》

第14天学习内容如下&#xff1a; Diffusion扩散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻译迁移而来&#xff0c;同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件&#xff0c…

LabVIEW的JKI State Machine

JKI State Machine是一种广泛使用的LabVIEW架构&#xff0c;由JKI公司开发。这种状态机架构在LabVIEW中提供了灵活、可扩展和高效的编程模式&#xff0c;适用于各种复杂的应用场景。JKI State Machine通过状态的定义和切换&#xff0c;实现了程序逻辑的清晰组织和管理&#xff…

IDEA常用技巧荟萃:精通开发利器的艺术

1 概述 在现代软件开发的快节奏环境中,掌握一款高效且功能全面的集成开发环境(IDE)是提升个人和团队生产力的关键。IntelliJ IDEA,作为Java开发者的首选工具之一,不仅提供了丰富的编码辅助功能,还拥有高度可定制的界面和强大的插件生态系统。然而,要充分发挥其潜力,深…

[激光原理与应用-101]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 5 - 3C行业应用 - 电子布局类型

目录 前言&#xff1a; 一、激光在3C行业的应用概述 1.1 概述 1.2 激光焊接在3C-电子行业应用 二、3C电子行业中激光焊接 2.1 纽扣电池 2.2 均温板 2.3 指纹识别器 2.4 摄像头模组 2.5 IC芯片切割 三、3C行业中激光切割 四、激光在3C行业中的其他应用 4.1 涂层去除…