天天看點

VPython三維仿真(NO.4) 建立坐标系目的畫坐标系方法畫坐标系代碼坐标系效果圖糾正飛機坐标系源代碼

目錄

  • 目的
  • 畫坐标系方法
  • 畫坐标系代碼
  • 坐标系效果圖
  • 糾正飛機坐标系
  • 源代碼

目的

在後續的章節中,飛機或其他模型需要參照物才能明白模型是如何運動的,本節介紹建立笛卡爾坐标系的方法。

畫坐标系方法

使用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的方式。

VPython三維仿真(NO.4) 建立坐标系目的畫坐标系方法畫坐标系代碼坐标系效果圖糾正飛機坐标系源代碼

圖1

VPython三維仿真(NO.4) 建立坐标系目的畫坐标系方法畫坐标系代碼坐标系效果圖糾正飛機坐标系源代碼

圖2

VPython三維仿真(NO.4) 建立坐标系目的畫坐标系方法畫坐标系代碼坐标系效果圖糾正飛機坐标系源代碼

圖3

糾正飛機坐标系

為友善後續仿真程式的完善,需要将飛機的坐标系定義與飛行器飛行力學坐标系定義保持一緻,方法有兩種:

方法一:在三維設計軟體中修改飛機的姿态,使x軸指向機頭,飛機豎軸為y軸,修改後如圖4。調整後的初始場景如圖5、圖6,飛機模型與飛行器飛行力學中坐标系定義保持一緻了。

VPython三維仿真(NO.4) 建立坐标系目的畫坐标系方法畫坐标系代碼坐标系效果圖糾正飛機坐标系源代碼

圖4

VPython三維仿真(NO.4) 建立坐标系目的畫坐标系方法畫坐标系代碼坐标系效果圖糾正飛機坐标系源代碼

圖5

VPython三維仿真(NO.4) 建立坐标系目的畫坐标系方法畫坐标系代碼坐标系效果圖糾正飛機坐标系源代碼

圖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()