目录

  • 目的
  • 画坐标系方法
  • 画坐标系代码
  • 坐标系效果图
  • 纠正飞机坐标系
  • 源代码


目的

在后续的章节中,飞机或其他模型需要参照物才能明白模型是如何运动的,本节介绍建立笛卡尔坐标系的方法。

画坐标系方法

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

Python 3d坐标系平动仿真 python 三维坐标图_Python 3d坐标系平动仿真


图1

Python 3d坐标系平动仿真 python 三维坐标图_Python 3d坐标系平动仿真_02


图2

Python 3d坐标系平动仿真 python 三维坐标图_Python 3d坐标系平动仿真_03


图3

纠正飞机坐标系

为方便后续仿真程序的完善,需要将飞机的坐标系定义与飞行器飞行力学坐标系定义保持一致,方法有两种:

方法一:在三维设计软件中修改飞机的姿态,使x轴指向机头,飞机竖轴为y轴,修改后如图4。调整后的初始场景如图5、图6,飞机模型与飞行器飞行力学中坐标系定义保持一致了。

Python 3d坐标系平动仿真 python 三维坐标图_开发语言_04


图4

Python 3d坐标系平动仿真 python 三维坐标图_Python 3d坐标系平动仿真_05


图5

Python 3d坐标系平动仿真 python 三维坐标图_Python 3d坐标系平动仿真_06


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