匿名
未登录
创建账户
登录
ENPG_Wiki
搜索
查看“三维旋转的表示”的源代码
来自ENPG_Wiki
名字空间
页面
讨论
更多
更多
页面选项
阅读
查看源代码
历史
←
三维旋转的表示
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
=== 三维旋转矩阵 === 我们考虑主动旋转,并且通过$$\vec{r} = R\vec{r}$$定义相应的旋转矩阵$$R$$,其中$$\vec{r} = (x,y,z)^T$$,于是绕固定轴(世界轴)XYZ(extrinsic rotations)的旋转矩阵$$R$$为 $$ R(\varphi,X) = \begin{pmatrix} 1&0&0 \\ 0&\cos(\varphi) & -\sin(\varphi) \\ 0& \sin(\varphi) & \cos(\varphi) \end{pmatrix}, R(\varphi,Y) = \begin{pmatrix} \cos(\varphi)&0&\sin(\varphi) \\ 0&1&0 \\ -\sin(\varphi)&0&\cos(\varphi) \end{pmatrix}, R(\varphi,Z) = \begin{pmatrix} \cos(\varphi) & -\sin(\varphi) & 0 \\ \sin(\varphi) & \cos(\varphi) & 0 \\ 0 & 0 & 1 \end{pmatrix} $$ 于是连续两次绕世界轴旋转的旋转$$(Z(\varphi)-X(\theta))$$的旋转矩阵为$$R(\theta,X)R(\varphi,Z)$$ 在ROOT中,TRotation即为旋转矩阵,使用方法如下 <syntaxhighlight lang="cpp" line="1"> TRotation r; //令r为绕轴TVector3(3,4,5)旋转Pi/3的旋转矩阵 r.Rotate(TMath::Pi()/3,TVector3(3,4,5)); //对向量v进行旋转r TVector3 v; TRotation r; v.Transform(r); v *= r; //Attention v = r * v //变为恒等变换 r.SetToIdentity(); //得到绕固定轴Z旋转phi,再绕固定轴X旋转theta的旋转矩阵 r.RotateZ(phi) r.RotateX(theta) </syntaxhighlight> ===通过欧拉角表示三维旋转=== [[文件:EulerAngle.png|缩略图|欧拉角$$Z(\varphi)-X(\theta)-Z(\psi)$$]] [[文件:EulerAngle ZXZ.gif|缩略图|欧拉角$$Z(\varphi)-X(\theta)-Z(\psi)动图]] <!-- {{multiple image | width1 = 170 | footer = Any target orientation can be reached, starting from a known reference orientation, using a specific sequence of intrinsic rotations, whose magnitudes are the Euler angles of the target orientation. This example uses the ''z-x′-z″'' sequence. | image1 = euler2a.gif | alt1 = | width2 = 150 | image2 = intermediateframes.svg | alt2 = | caption2 = }} --> 考虑内旋(intrinsic rotations)定义下(即绕刚体轴旋转)的$$Z(\psi)-X'(\theta)-Z''(\varphi)$$欧拉角旋转,依次旋转的角度为$$\psi,\theta,\varphi$$,它与外旋(extrinsic rotations)定义下(即绕世界轴旋转)的欧拉角$$Z(\varphi)-X(\theta)-Z(\psi)$$的旋转效果相同,旋转矩阵均为'' $$ R_{ZX'Z''}(\psi,\theta,\varphi) = R_{ZXZ}(\varphi,\theta,\psi) = R(\psi,Z)R(\theta,X)R(\varphi,Z)'' $$ 在ROOT中构建欧拉角旋转的旋转矩阵 <syntaxhighlight lang="cpp" line="1"> //////////////////////////////////////////////////////////////////////////////// /// Rotate using the x-convention. TRotation & TRotation::RotateXEulerAngles(Double_t phi, Double_t theta, Double_t psi) { TRotation euler; euler.SetXEulerAngles(phi,theta,psi); return Transform(euler); } //////////////////////////////////////////////////////////////////////////////// /// Rotate using the x-convention (Landau and Lifshitz, Goldstein, &c) by /// doing the explicit rotations. This is slightly less efficient than /// directly applying the rotation, but makes the code much clearer. My /// presumption is that this code is not going to be a speed bottle neck. TRotation & TRotation::SetXEulerAngles(Double_t phi, Double_t theta, Double_t psi) { SetToIdentity(); RotateZ(phi); RotateX(theta); RotateZ(psi); return *this; } ///得到一个(Z(phi)-X(theta)-Z(psi))的外旋欧拉角旋转(extrinsic rotations)的旋转矩阵,即(Z(psi)-X'(theta)-Z''(phi))内旋欧拉角旋转(ntrinsic rotations) TRotation r; r.SetXEulerAngles(phi,theta,psi); </syntaxhighlight>
返回至“
三维旋转的表示
”。
导航
导航
首页
根目录
最近更改
随机页面
全部页面
如何编辑
MediaWiki帮助
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志