VPython—旋转坐标系

使用arrow( )创建三个坐标轴代表一个坐标系,其中X0-Y0-Z0为参考坐标系(固定不动),X-Y-Z为运动坐标系,这两个坐标系原点重合,运动坐标系可以绕参考坐标系或其自身旋转。在屏幕上输出一个转换矩阵,该矩阵描述了动坐标系相对于参考坐标系的姿态,矩阵第一列表示动坐标系的X轴在参考坐标系中的方向,第二列表示动坐标系的Y轴在参考坐标系中的方向,第二列表示动坐标系的Z轴在参考坐标系中的方向。显而易见,当两个坐标系姿态一致时,转换矩阵为3阶单位矩阵。

程序中按键盘的上下方向坐标系绕Y轴旋转,按左右键坐标系绕Z轴旋转,按W,S键绕X轴旋转。由于本例子使用的是VPython5,对于键盘事件只支持轮询方式检测,即在while循环中不停地检测是否有按键按下。在最新的VPython6中支持了键盘事件响应,可以自定义事件响应的回掉函数。

对于绕Z轴旋转这一动作来说,可以使绕参考坐标系的Z轴,也可以是绕动坐标系自身的Z轴。绕自身坐标轴旋转的角度称为欧拉角,而飞行器和航海中常用的RPY角(Roll-Pitch-Yaw:横滚、俯仰、偏航)是绕固定坐标系旋转。

对于旋转三个坐标轴来说可以将其放在一个自定义的旋转函数中,每次旋转只需调用该函数;也可以将其添加进同一个frame,旋转frame时frame中的所有对象都会跟着一起旋转。注意:下面的程序中旋转frame时是绕着参考坐标系的坐标轴旋转的,调用自定义的旋转函数旋转坐标系时是按照动坐标系的坐标轴旋转的。

 1 # -*- coding: utf-8 -*-
 2 from visual import *
 3
 4 scene.title = ‘Coordinates‘ # 设置窗口标题
 5 scene.width = 600           # 设置窗口宽度和高度
 6 scene.height = 600
 7 scene.forward = (-1,-1,-1)  # 设置camera视线方向
 8
 9 # Create a frame object,group objects together to make a composite object
10 f = frame()
11
12 # 定义参考坐标系
13 X0 = arrow(pos=(0,0,0), axis=(1,0,0), color=color.cyan, shaftwidth=0.05)
14 Y0 = arrow(pos=(0,0,0), axis=(0,1,0), color=color.cyan, shaftwidth=0.05)
15 Z0 = arrow(pos=(0,0,0), axis=(0,0,1), color=color.yellow,shaftwidth=0.05)
16
17
18 # 定义运动坐标系的X,Y,Z轴
19 X = arrow(frame = f, pos=(0,0,0), axis=(1,0,0), color=(1,0,0), shaftwidth=0.1)
20 Y = arrow(frame = f, pos=(0,0,0), axis=(0,1,0), color=(0,1,0), shaftwidth=0.1)
21 Z = arrow(frame = f, pos=(0,0,0), axis=(0,0,1), color=(0,0,1), shaftwidth=0.1)
22
23 tf_str = ‘Transformation matrix:\n%-8.2f %-8.2f %-8.2f\n%-8.2f %-8.2f %-8.2f\n%-8.2f %-8.2f %-8.2f\n‘%(1,0,0,0,1,0,0,0,1)
24
25 # With the label object you can display 2D text in a box, and the label always faces forward
26 info = label(pos=(-0.5,0.5,0), text = tf_str, box=False, opacity=0, height=16)
27
28
29 delta_angle = radians(2)  # 2°
30
31 def rotate_axis(angle, axis, origin):
32     X.rotate(angle=angle, axis=axis, origin=origin)
33     Y.rotate(angle=angle, axis=axis, origin=origin)
34     Z.rotate(angle=angle, axis=axis, origin=origin)
35
36 while True:
37     rate(100)
38
39     if scene.kb.keys: # event waiting to be processed?
40         s = scene.kb.getkey() # get keyboard info
41
42         # 按左右箭头绕Z轴旋转
43         if s == ‘left‘:
44             #f.rotate(angle=delta_angle, axis=Z.axis, origin=(0,0,0))
45             rotate_axis(angle = delta_angle, axis = Z.axis, origin = (0,0,0))
46         elif s == ‘right‘:
47             #f.rotate(angle=-delta_angle, axis=Z.axis, origin=(0,0,0))
48             rotate_axis(angle = -delta_angle, axis = Z.axis, origin = (0,0,0))
49
50         # 按上下箭头绕Y轴旋转
51         if s == ‘up‘:
52             #f.rotate(angle=delta_angle, axis=Y.axis, origin=(0,0,0))
53             rotate_axis(angle = delta_angle, axis = Y.axis, origin = (0,0,0))
54         elif s == ‘down‘:
55             #f.rotate(angle=-delta_angle, axis=Y.axis, origin=(0,0,0))
56             rotate_axis(angle = -delta_angle, axis = Y.axis, origin = (0,0,0))
57
58         # 按w,s键绕X轴旋转
59         if s == ‘w‘:
60             #f.rotate(angle=delta_angle, axis=X.axis, origin=(0,0,0))
61             rotate_axis(angle = delta_angle, axis = X.axis, origin = (0,0,0))
62         elif s == ‘s‘:
63             #f.rotate(angle=-delta_angle, axis=X.axis, origin=(0,0,0))
64             rotate_axis(angle = -delta_angle, axis = X.axis, origin = (0,0,0))
65
66         info.text = ‘Transformation matrix:\n%-8.2f %-8.2f %-8.2f\n%-8.2f %-8.2f %-8.2f\n%-8.2f %-8.2f %-8.2f\n‘67                         % (X.axis[0],Y.axis[0],Z.axis[0],68                            X.axis[1],Y.axis[1],Z.axis[1],69                            X.axis[2],Y.axis[2],Z.axis[2])

