目錄
- 目的
- 畫坐标系方法
- 畫坐标系代碼
- 坐标系效果圖
- 糾正飛機坐标系
- 源代碼
目的
在後續的章節中,飛機或其他模型需要參照物才能明白模型是如何運動的,本節介紹建立笛卡爾坐标系的方法。
畫坐标系方法
使用VPython的圓柱體(cylinder)畫坐标系的軸線,使用圓錐體(cone)畫坐标系的箭頭,x軸使用紅色,y軸使用綠色,z軸使用藍色。
畫坐标系代碼
#建構坐标系//
#axis_lenth:坐标軸長度
#axis_rad:坐标軸直徑
#cone_rad:坐标箭頭直徑
#unit:計算機關數值,機關mm,unit=1000為1m
def Coord_Sys(axis_lenth=100,axis_rad=1,cone_rad=1,unit=1):
meter = unit # 1m=1000mm
axis_len = axis_lenth * meter
axis_radius = axis_rad * meter
cone_radius = cone_rad * meter
cone_len = 3*cone_radius
# x軸線和箭頭
x_axis_line = cylinder(pos=vector(0, 0, 0), axis=vec(axis_len, 0, 0), radius=axis_radius)
x_axis_line.color = vector(255, 0, 0)
x_axis_cone = cone(pos=vector(axis_len, 0, 0), axis=vec(cone_len, 0, 0), radius=cone_radius)
x_axis_cone.color = vector(255, 0, 0)
# y軸線和箭頭
y_axis_line = cylinder(pos=vector(0, 0, 0), axis=vec(0, axis_len, 0), radius=axis_radius)
y_axis_line.color = vector(0, 255, 0)
y_axis_cone = cone(pos=vector(0, axis_len, 0), axis=vec(0, cone_len, 0), radius=cone_radius)
y_axis_cone.color = vector(0, 255, 0)
# z軸線和箭頭
z_axis_line = cylinder(pos=vector(0, 0, 0), axis=vec(0, 0, axis_len), radius=axis_radius)
z_axis_line.color = vector(0, 0, 255)
z_axis_cone = cone(pos=vector(0, 0, axis_len), axis=vec(0, 0, cone_len), radius=cone_radius)
z_axis_cone.color = vector(0, 0, 255)
def main():
#畫坐标系
Coord_Sys(1000,10,20,1)
if __name__ == '__main__':
main()
坐标系效果圖
在數學和工程模組化上,通常笛卡爾坐标系的x軸和y軸在水準面上,z軸為豎軸;但在飛行器飛行力學分析中,機體坐标系、速度坐标系等豎軸為y軸,z軸和x軸在水準面上。
坐标系顯示的初始畫面如圖1,黑底色的場景視窗中心為坐标系原點,紅色x軸指向右側,綠色y軸豎直向上,藍色z軸指向螢幕外。說明VPython的坐标系定義與飛行器飛行力學中坐标系的定義類似。将以上代碼加入上節“VPython三維仿真(NO.3) 導入複雜模型”中的場景初始畫面如圖2。根據上節内容中飛機的坐标系定義(如圖3),飛機豎軸為z軸,y軸指向機尾,x軸指向飛機左側,是以飛機與坐标系的相對關系如圖2的方式。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnLkFzNkVDZzEjM1MGO1QWNhVGNyQTM0AzMiRWMkV2YiF2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
圖1
圖2
圖3
糾正飛機坐标系
為友善後續仿真程式的完善,需要将飛機的坐标系定義與飛行器飛行力學坐标系定義保持一緻,方法有兩種:
方法一:在三維設計軟體中修改飛機的姿态,使x軸指向機頭,飛機豎軸為y軸,修改後如圖4。調整後的初始場景如圖5、圖6,飛機模型與飛行器飛行力學中坐标系定義保持一緻了。
圖4
圖5
圖6
方法二:在VPython中使用函數旋轉機體,在下一節移動和旋轉飛機方法中介紹。
源代碼
本節内容最後源代碼如下:
# -*- coding: utf-8 -*-
import pandas as pd
from vpython import *
from stl import mesh
#從stl檔案中讀取資料構模組化型
#file:stl檔案名
#makeComp:是否建構compound,True輸出compound,False輸出0
#tail:是否有尾迹
#model_color:模型顔色
def FileToModel(file,makeComp=False,tail=False,model_color=vec(0.5,0.5,0.5)):
temp_mesh = mesh.Mesh.from_file(file) #STL資料讀入temp_mesh
tris=[]
num=int(temp_mesh.normals.size/3) #三角面數量
for a in range(num):
aa = temp_mesh.vectors[a][0] #三角面頂點1
bb = temp_mesh.vectors[a][1] #三角面頂點2
cc = temp_mesh.vectors[a][2] #三角面頂點3
nn = temp_mesh.normals[a] #三角面方向向量
#建立三角形三個頂點,normal頂點方向向量,colord頂點顔色
p=vector(0,0,0)
a = vertex(pos=vector(aa[0], aa[1], aa[2])+p,normal=vector(nn[0], nn[1], nn[2]),color=model_color)
b = vertex(pos=vector(bb[0], bb[1], bb[2])+p,normal=vector(nn[0], nn[1], nn[2]),color=model_color)
c = vertex(pos=vector(cc[0], cc[1], cc[2])+p,normal=vector(nn[0], nn[1], nn[2]),color=model_color)
t=triangle(v0=a,v1=b,v2=c) #由三個頂點生成三角面
tris.append(t) #三角面數組
if makeComp==True:
tt=compound(tris,make_trail=tail) #将三角面組成元件
return tt
return 0
#建構坐标系/
#axis_lenth:坐标軸長度
#axis_rad:坐标軸直徑
#cone_rad:坐标箭頭直徑
#unit:計算機關數值,機關mm,unit=1000為1m
def Coord_Sys(axis_lenth=100,axis_rad=1,cone_rad=1,unit=1):
meter = unit # 1m=1000mm
axis_len = axis_lenth * meter
axis_radius = axis_rad * meter
cone_radius = cone_rad * meter
cone_len = 3*cone_radius
x_axis_line = cylinder(pos=vector(0, 0, 0), axis=vec(axis_len, 0, 0), radius=axis_radius)
x_axis_line.color = vector(255, 0, 0)
x_axis_cone = cone(pos=vector(axis_len, 0, 0), axis=vec(cone_len, 0, 0), radius=cone_radius)
x_axis_cone.color = vector(255, 0, 0)
# y軸線和箭頭
y_axis_line = cylinder(pos=vector(0, 0, 0), axis=vec(0, axis_len, 0), radius=axis_radius)
y_axis_line.color = vector(0, 255, 0)
y_axis_cone = cone(pos=vector(0, axis_len, 0), axis=vec(0, cone_len, 0), radius=cone_radius)
y_axis_cone.color = vector(0, 255, 0)
# z軸線和箭頭
z_axis_line = cylinder(pos=vector(0, 0, 0), axis=vec(0, 0, axis_len), radius=axis_radius)
z_axis_line.color = vector(0, 0, 255)
z_axis_cone = cone(pos=vector(0, 0, axis_len), axis=vec(0, 0, cone_len), radius=cone_radius)
z_axis_cone.color = vector(0, 0, 255)
def main():
#畫坐标系
Coord_Sys(1300,10,20,1)
#生成飛機
target=FileToModel('plane1.stl',tail=False,model_color=vec(1,1,0))
if __name__ == '__main__':
main()