【OpenGL高级】罗德里格斯公式:绕任意轴旋转

相关主题: OpenGL 矩阵、四元数到矩阵、角度到轴、观察到轴

目录

  • 一、说明
  • 二、罗德里格斯公式的推导
    • 2.1 空间点旋转问题
    • 2.2 对旋转问题的分析
  • 三、罗德里格斯旋转公式矩阵表示:
  • 四、最小C++代码
  • 五、结论

一、说明

解决三维坐标下的刚体旋转问题,欧拉角存在缺陷,当旋转点落在坐标轴上,旋转公式失灵。围绕任意轴旋转的点3d变换,正规公式是罗德里格斯矩阵。本篇专门介绍它的推导过程,而且提供C++的示例代码。

二、罗德里格斯公式的推导

2.1 空间点旋转问题

三维笛卡尔坐标下,我们设定任意向量OR为轴,空间任意点P,让P围绕OR做圆周运动,那么P在任意时刻的坐标是什么?我们用罗德里格斯公式可以方便实现,问题是罗德里格斯公式如何导出?这是我们本文的主题。

OpenGL中绕任意轴旋转的4x4变换矩阵定义为:
在这里插入图片描述

2.2 对旋转问题的分析

在这里插入图片描述
在这里插入图片描述

用于绕任意轴旋转的 4x4 矩阵

本页说明如何使用罗德里格斯公式导出此旋转矩阵。假设 3D空间点P围绕单位向量 r → = ( x , y , z ) \overrightarrow{r} =(x,y,z) r =(x,y,z)旋转 θ \theta θ角到达Q点。

P 的向量形式分解为 O R → \overrightarrow{OR} OR R P → \overrightarrow{RP} RP 和 的向量和,Q 分别为向量 O R → \overrightarrow{OR} OR 和$\overrightarrow{RQ} 的和。
设向量 p → = O R → + R P → \overrightarrow{p}=\overrightarrow{OR}+ \overrightarrow{RP} p =OR +RP ,向量 q → = O R → + R Q → \overrightarrow{q}=\overrightarrow{OR}+ \overrightarrow{RQ} q =OR +RQ

因此,我们需要先求向量 O R → \overrightarrow{OR} OR 和向量 R Q → \overrightarrow{RQ} RQ 才能得到 Q。矢量向量 O R → \overrightarrow{OR} OR 可以从 r → \overrightarrow{r} r p → \overrightarrow{p} p 向量中求出.并且向量RQ来自 Q 点所在的圆平面。向量 O R → \overrightarrow{OR} OR 与单位向量 r → \overrightarrow{r} r 平行,其长度可以通过投影使用内积来向量OR计算。所以,可以写成; O R → = ( p → ⋅ r → ) r → \overrightarrow{OR}= (\overrightarrow{p} \cdot \overrightarrow{r})\overrightarrow{r} OR =p r )r

向量 R Q → \overrightarrow{RQ} RQ 可以由旋转平面上的2个基本向量确定。我们使用矢量 R P → \overrightarrow{RP} RP 作为第一个基向量,另一个基向量矢量 R S → \overrightarrow{RS} RS 垂直于圆平面内矢量 R P → \overrightarrow{RP} RP 且长度相等,因为它们都是圆平面的半径。因此,矢量 R S → \overrightarrow{RS} RS 可以通过 2 个垂直向量的叉积来计算;矢量 r → \overrightarrow{r} r 和矢量 R P → \overrightarrow{RP} RP ;
在这里插入图片描述

现在,向量RQ用这些基向量和三角函数的组合来表示;
在这里插入图片描述

最后,旋转后向量向量 q → \overrightarrow{q} q 由向量 O R → \overrightarrow{OR} OR 和写成向量 R Q → \overrightarrow{RQ} RQ
在这里插入图片描述
这个方程称为罗德里格斯旋转公式;

罗德里格斯旋转公式
在这里插入图片描述

三、罗德里格斯旋转公式矩阵表示:

It can be represented by an equivalent matrix form. First, convert vector OR and vector RS components to 3x3 matrix forms for P = (px, py, pz) and r = (x, y, z);

