首页 > 其他分享 >Games101:绕任意轴旋转

Games101:绕任意轴旋转

时间:2024-04-17 23:24:20浏览次数:24  
标签:cdot 旋转 large vec bmatrix alpha Games101 任意 times

Overview

对于任意坐标\(S_1=(S_x,S_y,S_z)^T\),绕任意轴线\(\vec{n}=(n_x,n_y,n_z)^T\)旋转\(\alpha\)度,推导变换矩阵\(R(\vec{n},\alpha)\),使得变换后的坐标\(S_2=R(\vec{n},\alpha) \cdot S_1\)
本文使用向量运算,推导该变换矩阵。 注意:轴线经过坐标系原点

基本公式

以列向量表示坐标,将向量乘法转换为矩阵乘法:

对于两个向量点乘:

\[\vec{a} \cdot \vec{b}=a_x\cdot b_x +a_y\cdot b_y +a_z\cdot b_z=\begin{bmatrix} a_x & a_y & a_z \\ \end{bmatrix} \cdot \begin{bmatrix} b_x \\ b_y \\ b_z \end{bmatrix} =A^T \cdot B \]

对于三个向量点乘:

\[\vec{a} \cdot \vec{b} \cdot \vec{c}= \begin{bmatrix} (a_xb_x+a_yb_y+a_zb_z)c_x \\ (a_xb_x+a_yb_y+a_zb_z)c_y \\ (a_xb_x+a_yb_y+a_zb_z)c_z \end{bmatrix}=\begin{bmatrix} b_xc_x & b_yc_x & b_zc_x \\ b_xc_y & b_yc_y & b_zc_y \\ b_xc_z & b_yc_z & b_zc_z \end{bmatrix} \cdot \begin{bmatrix} a_x \\ a_y \\ a_z \end{bmatrix}= \begin{bmatrix} c_x \\ c_y \\ c_z \end{bmatrix} \cdot \begin{bmatrix} b_x & b_y & b_z \\ \end{bmatrix} \cdot \begin{bmatrix} a_x \\ a_y \\ a_z \end{bmatrix}=CB^TA \]

对于两个向量叉乘:

\[\vec{a} \times \vec{b}= \begin{bmatrix} \vec{i} & \vec{j} & \vec{k} \\ a_x & a_y & a_z \\ b_x & b_y & b_z \\ \end{bmatrix}= \begin{bmatrix} a_y \cdot b_z -a_z \cdot b_y \\ a_z \cdot b_x -a_x \cdot b_z \\ a_x \cdot b_y -a_y \cdot b_x \\ \end{bmatrix} = \begin{bmatrix} 0 & -a_z & a_y \\ a_z & 0 & -a_x \\ -a_y & a_x & 0 \\ \end{bmatrix} \cdot \begin{bmatrix} b_x \\ b_y \\ b_z \\ \end{bmatrix} =A_T \cdot B \]

对于三个向量叉乘(参考Triple_product):

\[\vec{a} \times \vec{b} \times \vec{c}=\vec{b} \cdot (\vec{a} \cdot \vec{c})-\vec{a} \cdot(\vec{b} \cdot \vec{c}) \]

推导公式

对于原点\(O\)和坐标点\(S_2,S_1\),记:

\[\begin{split} \large \vec{s_1}=S_1-O \\ \large \vec{s_2}=S_2-O \end{split} \]

以\(\vec{s_1},\vec{n}\)向量构成平面not, 建立坐标系ontb ,分解原向量\(\vec{s_1}=\vec{s_n}+\vec{s_t}\),如下图:

可以推导基本等式:

\[\large \vec{n} \times \vec{s_1}=\vec{n} \times (\vec{s_n}+\vec{s_t})=\vec{n} \times \vec{s_n}+\vec{n} \times \vec{s_t}=\vec{n} \times \vec{s_t} \]

\[\large\vec{b}=\frac{\vec{n} \times \vec{s_t}}{\left| {n} \right| \cdot \left| \vec{s_t} \right|} =\frac{\vec{n} \times \vec{s_t}}{\left| \vec{s_t} \right|} \]

