#计算机图形学课程设计-三维美术馆漫游
#作者:周珈任 &宋定辉
#时间:2021-6-6
#环境:Vizard 7 / Win10 / Python3.8
#设置程序编码类型,支持UTF-8
#!/usr/bin/env Python
# coding=utf-8
#引入外部库
import sys
import viz
import vizact
import vizinfo
import vizshape
import vizact
import math
import time
import datetime
#设置基本参数
speed = 2.0
view = viz.MainView #摄像机view
viz.setMultiSample(8)
viz.go()
viz.mouse.setVisible(viz.OFF)
#加载三维模型源文件
avatar_me = viz.addAvatar('vcc_male.cfg', pos=(0,0,0), euler=(0,0,0)) #自 己
avatar_talking_male = viz.addAvatar('vcc_male2.cfg', pos=(1,0,5), euler=(90,0,0)) #谈话人1
avatar_talking_female = viz.addAvatar('vcc_female.cfg',pos=(2,0,5), euler=(-90,0,0)) #谈话人2
avatar_pigeon = viz.addAvatar('pigeon.cfg',pos=(1,0,1), euler=(0,0,0)) #鸽 子
gallery = viz.add('gallery.osgb') #美术馆
sky = viz.add('sky_day.osgb') #天 空
#加载三维模型动作
avatar_talking_male.state(4) #加载谈话人1的谈话动作,动作4
avatar_talking_female.state(14) #加载谈话人2的谈话动作,动作14
avatar_pigeon.state(2) #加载鸽 子的走路动作,动作2
#加载时钟三维模型
biaopan = viz.add('biaopan.obj') #时钟表盘
shizhen = viz.add('shizhen.obj') #时 针
fenzhen = viz.add('fenzhen.obj') #分 针
miaozhen = viz.add('miaozhen.obj') #秒 针
#调整时钟模型大小
biaopan.setScale([0.25,0.25,0.25]) #调整模型大小
shizhen.setScale([0.25,0.25,0.25]) #调整模型大小
fenzhen.setScale([0.25,0.25,0.25]) #调整模型大小
miaozhen.setScale([0.25,0.25,0.25]) #调整模型大小
#设置时钟初始位置
biaopan.setPosition(0,4,10) #表盘坐标位置
shizhen.setPosition(0,4,10) #时针坐标位置
fenzhen.setPosition(0,4,10) #分针坐标位置
miaozhen.setPosition(0,4,10) #秒针坐标位置
#设置时钟初始朝向
biaopan.setEuler(0,-90,0) #表盘初始朝向
shizhen.setEuler(-90,180,0) #时针初始朝向
fenzhen.setEuler(-90,180,0) #分针初始朝向
miaozhen.setEuler(-90,180,0) #秒针初始朝向
#【函数】时钟渲染
def Clock():
t = datetime.datetime.now() #获取系统时间(系统时间是实时变化的,必须将其值赋值给其他变量才可以处理)
hour=t.hour #将系统的小时值赋值给hour
minute=t.minute #将系统的分钟值赋值给minute
second=t.second #将系统的秒数值赋值给second
hour=hour%12 #时钟一圈只有12小时,对于12:00~24:00的情况需要对hour进行模12除法的处理
second_angle=second/60.0*360 #计算一秒钟秒针的旋转角度
minute_angle=minute/60.0*360+second/60.0*6 #计算一秒钟分针的旋转角度
hour_angle=hour/12.0*360+minute/60.0*30 #计算一秒钟时针的旋转角度
miaozhen.setEuler(-90,180-second_angle,0) #设置一秒钟后的秒针角度
fenzhen.setEuler(-90,180-minute_angle,0) #设置一秒钟后的分针角度
shizhen.setEuler(-90,180-hour_angle,0) #设置一秒钟后的时针角度
vizact.ontimer(1,Clock) #每隔一秒刷新一次,实现时钟功能
#【函数】鸽子漫步
def PigeonWalk():
walk1 = vizact.walkTo([2,0,3]) #鸽子走到坐标点(2,0,3)
vizact.ontimer(0.01,avatar_pigeon.addAction,walk1) #全局时间控制,无限次调用walk1
walk2 = vizact.walkTo([1,0,1]) #鸽子走到坐标点(1,0,1)
vizact.ontimer(0.01,avatar_pigeon.addAction,walk2) #全局时间控制,无限次调用walk2
PigeonWalk() #调用鸽子漫步函数,实现鸽子的来回漫步
#引入非第三方三维模型plant
Plant = viz.add('plant.osgb') #加载模型
Plant.setPosition(-1,0,2) #模型位置
#引入 第三方三维模型FloewrVase
FlowerVase = viz.add('FlowerVase.osgb') #加载模型
FlowerVase.setScale([2,2,2]) #模型大小
FlowerVase.setPosition(-1,0.5,1) #模型位置
FlowerVase.setEuler(0,0,0) #模型方向
#【函数】鼠标控制第三人称摄像机跟随人物旋转
def onMouseMove(e):
p1 = avatar_me.getPosition() #摄像机位置坐标
e1 = avatar_me.getEuler() #旋转前人 物的朝向欧拉角
e2 = view.getEuler() #旋转前摄像机的朝向欧拉角
e1[0] = e1[0]+e.dx/20 #鼠标横向偏移,将鼠标偏移量除以20控制鼠标灵敏度,人 物旋转,偏航角e1[0]改变
avatar_me.setEuler(e1) #旋转后人 物的朝向欧拉角
e2[1] = e2[1]-e.dy/20 #鼠标纵向偏移,将鼠标偏移量除以20控制鼠标灵敏度,摄像机旋转,俯仰角e2[1]改变
if(e2[1]>-90 and e2[1]<90): #俯仰角e2[1]的绝对值小于90°的情况,此时视角上下移动处于范围内
view.setEuler(e1[0],e2[1],e1[2]) #旋转后摄像机的朝向欧拉角,俯仰角改变,发生视角上下移动,欧拉角与e1不同
else: #俯仰角e2[1]的绝对值大于90°的情况,此时视角上下移动不在范围内
view.setEuler(e1) #旋转后摄像机的朝向欧拉角,俯仰角不变,没有视角上下移动,欧拉角与e1相同
view.setPosition(p1) #设置旋转后摄像机的位置坐标
viz.callback(viz.MOUSE_MOVE_EVENT,onMouseMove) #回调函数检测鼠标偏移量
#【函数】场景呈现
def UpdateView():
e = avatar_me.getEuler(); #移动前人物的朝向欧拉角
p = avatar_me.getPosition(); #移动前人物的坐 标 位置
if not (viz.key.isDown('w') or viz.key.isDown('s') or viz.key.isDown('a') or viz.key.isDown('d')): #没有按下方向键
avatar_me.state(1) #人物不动,播放内嵌动画male_high_idle1.cafx
elif viz.key.isDown('w'): #按下W键,人物前进
avatar_me.state(2) #人物向前走,播放内嵌动画2-male_high_walk.cafx
p[0] += 0.05*math.sin(math.pi*(e[0]/180)) #人物在x轴方向偏移了sin(θ),将相对偏移量乘上系数0.05控制移动速度
p[2] += 0.05*math.cos(math.pi*(e[0]/180)) #人物在z轴方向偏移了cos(θ),将相对偏移量乘上系数0.05控制移动速度
avatar_me.setPosition(p) #设置移动后新的人物坐标
elif viz.key.isDown('s'): #按下S键,人物后退
avatar_me.state(2) #人物向后退,播放内嵌动画2-male_high_walk.cafx
p[0] -= 0.05*math.sin(math.pi*(e[0]/180)) #人物在x轴方向偏移了-sin(θ),将相对偏移量乘上系数0.05控制移动速度
p[2] -= 0.05*math.cos(math.pi*(e[0]/180)) #人物在z轴方向偏移了-cos(θ),将相对偏移量乘上系数0.05控制移动速度
avatar_me.setPosition(p) #设置移动后新的人物坐标
elif viz.key.isDown('a'): #按下A键,人物左移
avatar_me.state(12) #人物向左移,播放内嵌动画12-male_high_strafeleft.cafx
p[0] -= 0.03*math.sin(math.pi*(e[0]/180)+90) #人物在x轴方向偏移了-sin(θ+π/2),将相对偏移量乘上系数0.03控制移动速度
p[2]
基于Vizard的三维美术馆漫游源码及相关资源.zip
需积分: 47 197 浏览量
2021-07-06
20:44:57
上传
评论 5
收藏 63.3MB ZIP 举报
JeronZhou
- 粉丝: 730
- 资源: 9
最新资源
- 高效MySQL查询加速指南:索引策略、查询优化、性能调优,助力数据库管理员和开发者突破性能瓶颈
- ARM Limited 发布的《RealView 编译工具 4.0 版编译器参考指南》
- 《2024音视频技术发展报告》,由LiveVideoStack出品,旨在深入了解流媒体和RTC(实时通信技术)的从业情情况
- 2023-04-06-项目笔记 - 第一百二十五阶段 - 4.4.2.123全局变量的作用域-123 -2024.05.06
- 多维因素与学生辍学风险预测数据集
- MATLAB编程高效实战:涵盖核心数学、科学计算、数据可视化及算法应用,助力工程师与研究人员的必备函数代码集
- halcon 3D图像重建
- 现有student.txt和student-score.txt 将两个文件上传到hdfs上 使用Map/Reduce框架完成下面
- 测试数据如下 1)文件一:data01.txt,内容:Beijing is beautiful I love Beijing
- 1_notepad_share_encrypt.hdoc..bin
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0