当前位置: 首页 > wzjs >正文

临沂网站建设排名网站维护方式

临沂网站建设排名,网站维护方式,网站建设公司哪家好 尖端磐石网络,个人房源网四元数如何用于 3D 旋转(代替欧拉角和旋转矩阵) 在三维空间中,物体的旋转可以用 欧拉角、旋转矩阵 或 四元数 来表示。 四元数相比于欧拉角和旋转矩阵有 计算更高效、避免万向锁、存储占用少 等优点,因此广泛用于 游戏开发、机器…

四元数如何用于 3D 旋转(代替欧拉角和旋转矩阵)

在三维空间中,物体的旋转可以用 欧拉角、旋转矩阵 或 四元数 来表示。
四元数相比于欧拉角和旋转矩阵有 计算更高效、避免万向锁、存储占用少 等优点,因此广泛用于 游戏开发、机器人学、计算机图形学和航空航天 等领域。

四元数的定义

一个四元数 q 由四个实数组成:
q = w + x i + y j + z k q=w+xi+yj+zk q=w+xi+yj+zk
其中:w,x,y,z 是实数;i,j,k 是虚单位,满足特定的乘法规则

旋转的基本表示方式

方式表示方法优缺点
欧拉角(Euler Angles)(α,β,γ) 对应绕 X, Y, Z 轴的旋转优点:直观易理解,和现实生活的旋转方式类似。缺点:存在万向锁(Gimbal Lock)问题,计算复杂。
旋转矩阵(Rotation Matrix)3×3 矩阵优点:适用于线性代数计算,方便复合旋转。缺点:需要存储 9 个值,数值误差累积会导致非正交性。
四元数(Quaternion)q=w+xi+yj+zk优点:旋转计算简单,存储更紧凑(只需要 4 个数),避免万向锁,插值平滑。缺点:不直观,不容易手动调整。

旋转四元数的定义

一个 旋转四元数q 表示围绕单位向量 (x,y,z) 旋转角度 θ 的旋转:
q = cos ⁡ θ 2 + sin ⁡ θ 2 ( x i + y j + z k ) q=\cos\frac{\theta}{2}+\sin\frac{\theta}{2}(x\mathbf{i}+y\mathbf{j}+z\mathbf{k}) q=cos2θ+sin2θ(xi+yj+zk)
或写成向量形式:
q = ( cos ⁡ θ 2 , x sin ⁡ θ 2 , y sin ⁡ θ 2 , z sin ⁡ θ 2 ) q=\left(\cos\frac{\theta}{2},x\sin\frac{\theta}{2},y\sin\frac{\theta}{2},z\sin\frac{\theta}{2}\right) q=(cos2θ,xsin2θ,ysin2θ,zsin2θ)
其中:θ 是旋转角度
(x,y,z) 是旋转轴(必须是单位向量)
(xi,yj,zk) 是四元数的虚部,表示旋转方向
注意:旋转四元数必须是单位四元数,即满足:
∣ q ∣ = w 2 + x 2 + y 2 + z 2 = 1 |q|=\sqrt{w^2+x^2+y^2+z^2}=1 q=w2+x2+y2+z2 =1

使用四元数进行 3D 旋转

假设有一个点 v = ( v x , v y , v z ) \mathbf{v}=(v_x,v_y,v_z) v=(vx,vy,vz),我们想用四元数 q 旋转它。方法如下:

  • 将点转换为纯四元数(虚部存储向量坐标)
    p = ( 0 , v x , v y , v z ) p=(0,v_x,v_y,v_z) p=(0,vx,vy,vz)
  • 计算旋转后的点
    p ′ = q p q − 1 p^{\prime}=qpq^{-1} p=qpq1
    其中: q − 1 q^{-1} q1是四元数的逆(单位四元数的逆就是它的共轭)
    旋转后的点 p ′ p^{\prime} p也是一个纯四元数,其中的虚部给出新坐标。
  • 单位四元数的逆
    q − 1 = q ∗ = ( cos ⁡ θ 2 , − x sin ⁡ θ 2 , − y sin ⁡ θ 2 , − z sin ⁡ θ 2 ) q^{-1}=q^*=(\cos\frac{\theta}{2},-x\sin\frac{\theta}{2},-y\sin\frac{\theta}{2},-z\sin\frac{\theta}{2}) q1=q=(cos2θ,xsin2θ,ysin2θ,zsin2θ)

例程(C语言)

旋转 (1, 0, 0) 向量 绕 Y 轴旋转 90°。
计算后,结果应该接近 (0, 0, -1),即 X 轴向量变成 Z 轴负方向。