\[\large\vec{t}=\vec{b} \times \vec{n}=\frac{\vec{n} \times \vec{s_t}}{\left| \vec{s_t} \right|} \times \vec{n} \]

绕轴线\(\vec{n}\)旋转\(\alpha\)度之后向量\(\vec{s_2}=\vec{s_n}+\vec{s_r}\), 其中\(\vec{s_r}\)为\(\vec{s_t}\)绕旋转\(\alpha\)度(即$ \left| \vec{s_r} \right| = \left| \vec{s_t} \right| $)

\[\large \vec{s_n}= \left| \vec{s_1} \right| \cdot cos(\theta) \cdot \vec{n}= \frac{\vec{s_1} \cdot \vec{n}}{\left| \vec{n} \right|} \cdot \vec{n}= \vec{s_1} \cdot \vec{n} \cdot \vec{n} \]

\[\begin{align} \begin{split} \large\vec{s_r} &= \left| \vec{s_r} \right| \cdot cos(\alpha) \cdot \vec{t}+\left| \vec{s_r} \right| \cdot sin(\alpha) \cdot \vec{b}\\ \large &= \left| \vec{s_t} \right| \cdot cos(\alpha) \cdot \vec{t}+\left| \vec{s_t} \right| \cdot sin(\alpha) \cdot \vec{b} \\ \large &=\left| \vec{s_t} \right| \cdot cos(\alpha) \cdot \frac{\vec{n} \times \vec{s_t}}{\left| \vec{s_t} \right|} \times \vec{n}+\left| \vec{s_t} \right| \cdot sin(\alpha) \cdot \frac{\vec{n} \times \vec{s_t}}{\left| \vec{s_t} \right|} \\ \large &= cos(\alpha) \cdot\vec{n} \times \vec{s_t} \times \vec{n}+ sin(\alpha) \cdot \vec{n} \times \vec{s_t} \\ \large &= cos(\alpha) \cdot\vec{n} \times \vec{s_1} \times \vec{n}+ sin(\alpha) \cdot \vec{n} \times \vec{s_1} \\ \large &=cos(\alpha) \cdot(\vec{s_1} \cdot(\vec{n} \cdot \vec{n})-\vec{n} \cdot(\vec{s} \cdot \vec{n}))+ sin(\alpha) \cdot \vec{n} \times \vec{s_1} \\ \large &=cos(\alpha) \cdot(\vec{s_1} -\vec{n} \cdot(\vec{s} \cdot \vec{n}))+ sin(\alpha) \cdot \vec{n} \times \vec{s_1} \\ \large &=cos(\alpha) \cdot(\vec{s_1} -\vec{s} \cdot \vec{n}\cdot \vec{n} )+ sin(\alpha) \cdot \vec{n} \times \vec{s_1} \end{split} \end{align} \]

故:

\[\begin{align} \begin{split} \large \vec{s_2}=\vec{s_n}+\vec{s_r} &=\vec{s_1} \cdot \vec{n} \cdot \vec{n}+cos(\alpha) \cdot(\vec{s_1} -\large \vec{s} \cdot \vec{n}\cdot \vec{n} )+ sin(\alpha) \cdot \vec{n} \times \vec{s_1} \\ \large &=cos(\alpha) \cdot \vec{s_1}+(1-cos(\alpha))(\vec{s} \cdot \vec{n}\cdot \vec{n}) +sin(\alpha) \cdot \vec{n} \times \vec{s_1}\\ \end{split} \end{align} \]

将以上向量变换为坐标,可以得到等式:

