VPython三维仿真(NO.6)操作场景与摄像机

2024-01-13 23:59

本文主要是介绍VPython三维仿真(NO.6)操作场景与摄像机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VPython中控制场景的类为canvas,参考见官网网址:
https://www.glowscript.org/docs/VPythonDocs/canvas.html

常用选项

场景创建与设置大小、颜色

场景大小和颜色可以在创建canvas对象时设置,width参数设置场景宽度,height参数设置场景高度,background参数设置背景颜色,title参数为窗口的名称,显示在浏览器内容窗口左上角。以下创建一个场景scene1,宽1200,高700,背景白色,如图1。

scene1=canvas(title='No.1',width=1200,height=700,background=vec(1,1,1))

在这里插入图片描述
图1

场景中心

center属性控制场景开始时,视口中心的位置,显示画面中心平移至center位置处。
例如

scene1=canvas(title='No.1',center=vector(1,4,8))

scene1=canvas(title='No.1')
scene1.center=vector(1,4,8)

截屏

Scene1.capture(“filename”)可将屏幕画面保存到文件filename.png中,注意截取画面内容的时机。

显示文字

title属性可设置显示在图形窗口左上方的文字,可以显示多行文字,可显示Html文本。

title="Now \n <b>click the box</b>."

显示如图2。
在这里插入图片描述

图2

控制显示窗口

控制显口(View)的属性有range、center、forward、fov、camera.pos
定义见图3。
在这里插入图片描述

图3

测试各属性

以下代码按下P键后输出range、center、forward、fov、camera.pos的值,可观察不同动作影响的数据。鼠标滚轮缩放改变camera.pos的值;Ctrl+鼠标左键旋转场景,改变forward值;Shift+鼠标左键移动场景,改变center和camera.pos的值。以上操作fov不会改变。

 while True:ev=scene1.waitfor('keyup')if ev.event=='keyup':if ev.key=='p':print("fov:"+str(scene1.fov))print("camera.pos:"+str(scene1.camera.pos))print("center:"+str(scene1.center))print("forward:"+str(scene1.forward))print("range:"+str(scene1.range))print("======")

控制策略

经测试,不要设置camera.pos,camera.pos设置后,center会自动改变,导致看不到模型;
在程序中控制视口需要先设置center、forward,设置range控制远近,camera.pos会自动设置到使模型可见,以上设置过程fov不变。
fov越大,近大远小的透视效果越明显,fov默认设置为60度。
以下代码改变range可改变可视范围,相当于缩放。

scene1.center=vector(0,0,0)
scene1.forward=vector(-0.5,-0.5,-0.5) 
scene1.range=5000

range=10000与range=5000如图4。
在这里插入图片描述
图4

使用摄像机控制窗口

控制摄像机的属性见下图。

视口跟踪目标

scene.camera.follow(aa) #视口跟随飞机

scene.camera.follow函数简化了视口跟随模型的代码,否则需要获取模型当前位置并赋值给scene.camera.pos。视口跟随模型后,scence.forward控制视口相对模型的角度。

视口角度控制

以下使视口从上方斜向下指向飞机

scene1.forward = scene1.forward.rotate(angle=-PI / 6, axis=vec(1, 0, 0)) #绕x轴转30度
scene1.forward = scene1.forward.rotate(angle=PI / 4, axis=vec(0, 1, 0)) #绕y轴转45度

摄像机上方向

scene.up=vector(1,0,0) #指定视口的上方向的指向

示例

视口跟随模型的动画如下。

视口跟随飞机

代码

飞行.py

# -*- coding: utf-8 -*-
import pandas as pd
from vpython import *
from VPython_Lib import *PI=3.1415926scene1 = canvas(title="视口跟随目标", width=600, height=500, background=vec(1,1,1))
scene1.center=vector(0,0,0)
scene1.range=5000
scene1.autoscale = False
scene1.camera.pos=vector(6000,6000,6000)#飞机飞行
def Flying(target):#k=1#移动目标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 += 1#print(str(scene1.camera.pos)+"  "+str(scene1.center))'''if k==1:scene1.capture("123") #截屏到文件123.pngk=0'''def main(): #画坐标系Coord_Sys(5000,50,100)#生成飞机aa=FileToModel('plane1.stl',makeComp=True,tail=True,model_color=vec(1,1,0))#视口跟踪目标scene1.camera.follow(aa)scene1.forward = scene1.forward.rotate(angle=-PI / 6, axis=vec(1, 0, 0))scene1.forward = scene1.forward.rotate(angle=PI / 4, axis=vec(0, 1, 0))scene1.up=vector(0,1,0)#飞机飞行Flying(aa)#以下测试控制视口属性'''while True:ev=scene1.waitfor('keyup')if ev.event=='keyup':if ev.key=='p':print("fov:"+str(scene1.fov))print("camera.pos:"+str(scene1.camera.pos))print("center:"+str(scene1.center))print("forward:"+str(scene1.forward))print("range:"+str(scene1.range))print("======")'''if __name__ == '__main__':main()

VPython_Lib.py为导入STL模型和创建直角坐标系的函数库。

#VPython_Lib.py
#导入STL模型和创建直角坐标系的函数库
# -*- coding: utf-8 -*-
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)

这篇关于VPython三维仿真(NO.6)操作场景与摄像机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/603240

相关文章

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

Java Stream流与使用操作指南

《JavaStream流与使用操作指南》Stream不是数据结构,而是一种高级的数据处理工具,允许你以声明式的方式处理数据集合,类似于SQL语句操作数据库,本文给大家介绍JavaStream流与使用... 目录一、什么是stream流二、创建stream流1.单列集合创建stream流2.双列集合创建str

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除