#include <stdio.h>
#include <math.h>// 定义四元数结构体
typedef struct {double w, x, y, z;
} Quaternion;// 定义向量结构体
typedef struct {double x, y, z;
} Vector3;// 归一化四元数(单位四元数)
Quaternion normalize(Quaternion q) {double magnitude = sqrt(q.w * q.w + q.x * q.x + q.y * q.y + q.z * q.z);q.w /= magnitude;q.x /= magnitude;q.y /= magnitude;q.z /= magnitude;return q;
}// 计算四元数的共轭
Quaternion conjugate(Quaternion q) {Quaternion conj = {q.w, -q.x, -q.y, -q.z};return conj;
}// 计算两个四元数的乘法
Quaternion multiply(Quaternion q1, Quaternion q2) {Quaternion result;result.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z;result.x = q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y;result.y = q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x;result.z = q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w;return result;
}// 旋转向量 v 使用四元数 q
Vector3 rotate_vector(Vector3 v, Quaternion q) {Quaternion p = {0, v.x, v.y, v.z}; // 将向量转换为纯四元数Quaternion q_conj = conjugate(q);  // 计算四元数共轭// 计算旋转后的四元数 p' = q * p * q^(-1)Quaternion temp = multiply(q, p);Quaternion rotated = multiply(temp, q_conj);// 结果的虚部即为旋转后的向量Vector3 result = {rotated.x, rotated.y, rotated.z};return result;
}// 生成绕 (ux, uy, uz) 轴旋转 theta 角度的四元数
Quaternion from_axis_angle(double ux, double uy, double uz, double theta) {Quaternion q;double half_theta = theta * M_PI / 360.0; // 角度转弧度并除以 2double sin_half_theta = sin(half_theta);q.w = cos(half_theta);q.x = ux * sin_half_theta;q.y = uy * sin_half_theta;q.z = uz * sin_half_theta;return normalize(q);
}int main() {// 定义一个向量 (1, 0, 0)Vector3 v = {1, 0, 0};// 绕 Y 轴旋转 90 度的四元数Quaternion q = from_axis_angle(0, 1, 0, 90);// 旋转向量Vector3 rotated_v = rotate_vector(v, q);// 输出旋转后的结果printf("旋转后向量: (%f, %f, %f)\n", rotated_v.x, rotated_v.y, rotated_v.z);return 0;
}

代码解析

  1. 定义数据结构
    Quaternion 结构体存储四元数(w, x, y, z)
    Vector3 结构体存储 3D 向量(x, y, z)
  2. 归一化四元数
    旋转四元数必须是 单位四元数,所以 normalize() 函数保证四元数的模长为 1。
  3. 计算四元数共轭
    conjugate() 计算 (对于单位四元数,逆就是共轭)。
  4. 四元数乘法
    multiply() 执行两个四元数的乘法,用于计算旋转变换。
  5. 向量旋转
    rotate_vector() 采用公式 计算旋转后的向量。
  6. 从轴-角度转换为四元数
    from_axis_angle() 计算沿任意轴旋转 theta 角度的旋转四元数。

如预期,原来的 (1, 0, 0) 经过 绕 Y 轴旋转 90° 后变成了 (0, 0, -1)


文章转载自:

http://eFGbK4dl.jxtbr.cn
http://YdthceSf.jxtbr.cn
http://R5G3yPb0.jxtbr.cn
http://hJIiKbA9.jxtbr.cn
http://7Hhb1CiI.jxtbr.cn
http://pZde5Rrz.jxtbr.cn
http://ZvqxdvQf.jxtbr.cn
http://Abm78dUq.jxtbr.cn
http://Z7pq6wf4.jxtbr.cn
http://k6MXifF6.jxtbr.cn
http://qp2dPzNN.jxtbr.cn
http://SgK9I5T3.jxtbr.cn
http://YpNEg6uu.jxtbr.cn
http://DYerWkGv.jxtbr.cn
http://BMk3L2dV.jxtbr.cn
http://WO29P8Qy.jxtbr.cn
http://JPzdfezL.jxtbr.cn
http://x0JVY07C.jxtbr.cn
http://PzANosQ2.jxtbr.cn
http://K0tdFyCS.jxtbr.cn
http://GXqd5EOE.jxtbr.cn
http://QpjSMhbb.jxtbr.cn
http://pEAqnBsF.jxtbr.cn
http://x3ceguwi.jxtbr.cn
http://jnBrzSAO.jxtbr.cn
http://LeDREMx4.jxtbr.cn
http://vzPNUzlf.jxtbr.cn
http://pQBnSl9W.jxtbr.cn
http://gYwzXWGV.jxtbr.cn
http://hcsEdT7J.jxtbr.cn
http://www.dtcms.com/wzjs/636848.html

相关文章:

  • 宿州精品网站建设开发小程序平台
  • 网站建设的指标公司网站建设方案详细方案
  • 海南景区网站建设方案WordPress清除ID沉余
  • 顺德龙江网站建设室内设计平面图讲解
  • 陕西城乡住房建设厅网站互联网服务平台官网
  • 北京公司建站模板长沙建网站一般要多少钱
  • 深圳设计网站公司网站wordpress儿童主题
  • 中山医疗网站建设为何网站打开慢
  • 网站 公司形象亳州是网站建设
  • 做淘推广的网站电商平台活动策划方案
  • 网站建设视频教程php阳江市招聘最新招聘信息
  • 做音响网站外贸电商
  • 建设外贸网站价格济南网站制作0531soso
  • 网站开发的技术风险小白的博客 wordpress
  • 好看的网站设计公司江苏中益建设官方网站
  • 莱芜关于网站建设的公司海宁高端高端网站设计
  • 通化市建设工程招投标网站php做视频分享网站
  • 做网站需要看啥书怎么创建网页链接快捷方式
  • 免费建设门户网站效果图网站推荐大全面包砖
  • 网站登录失败怎么回事怎样开自己的网站
  • 小白怎么做网站网站网络建设
  • 湛江市建设交易中心网站网站线上体系
  • 盐地网站建设公司企业建设网站的需求分析
  • 免费自助建站系统哪个好城建网官网
  • 如何找网站推广网站制作推广电话
  • 南宁百度网站公司哪家好网站admin密码
  • 企业手机网站建设资讯网址搜索栏在哪
  • 电子政务门户网站建设代码wordpress知更鸟主题教程
  • 自己做的网站程序怎么发布天津市住房和城乡建设部网站
  • 网站建立百度信任罗定市城乡规划建设局网站