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

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

Vector3 三维向量

Vector3 三维向量 Struct Representation of 3D vectors and points. 表示3D的向量和点。 This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doin

MySQL——表操作

目录 一、创建表 二、查看表 2.1 查看表中某成员的数据 2.2 查看整个表中的表成员 2.3 查看创建表时的句柄 三、修改表 alter 3.1 重命名 rename 3.2 新增一列 add 3.3 更改列属性 modify 3.4 更改列名称 change 3.5 删除某列 上一篇博客介绍了库的操作,接下来来看一下表的相关操作。 一、创建表 create