罗德里格斯旋转公式可以用矩阵表示,首先,将 O R → \overrightarrow{OR} OR
R S → \overrightarrow{RS} RS 构成3x3矩阵形式, P → = ( p x , p y , p z ) \overrightarrow{P}=(p_x,p_y,p_z) P =(px,py,pz) P = (px, py, pz) 和 r = ( x , y , z ) r = (x, y, z) r=(x,y,z);
可以用等价矩阵形式表示。首先,将向量或和矢量RS分量转换为 3x3 矩阵形式,其中 P = (p x , p y , p z ) 和 r = (x, y, z);
在这里插入图片描述

在这里插入图片描述
也将罗德里格斯旋转公式写成矩阵方程:
在这里插入图片描述
旋转矩阵:
在这里插入图片描述
或者4x4矩阵:
在这里插入图片描述

四、最小C++代码

// minimal implementation of Vector3
struct Vector3
{float x, y, z;// ctorVector3() : x(0), y(0), z(0) {}// inner and cross productsfloat   dot(Vector3& v)   { return x*v.x + y*v.y + z*v.z; }Vector3 cross(Vector3& v) { return Vector3(y*v.z-z*v.y, z*v.x-x*v.z, x*v.y-y*v.x); }// scalar productfriend Vector3 operator*(float s, Vector3 v) { return Vector3(s*v.x, s*v.y, s*v.z); }Vector3& normalize() {float invLength = 1.0f / sqrtf(x*x + y*y + z*z);x *= invLength;y *= invLength;z *= invLength;return *this;}
}
...// define the rotation vector r and angle
Vector3 r = Vector3(1, 1, 1).normalize();   // make unit length
float a = 30 / 180 * PI;                    // rotation angle as radian// define a vector p to rotate
Vector3 p = Vector3(1, 2, 3);// compute the rotated vector q using Rodrigues' formula
Vector3 q = (1 - cos(a)) * p.dot(r) * r + cos(a) * p + sin(a) * r.cross(p);

五、结论

我们在这里介绍一个绕任意向量旋转的公式;还有一个有效方法是四元组旋转向量,它是任意球面上的两点,通过大圆旋转的问题。将在另一个文中介绍,请大家关注。

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

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

相关文章

Centos7.9下 建立systemd服务自启 包含脚本sh运行springboot

一.建立脚本 1.建立test.sh文件 /home/server/rescue/test.sh #!/bin/bash export JAVA_HOME/usr/lib/jvm/java export JRE_HOME/usr/lib/jvm/jre export CLASS_PATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export PATH$PATH:$JAVA_HOME/bin:$JRE_…

【Linux】服务器时区 [ CST | UTC | GMT | RTC ]