\[\begin{align} \begin{split} \large S_2 &=cos(\alpha) \cdot S_1+ (1-cos(\alpha))NN^TS_1+ sin(\alpha) \cdot N_TS_1\\ \large &=(cos(\alpha)I+(1-cos(\alpha)NN^T+sin(\alpha) \cdot N_T)S_1 \end{split} \end{align} \]

故:

\[\large R(\vec{n},\alpha)=cos(\alpha)I+(1-cos(\alpha))NN^T+sin(\alpha) \cdot N_T \]

标签:cdot,旋转,large,vec,bmatrix,alpha,Games101,任意,times
From: https://www.cnblogs.com/naiveDevil/p/18134528

相关文章

  • 基于RAM的几何变换——旋转
    基于RAM的几何变换——旋转一、旋转的基本概念  旋转和镜像不同的地方在于旋转可能会改变图像尺寸的大小,一辐长宽不一样的图片在旋转之后的图幅可能需要一定的裁剪,像width和height一致的图片则不需要考虑这些。实验原理则是很简单的全等三角形和坐标变换。二、MATLAB实现 ......
  • JavaFx项目打包成exe,并集成Jre,使Java项目在任意机器运行
    1.关键点:通过springboot打包插件,将项目依赖都打到一个jar包内。以下是pom配置文件:<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artif......
  • fastjson 1.2.24 反序列化导致任意命令执行漏洞复现
    前置知识今天复现了常见的fastjson反序列化漏洞,了解该漏洞需要一些前置的知识,这里总结一下:Fastjsonfastjson是一个Java的库,可以将Java对象转换为Json字符串,也可以将Json字符串转换为Java对象,Fastjson也可以操作一些Java中的对象。JNDIJNDI(JavaNamingandDirectoryInterf......
  • games101_Homework7
    实现完整的PathTracing算法需要修改这一个函数:•castRay(constRayray,intdepth)inScene.cpp:在其中实现PathTracing算法//ImplementationofPathTracingVector3fScene::castRay(constRay&ray,intdepth)const{//TODOImplementPathTracing......
  • games101_Homework6
    实现Ray-BoundingVolume求交与BVH查找在本次编程练习中,你需要实现以下函数:•IntersectP(constRay&ray,constVector3f&invDir,conststd::array<int,3="">&dirIsNeg)intheBounds3.hpp:这个函数的作用是判断包围盒BoundingBox与光线是否相交,你需要按照课程介......
  • 代码随想录算法训练营第8天 | 字符串 344.反转字符串 541. 反转字符串II 卡码网:54.
    leetcode344.反转字符串题目344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。解题思路实现代码......
  • 允许任意地址访问 MySQL 数据库 adonis 的新用户
    问题ayear@DESKTOP-GPCA3B0:~/AdonisJS$nodeace.jsmigration:run[error]Host'DESKTOP-GPCA3B0'isnotallowedtoconnecttothisMySQLserveratPacket.asError(/home/ayear/AdonisJS/node_modules/.pnpm/[email protected]/node_modules/mysql2/......
  • Intel MacBook Pro+macOS 14配置Games101实验环境
    参考:求一个games101图形学课程的环境配置教程,最好能够简单易懂,CSDN教程根本看不懂什么意思?-不泊的回答-知乎https://www.zhihu.com/question/459126051/answer/3420947842macos现在怎么装homebrew?-MyloZ的回答-知乎https://www.zhihu.com/question/340411846/answe......
  • PythonOCC基础使用:建模——矩阵变换(平移/旋转/缩放/镜像)
    此处特别感谢小昌做出的贡献!PythonOCC基础使用:建模——矩阵变换(平移/旋转/缩放/镜像)-卡核(caxkernel.com) 1.平移效果图:fromOCC.Core.BRepPrimAPIimportBRepPrimAPI_MakeConefromOCC.Core.TopLocimportTopLoc_LocationfromOCC.Core.TopoDSimportTopoDS_Shapefr......
  • 【模板】任意模数多项式乘法:三模 NTT
    前置知识https://www.cnblogs.com/caijianhong/p/template-crt.htmlhttps://www.cnblogs.com/caijianhong/p/template-fft.html题目描述任意模数多项式乘法solution首先我们打开https://blog.miskcoo.com/2014/07/fft-prime-table这篇文章找到\(998244353\)附近的几个质......