模型运动

三维模型的运动涉及六个自由度,分别是模型质心沿笛卡尔直角坐标系三个轴x、y、z的线位移和绕三个轴的角位移。模型运动就是以上六个位移的复合运动,三维仿真的核心就是弄清楚如何在场景中设置模型这六个自由度的方法。

复杂模型对象

在第三节“VPython三维仿真(NO.3) 导入复杂模型”中,将STL文件中的三角面画出后,将所有三角面存入tris列表中,移动模型需要通过compound(复合体)封装复杂模型的所有三角面,compound对象具有基本模型的属性和函数,可以像操作基础模型一样移动、转动导入的复杂模型。
在函数FileToModel中下列代码将复杂模型的三角面tris列表封装到compound中,然后FileToModel函数返回vpython.vpython.compound对象。

if makeComp==True:tt=compound(tris,make_trail=tail) #make_trail=True显示模型尾迹return tt #vpython.vpython.compound对象

移动模型

compound和基础模型通过pos属性可设置模型在场景的位置,移动模型有两种方式,一是设置模型的绝对空间位置,即每次将模型在场景空间的坐标赋值给模型pos属性;二是设置模型的空间位置增量,即在模型当前位置上增加一个向量值,使模型移动到正确的位置上,在三维仿真中,如飞行器飞行的仿真,通常使用时间冻结法,根据仿真步长和飞行器的运动学、动力学方程,计算出模型下一时刻的线位移增量和角位移增量,故通常使用第二种方法。
移动模型的代码如下:

#vector为模型位置坐标
m.pos=vector(1,2,3)#分别设置三轴坐标
m.pos.x=1
m.pos.y=2
m.pos.z=3

转动模型

compound和基础模型通过函数rotate转动模型,函数参数包括转动角度和指定旋转轴,需要注意的是,模型从一个姿态转到另一个姿态,绕x、、y、z三个轴旋转的次序不同,每次旋转的角度可能不同。
转动模型的代码如下:

#转动角度angle单位为弧度
#vec(1,0,0)绕x轴转,vec(0,1,0)绕y轴转,vec(0,0,1)绕z轴转
m.rotate(angle=30*3.14/180,axis=vec(0,1,0))

动画帧率控制

VPython提供了函数rate,可方便的控制动画的帧率,如rate(25)为每秒25帧,即每隔40ms更新一次模型位置和姿态。没有该函数需要自己读取系统时钟完成定时,会更复杂。人眼的视觉暂留现象要求每秒大于24帧即可看到连续的动画,帧率越高动画越连贯,高帧率同时缩短了软件计算运的时间,帧率选择应满足计算运动数据所需的时间。

尾迹

使模型运动更直观的方法是显示模型运动的尾迹tail,就像特技飞行表演拉出的尾烟一样,可看到飞机飞过的路径。compound和基础模型都提供该属性,

飞机绕圈飞行

本例综合运用了对飞机模型的运动和转动,通过坐标系和尾迹(飞机拖曳出的白色圆圈)使飞机的飞行更易于观察。代码如下,动画效果见视频1。

下一节简介

VPython三维仿真(NO.6)操作场景与摄像机 介绍对场景的控制和摄像机跟随模型运动。

视频1:飞机绕圈飞行

# -*- coding: utf-8 -*-
import pandas as pd
from vpython import *
import numpy
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_meshtris=[]num=int(temp_mesh.normals.size/3) #三角面数量for a in range(num):aa = temp_mesh.vectors[a][0] #三角面顶点1bb = temp_mesh.vectors[a][1] #三角面顶点2cc = temp_mesh.vectors[a][2] #三角面顶点3nn = 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 ttreturn 0#构建坐标系/
#axis_lenth:坐标轴长度
#axis_rad:坐标轴直径
#cone_rad:坐标箭头直径
def Coord_Sys(axis_len=100,axis_radius=1,cone_radius=1):cone_len = 3*cone_radiusx_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 Flying(target):#global target#移动目标m=1000 #m为单位米i=0kk=3.14*2/250 #飞机绕圆心转动每帧角度增量target.pos.y = 3*m #固定飞行高度50米target.rotate(angle=-30*3.14/180,axis=vec(1,0,0)) #飞机倾斜30度while True:rate(25) #每秒25帧ang=i*kk #飞行绕圆心角度target.pos.x = 3*m*sin(ang)   target.pos.z = 3*m*cos(ang)target.rotate(angle=kk,axis=vec(0,1,0)) #飞机绕Y轴转动i += 1def main(): #画坐标系Coord_Sys(5000,50,100)#生成飞机aa=FileToModel('plane1.stl',makeComp=True,tail=True,model_color=vec(1,1,0))print(type(aa))#飞机飞行Flying(aa)if __name__ == '__main__':main()