目录 1. 硬件时间(Real_TIME Clock [RTC time]) 1.1 硬件时间简介 1.2 如何使用硬件时间 2. 系统时间(UTC时间)(Universal time) 2.1 系统时间简介 2.2 UTC时间 3. 本地时间(Local time&…

深入理解大语言模型微调技术

一、概念解析 1、什么是微调(Fine-tuning)? 大模型微调,也称为Fine-tuning,是指在已经预训练好的大型语言模型基础上(一般称为“基座模型”),使用特定的数据集进行进一步的训练&am…

DeepWalk论文精读

介绍 图神经网络的开山之作 DeepWalk:一种用于学习网络中顶点的潜在表示的新方法,使用随机行走中获得的局部信息,通过将序列视为句子,节点视为单词 通过随机游走可以采样出一个序列,序列好比一句话,节点…

记录一个hive中因没启yarn导致的spark引擎跑insert语句的报错

【背景说明】 刚在hive中配置了Spark引擎,在进行Hive on Spark测试时报错, 报错截图如下: [atguiguhadoop102 conf]$ hive which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/mod…

【项目案例】基于强化学习Q-Learning训练“汉诺塔Tower of Hanoi”游戏策略

文章目录 1. 引言2. 基本要素定义3. 训练过程3.1 初始化动作价值函数3.2 采集完整状态序列3.3 更新动作估计价值4. 策略检验1. 引言 汉诺塔游戏(Tower of Hanoi)是根据一个传说形成的数学问题,小规模汉诺塔问题也常常作为强化学习的入门案例。它的规则是,在游戏台上,有若…

【LAMMPS学习】八、基础知识(3.5)计算弹性常数

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

【云计算】云数据中心网络(三):NAT 网关

《云网络》系列,共包含以下文章: 云网络是未来的网络基础设施云网络产品体系概述云数据中心网络(一):VPC云数据中心网络(二):弹性公网 IP云数据中心网络(三)…

【C语言】每日一题,快速提升(8)!

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 题目:金字塔图案 输入: 4输出: * * * * * * * * * * 代码: //对于有行有列的图形采用双循环,i控制行…

C# 面向对象编程(二)——继承

总目录 C# 语法总目录 C# 面向对象编程 二——继承 简介正文继承** 向上向下转型 **as 运算符is 运算符 1. 虚函数和抽象函数 及抽象类2. 隐藏父类成员3.密封函数** base关键字 **4. 构造器继承** 重载与重写 ** 简介 主要记录的是继承的相关注意事项 正文 继承 继承只能继承…

线性投影的意义

线性投影是机器学习和数学中的一个概念,它指的是通过线性变换将数据从一个空间映射到另一个空间的过程。在机器学习中,线性投影通常用于数据降维、特征提取或数据可视化。 数据降维:在处理高维数据时,线性投影可以用来减少数据的维…

[管理者与领导者-177] :人际网络-4-坐车的礼仪

目录 一、坐私车的基本礼仪 二、跟领导乘车,你坐对了吗?要注意什么? 2.1 乘车座次礼仪规则: 2.2 双排5座汽车礼仪的应用 2.2.1 司机驾车 2.2.2 领导驾车 2.3 三排7座商务车 一、坐私车的基本礼仪 坐私人车辆时&#xff0c…

sklearn 笔记: preprocessing.OrdinalEncoder

sklearn.preprocessing.OrdinalEncoder 是一个用于将分类特征编码为整数数组的预处理转换器编码方式:将分类特征(如字符串或整数表示的离散特征)转换成序数整数形式。这样每个特征都被编码为一个整数序列,范围从 0 到该特征的类别…

Windows如何安装JDK

JDK和JRE简介 JDK:Java Development ToolKit java开发工具包,包含JRE针对java程序开发者 JRE:Java Runtime Environment java程序的运行环境针对java使用者来说 下载JDK,进入官网下载 Oracle官网 双击下载好之后的exe文件&#…

我为什么想成为一名程序员

#为什么你选择成为一名程序员# 目录 原因: 后续选择: 结尾: 原因: 本人是一个00后,出生在农村当时经济相对来说比较落后,村里面基本上都没几个人有手机。当时有些小伙伴他们拿着自己大人的手机在那里玩…

科普馆VR技术展现安全场景,构建安全教育新标杆!

随着VR技术的快速发展,其所衍生出的互动装置,悄无声息地渗透进了我们生活的每个角落,就连那严谨而重要的安全教育领域,也没能逃出这神奇魔法的“魔爪”,这种VR互动设备简直就是安全知识传递的小能手,那么&a…

MinIO自定义权限控制浅研

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 MinIO搭建好之后,出于不同场景的需要,有时候需要对不同的用户和Bucket做一些针对性的权限控制。 MinIO的…

530.二叉搜索树的最小绝对差

给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 方法一&#xff1a;中序遍历 public int getMinimumDifference(TreeNode root){Deque<TreeNode> stack new Link…

Selenium(三):WebElement核心属性和方法

WebElement常用属性 1.id 标示 2.size 宽高 3.rect 宽高和坐标 4.tag_name 标签名称 5.text 文本内容 WebElement常用方法 1.send_keys() 输入内容 2.clear() 清空内容 3.click() 点击 4.get_attribute() 标签名称 5.is_selected() 是否被选中 5.is_enabled() 是否…

PCDN与边缘计算的集成解决方案

PCDN与边缘计算的集成解决方案 在数字化时代&#xff0c;内容的快速、安全地传递至用户变得至关重要。无论是媒体、教育还是其他领域&#xff0c;所有这些行业都需要强大的技术支持以保证信息的实时更新和安全传输。PCDN&#xff08;Peer Content Delivery Network&#xff0c…