首页 > 其他分享 >三维坐标旋转矩阵推导过程以及C语言实现

三维坐标旋转矩阵推导过程以及C语言实现

时间:2024-12-13 14:42:49浏览次数:4  
标签:cos 推导 float 矩阵 C语言 坐标 旋转 sin OP

此篇文章在2023年9月13日被记录

前提:
坐标使用右手坐标系,角度逆时针旋转为正。
绕X轴旋转角度为 俯仰角 即Pitch
绕Y轴旋转角度为 偏航角 即Yaw(Head)
绕Z轴旋转角度为 翻滚角 即Roll

1、平面二维坐标点的旋转

img

根据三角函数关系,可以列出向量OP与OP'的坐标表示形式:

x = |OP|•cosα			x′ = |OP|•cos(α+β)
y = |OP|•sinα			y′ = |OP|•sin(α+β)

将P′(x′,y′)表达式展开

x′ = |OP|•cos(α+β) = |OP|•(cosα•cosβ - sinα•sinβ) = x•cosβ - y•sinβ
y′ = |OP|•sin(α+β) = |OP|•(sinα•cosβ + cosα•sinβ) = x•sinβ + y•cosβ

为方便运算理解,我们将二维点旋转表示为矩阵:

img

2、立体三维坐标点的旋转

<1>绕Z轴旋转

参考二维点旋转矩阵同样的推导流程,我们可以推导出来三维点绕Z轴旋转的坐标表达式:

x′ = |OP|•cos(α+β) = |OP|•(cosα•cosβ - sinα•sinβ) = x•cosβ - y•sinβ
y′ = |OP|•sin(α+β) = |OP|•(sinα•cosβ + cosα•sinβ) = x•sinβ + y•cosβ
z′ = z

为方便运算理解,我们将三维点旋转表示为矩阵:

img

<2>绕Y轴旋转

img

<3>绕X轴旋转

img

<4>绕三轴旋转(先绕x,再绕y,最后绕z轴旋转)

img
整理后的表达式为:

img

4、C语言实现

float* matconv(float* a,float b[3][8]){
  float res[3];
  for(int i=0;i<3;i++)
    res[i]=b[i][0]*a[0]+b[i][9]*a[1]+b[i][10]*a[2];
  for(int i=0;i<3;i++)a[i]=res[i];
  return a;
}

void rotate(float* obj,float x,float y,float z){
  x/=M_PI;y/=M_PI;z/=M_PI;
  float rz[3][11]={{cos(z),-sin(z),0},{sin(z),cos(z),0},{0,0,1}};
  float ry[3][12]={{1,0,0},{0,cos(y),-sin(y)},{0,sin(y),cos(y)}};
  float rx[3][13]={{cos(x),0,sin(x)},{0,1,0},{-sin(x),0,cos(x)}};
  matconv(matconv(matconv(obj,rx),ry),rz);
}
float point[3] = {15 ,17 , 0};
rotate(point,0.1,0.2,0.3);

5、与SDL实现旋转的矩形

img

标签:cos,推导,float,矩阵,C语言,坐标,旋转,sin,OP
From: https://www.cnblogs.com/shumei52/p/18604930

相关文章

  • 在windows下使用C语言进行图形编程 SDL2开发环境搭建
    此篇文章在2023年9月7日被记录你是否对C语言命令行黑框感到厌倦,今天来为你的C编程增加一些可视化窗口吧!1、windows下安装C编译器这对于一个开发者来说简直是太业余了,如果你是一个开发者,你的电脑上怎么会没有gcc呢,如果你是一个新手,可以转到这个链接:https://zhuanlan.zhihu.c......
  • 亚矩阵云手机:搭建TikTok视频矩阵的高效解决方案
    随着TikTok在全球范围内的快速崛起,越来越多的企业和个人创作者开始重视这一平台的推广营销潜力。TikTok视频作为一种有效的营销策略,通过多个账号的矩阵协同运营,能够显著提升品牌影响力和内容传播效果。而亚矩阵云手机,作为一种创新的云手机技术解决方案,为TikTok视频矩阵的搭......
  • 初探C语言|实现井字棋游戏(超详解)
    文章目录前言正文**1.游戏基本规则****2.代码结构和实现****2.1初始化棋盘****2.2打印棋盘****2.3玩家和电脑的回合****2.4判断胜利或平局****2.5游戏主循环****2.6游戏菜单**总结与优化欢迎讨论:如有错误或不足,欢迎指正和建议,本人主打“听劝”。当然,如有疑......
  • 江科大STM32学习:01 C语言(2)指针
    1.指针简介指针Pointer是C语言的一个重要知识点,使用灵活,功能强大指针和底层硬件联系紧密(寄存器),使用指针可操作数据的地址,实现数据的间接访问2.计算机存储机制每个区域都是一个字节,线性分配下去,每个字节对应一个地址。注:一个字节是8bitinta=0x12345678;//十六进制,八......
  • 一篇文章彻底捋顺C语言文件操作知识点
    文章目录1.为什么使用文件2.什么是文件2.1程序文件2.2数据文件2.3文件名3.二进制文件和文本文件4.文件的打开和关闭4.1流和标准流4.1.1流4.1.2标准流4.2文件指针4.3文件的打开和关闭5.文件的顺序读写5.1顺序读写函数介绍5.2对比一组函数fputsfscanffwritesprintf6.......
  • 使用C语言实现队列:基础与实践
    队列(Queue)是一种常见的数据结构,遵循“先进先出”(FIFO,FirstInFirstOut)的原则。队列在许多计算机科学领域中有着广泛的应用,例如任务调度、缓冲区管理等。本文将以C语言为例,详细介绍如何实现一个简单的队列,包括两种主要实现方式:基于数组和基于链表的实现。队列的基本操作一个队......
  • C语言C23版的最新特性
    C23是ISOC标准的最新修订版,在C17的基础上进行了一些改进和扩展,以下是C23的一些新特性。一、新的类型1.十进制浮点数类型:引入了_Decimal32、_Decimal64和_Decimal128三种新的十进制浮点数类型,可用于需要精确十进制计算的场景,如金融计算等,能减少二进制浮点数在十进制表......
  • 用C语言实现栈:从基础到实战
    栈(Stack)是一种基础的数据结构,遵循后进先出(LIFO,LastInFirstOut)的原则。它被广泛应用于函数调用、表达式求值、括号匹配等问题中。在这篇技术博客中,我们将详细介绍如何使用C语言实现一个栈,并涵盖基本的操作以及实战应用。什么是栈?栈是一种特殊的线性表,只允许在一端进行插入和......
  • C语言数组
    目录数组的初始化数组的引用二维数组二维数组的初始化二维数组的引用在C语言中,数组它可以存储一系列相同类型的数据,数组中的每个元素都有一个索引,索引通常从0开始,定义数组会分配内存,数组名表示内存的首地址;数组的初始化Inta[5]={1,2,3,4,5};这个元素是1,2,3,4,5这......
  • 面试必会(嵌入式)-C语言面试高频(内存管理)
    1.(内存)堆和栈的区别⭐堆栈空间分配不同:栈由操作系统自动进行分配和释放,用于存放函数的参数值、局部变量的值等,具有高效性。堆:一般由程序员手动进行分配和释放,效率比栈低很多。data数据区:存放全局变量,静态变量。堆栈缓存方式不同:栈使用一级缓存,存储在处理器核心中,调用完......