VPython三维仿真(NO.5) 移动模型和调整姿态相关推荐

  1. VPython三维仿真(NO.4) 创建坐标系

    目录 目的 画坐标系方法 画坐标系代码 坐标系效果图 纠正飞机坐标系 源代码 目的 在后续的章节中,飞机或其他模型需要参照物才能明白模型是如何运动的,本节介绍建立笛卡尔坐标系的方法. 画坐标系方法 使 ...

  2. 计算机仿真模拟在装配,飞机装配仿真中数字人模型及工人姿态的模拟

    飞机装配仿真中数字人模型及工人姿态的模拟 由于飞机的结构及其制造工艺复杂,制造过程中的工艺性问题和人机问题时有发生.采用数字人和计算机仿真技术,模拟飞机制造中工人的作业姿势,为在生产准备阶段提前发现这 ...

  3. VPython三维仿真(NO.3) 导入复杂模型

    三维仿真对模型要求 科研.教学.工程的三维视景仿真往往使用实际产品.实际物体或建筑.管道.机械装置.车辆等复杂的三维模型展示模拟的物理运动和动力学过程.因此VPython内置的基础模型难以满足三维仿真 ...

  4. VPython三维仿真(NO.2) 图像操作与基础模型

    场景图像基本操作 可对在浏览器中渲染的场景进行旋转.缩放.平移操作.球体不易看到旋转过程,可使用正方体练习对图像的基本操作,掌握了对场景图像的基本操作后,下一节介绍导入三维模型后可对三维模型进行观察. ...

  5. VPython三维仿真(NO.7)label显示信息

    本文介绍VPython在屏幕显示状态提示信息和跟随模型显示信息的方法. label对象 实现信息显示使用label对象,详细内容如下链接: https://www.glowscript.org/doc ...

  6. VPython三维仿真(NO.1) VPython安装与开发环境

    VPython简介 VPython是Python的实时交互三维绘图模块,可对绘制的三维图像进行移动.缩放等操作.VPython函数功能强大,具有简单易学的优点.因Python语言简洁代码少,各种数学模 ...

  7. VPython三维仿真(NO.9)贴图

    在Vpython中贴图对象为Texture,帮助文档如下: https://www.glowscript.org/docs/VPythonDocs/textures.html box贴图 r=box( ...

  8. 实现osgEarth三维仿真场景模型雾的效果的添加解决方法

    在osgearth项目开发的过程中,为了实现逼真的三维场景可视化效果,需要对模型进行雾化处理,从而实现雾的自然天气情况模拟.在这过程中,利用OSG的osg::Fog类实现雾的效果,实现的效果如图1所示 ...

  9. FAST选址与三维仿真模拟研究

    1993年国际无线电联大会上, 包括中国在内的10国天文学家提出共同建造接收面积为一平方公里的阵国际大射电望远镜(Square Kilometer Array,简称SKA)计划.从1994年开始,以国 ...

最新文章

  1. linux eth0 device not found,mini2440的nfs文件系统挂不上问题“IP-Config: Device `eth0' not found”...
  2. 【高级Java架构师系统学习】java如何开发安卓软件
  3. [渝粤教育] 中国地质大学 自动控制原理 复习题
  4. 如何建设可视化集中管理平台
  5. esp8266使用安信可IDE编译、烧录
  6. 火爆全网,搜狐CEO张朝阳手推E=mc²,CEO当太久都忘了他是MIT物理博士
  7. 动力节点—Java黄埔军校是怎样炼成的
  8. 【Excel2019(十二):Match与Index函数】【函数语法+与VLOOKUP比较+单元格引用原理+认识COLUMN函数+使用Match与VLOOKUP函数嵌套返回多列结果】
  9. 论文阅读|Embodied Hands: Modeling and Capturing Hands and Bodies Together
  10. win7系统安装 wifi连接到服务器,win7系统笔记本wifi无法连接到服务器1237的解决方法...
  11. Android视频监控!!!随时随地监控你的家庭
  12. 考研计算机报录比最高的手机,考研 | 报录比最高专业TOP10,就离谱!
  13. “天地不仁,以万物为刍狗”的真正意思
  14. 数据治理建设管理办法(参考)(粉丝福利)
  15. 安卓 Bitmap 高效加载
  16. linux下用chmod修改文件权限详解(文件权限与特殊权限)
  17. python从入门到实践配套资源免费下载
  18. 2013小米招聘面试题
  19. VMware安装windows XP OS 虚拟机时常见的问题
  20. 微博技术:千万级规模高性能高并发的网络架构设计

热门文章

  1. 解决windows版本python下没有tkinter库问题
  2. VMware未来二十年,打开数字化转型的无限可能
  3. WEB免费打印控件推荐(转载)
  4. Tensorflow学习笔记——tf.set_random_seed函数
  5. Android Studio 第三次作业
  6. ArcGIS出图时如何制作花式边框
  7. HashMap的到底是有序还是无序
  8. C练题笔记之:Leetcode-200. 岛屿数量
  9. Linux 基础上机篇
  10. 深入理解Spark RDD——RDD实现的初次分析