点线面产生局部坐标系以及计算到世界坐标系的旋转矩阵

news2024/11/28 10:51:39

欢迎关注更多精彩

问题描述

给定点O,线段AB,平面OP,求以OP法向为某一轴,以AB在OP上的投影为另一轴,O为原点的局部坐标系。要求给出X,Y,Z轴的单位向量,以及原点O. 求出转换到世界坐标系的旋转矩阵RT。

如图,
问题描述
A’B’为AB在OP上的投影,坐标系中X轴平行于OP面的法向,Z轴平行于A’B’。

问题分析

关键技术难点

  1. 投影的计算
  2. 第三轴计算
  3. 旋转矩阵计算

投影的计算

对线段的投影可以转化成两个端点的投影。
点的投影可以认识是由点出发沿平面法向的直线与平面的交点。
具体可以参考 点击前往

第三轴计算

条件中只给出两轴,必须计算第三轴。
由于三轴两两垂直,

根据公式

Z = X × Y , X = Y × Z , Y = Z × X Z=X \times Y,X=Y\times Z,Y=Z\times X Z=X×YX=Y×ZY=Z×X

可以发现,只要给定其中两轴必定可以计算出第三轴。

旋转矩阵计算

要求返回一个形如 点击前往的旋转矩阵。

基本思路是行把原点移动到(0,0,0)点RT1,然后先把X轴旋转到重合RT2,再把Y轴旋转到重合RT3。最终结果就是RT3*RT2*RT1。

接口设计&基本步骤

坐标系计算

接口设计

接口函数:

RigidRTMatrix GenerateCoordinate(const Point & p, const Point &line_start, 
const Point &line_end, const Point & plane_normal, const Point & plane_point, 
CoordinateOrient line_orient, CoordinateOrient normal_orient);

参数:
出参 RigidRTMatrix 矩阵的三行代表X,Y,Z坐标,Translation代表坐标系原点位置。

参数名类型作用备注
p行向量坐标系原点
line_start行向量线段起点
line_end行向量线段终点
plane_normal行向量平面法向单位向量
plane_point行向量平面上任意一点
line_orientCoordinateOrient枚举形线段投影指向代表的坐标系名称X,Y,Z 可选
normal_orientCoordinateOrient枚举形线段投影指向代表的坐标系名称X,Y,Z 可选

基本步骤

1.计算线段投影的单位向量。
2.根据输入要求确定坐标系的两个轴。
3.根据已经确定的两轴计算剩下的一轴。
4.确定原点。

旋转矩阵计算

接口设计

接口函数:

RigidRTMatrix Coordinate2RT(const RigidRTMatrix & coordinate);

参数:
出参 RigidRTMatrix,代表局部坐标系到世界坐标系的变换矩阵。

参数名类型作用备注
coordinateRigidRTMatrix局部坐标系信息