时间: 2024-08-06 01:22:40

VPython—旋转坐标系的相关文章

【BZOJ3707】圈地 计算几何 旋转坐标系

链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/46608743"); } 题解: 对于一个点对,如果它的连线的方程的 x 为定值 ,即为一条竖线,那么我可以把所有点以 x 为第一键值, y 为第二键值排序,然后这条线两端的第一个点与这条线段做个三角形,其面积都可能更

【BZOJ3170】[Tjoi 2013]松鼠聚会 旋转坐标系

[BZOJ3170][Tjoi 2013]松鼠聚会 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. Input 第一行给出数字N,表示有多少只小松鼠.0<=N<=10^5下面N行,每行给出x,y表示其家的坐标.-10^9<=x,y<=10^9 Output 表示为了聚会走的路程和最小为多少. Sample Input 6 -4 -1 -1 -2 2

[SDOI2018]物理实验 set,扫描线,旋转坐标系

[SDOI2018]物理实验 set,扫描线,旋转坐标系 链接 loj 思路 先将导轨移到原点,然后旋转坐标系,参考博客. 然后分线段,每段的贡献(三角函数值)求出来,用自己喜欢的平衡树,我选set. 显然答案的一端是小线段的端点. 然后扫描线求出最大的ans. 代码 #include <bits/stdc++.h> using namespace std; const int N=1e5+7; int n,op[N]; long double X[N][2],Y[N][2],x[2],y[2

Android canvas rotate():平移旋转坐标系至任意原点任意角度-------附:android反三角函数小结

自然状态下,坐标系以屏幕左上角为原点,向右是x正轴,向下是y正轴.现在要使坐标系的原点平移至任一点O(x,y),且旋转a角度,如何实现? 交待下我的问题背景,已知屏幕上有两点p1和p2,构成直线l.我要以两点的中点mid(x,y)为坐标原点,线段l的中垂线为一个轴,l为另外一个轴,做一个坐标系.切割出一个边长为d的正方形.示意图如下所示: double d = Math.sqrt((p2.x-p1.x)*(p2.x - p1.x)+(p2.y-p1.y)*(p2.y-p1.y)); //p1.p

旋转坐标系

'Origin on WCS point: 0,0,6150 'Rotation of the Zaxis: -90 degrees 'Rotation of the Yaxis: 6 degrees 'Rotation of the Xaxis: 35 degrees 'Rotation of the Yaxis: -9- degrees Dim UCS As Matrix3d = Matrix3d.Identity * _ Matrix3d.Displacement(New Vector3d

四元数运动学笔记(3)四元数和旋转相关的约定表述

1.四元数的约定表述1.1 四元数表述的差异1.2 Hamilton vs JPL1.2.1元素的顺序1.2.2 左手系和右手系1.2.3 旋转操作的对象1.2.4 旋转操作的方向1.3 文章采用的表述1.4扰动和时间导数1.4.1右扰动和左扰动1.4.2 Hamilton表示下的(L-G)的四元数时间导数1.4.3 其他有用的表述方式1.5 barfoot书中表述2.旋转角速率表示旋转积分2.1零阶积分2.2一阶积分2.3归一化处理 1.四元数的约定表述 1.1 四元数表述的差异 根据实部虚部

三维坐标系的旋转矩阵

转载自:http://m.blog.csdn.net/blog/qiuqchen/21980731 为了方便自己记忆,记录一下三维坐标旋转矩阵的推导过程. 坐标的旋转变换在很多地方都会用到,比如机器视觉中的摄像机标定.图像处理中的图像旋转.游戏编程等. 任何维的旋转可以表述为向量与合适尺寸的方阵的乘积.最终一个旋转等价于在另一个不同坐标系下对点位置的重新表述.坐标系旋转角度θ则等同于将目标点围绕坐标原点反方向旋转同样的角度θ. 若以坐标系的三个坐标轴X.Y.Z分别作为旋转轴,则点实际上只在垂直坐

四元数(Quaternion)和旋转----fwqlzz love is for ever

四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转.矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉选择则是按照一定的坐标轴顺序(例如先x.再y.最后z).每个轴旋转一定角度来变换坐标或向量,它实际上是一系列坐标轴旋转的组合. 那么,四元数又是什么呢?简单来说,四元数本质上是一种高阶复数(听不懂了吧...),是一个四维空间,相对

四元数(Quaternion)和旋转(转)

http://blog.csdn.net/candycat1992/article/details/41254799 四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转.矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉选择则是按照一定的坐标轴顺序(例如先x.再y.最后z).每个轴旋转一定角度来变换坐标或向量,它实际上是一系列坐标