基本步骤

  1. 将坐标系原点移动致0点,矩阵为RTO
    在这里插入图片描述
    设置新坐标系是uvw,原来是xyz。
    先计算矩阵A使得原坐标系转化到新坐标系。
    可以列出方程出
    { A ⋅ x = u A ⋅ y = v A ⋅ z = w \left\{\begin{array}{l} A\cdot x=u\\A \cdot y = v\\A\cdot z = w\end{array}\right. Ax=uAy=vAz=w
    u,v,w本身是正交的,且是单位向量。
    原来坐标系可以组成一个单位矩阵
    可以得到
    A ⋅ [ 1 0 0 0 1 0 0 0 1 ] = [ u v w ] A\cdot \begin {bmatrix} 1&0&0\\0&1&0\\0&0&1 \end {bmatrix} = \begin {bmatrix} u&v&w \end{bmatrix} A 100010001 =[uvw]

∴ A = [ u   v   w ] \therefore A=[u \ v \ w] A=[u v w]
最终结果为
R T O − 1 ∗ A T ∗ R T O RTO^-1*A^T*RTO RTO1ATRTO

代码实现

  • 代码库点击前往
  • 代码库点击前往
  • 代码库点击前往

坐标系计算


RigidRTMatrix GenerateCoordinate(const Point& p, const Point& line_start,
	const Point& line_end, const Point& plane_normal, const Point& plane_point,
	CoordinateOrient line_orient, CoordinateOrient normal_orient) {
	cout << "GenerateCoordinate" << endl;
	assert(abs(plane_normal.squaredNorm() - 1) < 1e-6);
	RigidRTMatrix coord;
	// 1.计算线段投影的单位向量。
	Point project_line_start = line_start;
	BasicTools::PointProjectPlane(project_line_start, plane_point, plane_normal);

	Point project_line_end = line_end;
	BasicTools::PointProjectPlane(project_line_end, plane_point, plane_normal);
	Point project_vec = (project_line_end - project_line_start).normalized();
	assert(project_vec.squaredNorm() > 1e-4);
	cout <<( project_vec.squaredNorm() > 1e-4) << endl;

	coord.mat.block<1, 3>(line_orient, 0) = project_vec;
	// 2.根据输入要求确定坐标系的两个轴。
	coord.mat.block<1, 3>(normal_orient, 0) = plane_normal;
	// 3.根据已经确定的两轴计算剩下的一轴。
	int left = CoordinateOrient::X + CoordinateOrient::Y + CoordinateOrient::Z;
	left -= line_orient + normal_orient;
	coord.mat.block<1, 3>(left, 0) = coord.mat.block<1, 3>((left + 1) % 3, 0).cross(coord.mat.block<1, 3>((left + 2) % 3, 0));

	// 4.确定原点。
	coord.trans = p;

	return coord;
}

旋转矩阵计算

RigidRTMatrix Coordinate2RT(const RigidRTMatrix& coord) {
	RigidRTMatrix res;
	RigidRTMatrix RTO;
	RTO.trans = -coord.trans;
	RigidRTMatrix RTOInvers;
	RTOInvers.trans = coord.trans;
	RigidRTMatrix A;
	A.mat = coord.mat.transpose();
	res = A * RTO;
	res = RTOInvers * res;
	return res;
}

本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。

在这里插入图片描述

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

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

相关文章

ChatGPT的简单了解

ChatGPT 是 InstructGPT 的同级模型&#xff0c;它经过训练可以按照提示中的说明进行操作并提供详细的响应。 InstructGPT论文&#xff1a;https://arxiv.org/pdf/2203.02155.pdf InstructGPT怎么准备和标记数据集&#xff1a;https://harryliu.blog.csdn.net/article/detail…

【连续介质力学】张量的性质2

张量的代数操作 张量的性质 张量迹 Tensor Trace 定义 e ^ i ⨂ e ^ j \hat e_i \bigotimes \hat e_j e^i​⨂e^j​的迹: T r ( e ^ i ⨂ e ^ j ) e ^ i ⋅ e ^ j δ i j Tr(\hat e_i \bigotimes \hat e_j) \hat e_i \cdot \hat e_j \delta_{ij} Tr(e^i​⨂e^j​)e^i​⋅…

总结如何申请注册 GitHub 教师教育优惠 Benefits for Teachers 来免费使用 copilot

目录 1. GitHub 教师教育优惠有什么2. 如何申请教师教育优惠呢2.1 选择学校2.2 更改个人信息2.3 准备证明材料2.4 提交申请2.5 遇到的问题2.5.1 问题 12.5.2 问题 22.5.3 问题 3 3. 申请免费的 GitHub Copilot 学生注册不在此处赘述了&#xff0c;网上有很多教程可以参考。但是…

软件测试面试面对HR提出的问题,怎么回答才不会被面试官“套路”

面试中&#xff0c;如何回答HR提出的问题很大程度上决定了面试能不能成功。 下面是软件测试人员在面试过程中经常被问到的10个问题&#xff0c;告诉你怎么回答才不会被面试官套路...... 请你做一个自我介绍 误区&#xff1a; 一般人回答这个问题过于平常&#xff0c;只说姓…

JVM学习(一)

一、JVM介绍 1.1基本概念 JVM 是可运行 Java 代码的假想计算机 &#xff0c;包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收&#xff0c;堆 和 一个存储方法域。JVM 是运行在操作系统之上的&#xff0c;它与硬件没有直接 的交互。 1.2 运行过程 我们都知道 Java …

1000W用户1Wqps高并发签到系统的架构和实操

说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常有小伙伴面试的时候&#xff0c;遇到一个一个高并发 架构方面的问题&#xff0c;比如&#xff1a; (1) 高并发秒杀系统如何架构&#xff1f; (2) 高并发签到系统如何架构&#xff1f; (3) 等等等等… 刚…

【C++】函数高级

目录 &#x1f34a;一.函数的默认参数&#x1f34a; 1.默认参数的性质 2.函数默认参数的注意事项 &#x1f34e;二.函数的占位参数&#x1f34e; &#x1f34f;三.函数的重载 &#x1f34f; 1.重载的性质和条件 &#xff08;1&#xff09;修改参数的个数 &#xff…

go语言中文文档 学习笔记(未完)

这里写目录标题 网络编程互联网协议介绍socket编程socket图解TCP编程服务端客户端 UDP编程TCP黏包 http编程WebSocket编程 网络编程 互联网协议介绍 socket编程 socket图解 Socket是应用层与TCP/IP协议族通信的中间软件抽象层。在设计模式中&#xff0c;Socket其实就是一个门…

12.设计模式之门面模式

前言 门面模式&#xff0c;是指提供一个统一的接口去访问多个子系统的多个不同的接口&#xff0c;它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。日志框架slf4J是门面模式最经典的应用场景。 本节&#xff0c;我们就门面模式&#xff0c;展开详细介绍…

1.setContentView流程分析

1. setContentView初步分析之继承自Activity 我们创建的MainActivity继承自Activity,在代码中使用setContentView(R.layout.activity_main),查看他在Activity中的源码如下: public void setContentView(LayoutRes int layoutResID) {//这里的getWindow方法获取到一个PhoneWind…

什么是好代码/坏代码?给普通人的图解示例

本文翻译自国外论坛 medium&#xff0c;原文地址&#xff1a;https://medium.com/todbotts.triangles/what-is-good-bad-code-an-illustrated-example-for-non-programmers-1222b600a0f0 我曾经在某个地方读到过一句话&#xff0c;基本上有以下内容&#xff1a; 在现代世界中&a…

算法(一)—— 回溯(3)

文章目录 1 78 子集2 90 子集II3 491 递增子序列 子集问题 1 78 子集 如果把 子集问题、组合问题、分割问题都抽象为一棵树的话&#xff0c;那么组合问题和分割问题是收集树的叶子节点&#xff0c;而子集问题是找树的所有节点&#xff01; 因为需要找到所有的节点&#xff0…

JavaEE(系列一 )-- 计算机是如何进行工作的

目录 1. 操作系统 2. 进程/任务&#xff08;Process/Task&#xff09; 2.1 进程 2.2 进程管理 2.2.1 进程的结构体 2.2.2 进程调度 2.3 并行 和 并发 2.4 内存分配 -- 内存管理(Memory Manage) 2.5 进程间通信 3. 线程 1. 操作系统 操作系统是一组做计算机资源管理的软件的…

谷歌I/O大会重磅发布:Bard编码能力优化后仍不支持中文,开发者选择CodeGeeX更佳

谷歌I/O大会今天凌晨发布&#xff0c;打出系列AI组合拳。除了发布升级版语言模型PaLM2之外&#xff0c;Bard能力也要起飞。 凭借改进的数学、逻辑和推理技能&#xff0c;Bard 现在可以帮助生成、解释和调试 20 多种编程语言的代码&#xff0c;开发者们需要输入prompt&#xff0…

C#从入门到入坟(原创不易,转载请注明出处)

文章目录 C# 基础篇0 环境部署1 Hello world1.1 两种框架1.2 创建项目的过程1.3 项目组成结构1.3.1 解决方案和项目1.3.2 程序集信息1.3.3 引用1.3.4 配置文件1.3.5 程序入口类 1.4 解决方案1.5 Debug 和 Release1.6 CSharp虚拟机初始1.7 .Net Framework混合语言开发1.8 托管代…

上下文感知的体素对比学习用于标签高效的多器官分割

文章目录 Context-Aware Voxel-Wise Contrastive Learning for Label Efficient Multi-organ Segmentation摘要本文方法有监督损失Context-Aware Contrastive Learning Loss for Unlabeled Voxels 实验结果 Context-Aware Voxel-Wise Contrastive Learning for Label Efficient…

GSMA-eSIM-官网规范说明

GSMA | eSIM Consumer and IoT Specifications - eSIM GSMA | eSIM Consumer and IoT Specifications - eSIMhttps://www.gsma.com/esim/esim-specification/ 架构、测试、技术规范 3.0版本 测试套件 EID的定义和分配 GSMA EID Definition and Assignment 合规性规范 自我评…

第十四届蓝桥杯青少组模拟赛Python真题 (2023年2月12日),包含答案

第十四届蓝桥杯青少组模拟赛Python真题 (2023年2月12日) 一、选择题 第 1 题 单选题 关于Python3.10,下列选项描述正确的是 ( )。 答案:B 第 2 题 单选题 下列数据类型中,哪一个是不可变的?() 答案:B 第 3 题 单选题 以下关于函数参数描述正确的是 ()。 答案:D 第 …

【JAVAEE】文件操作——IO

目录 &#x1f48b;1. 冯诺伊曼体系 &#x1f437;2. 内存与外存的区别 ✨3. 文件 &#x1f381;3.1 认识文件 ✌3.2 文件的管理 &#x1f373;3.3 文件路径 &#x1f383;3.4 文件的保存 &#x1f451;3.4.1 文本文件 &#x1f4f7;3.4.2 二进制文件 &#x1f380;3.5 文件系…

Python基本数据类型之一——set(集合)

Python基本数据类型之一——set(集合) 一、python集合定义 集合(set)是一个无序不重复元素的序列。基本功能是进行成员关系测试和删除重复元素。 二、创建方式 在Python中&#xff0c;创建集合有两种方式&#xff1a; 一种是用一对大括号将多个用逗号分隔的数据括起来。 另一种…