首页| 行业资讯| 企业名录| 周边产品| 数字城市| 增强现实| 工业仿真| 解决方案| 虚拟医疗| 行业仿真| 图形处理| 军事战场
用户登录/注册 ×
资讯首页
行业资讯 >> 学习教程
Unigine2.0教程九《Script实现相机》
时间:2019-10-14    评论:0
    来源:友擎(上海)软件科技有限公司
        在Unigine中,有四种相机:PlayerActor ; PlayerDummy; PlayerPersecutor; PlayerSpectator

         现在使用Unigine Script来实现第三和第一人称的player。场景中的模拟的是一个人的移动。

         第三人称player

         1、资源文件

链接:[. /Resource/Res_0005]

2、创建Third_People工程

3、代码

//使用PlayerPersecutor来实现第三人称
#include <core/unigine.h>
#include <core/scripts/primitives.h>

People people = NULL;

class People
{
private:
/*
创建actor的目的: 快速获得actor的Phi角(水平方向角)和Theta角(垂直俯仰角),然后赋给newcamera。
*/
//人的mesh
ObjectMeshStatic mesh;
PlayerActor actor;
//相机
PlayerPersecutor newcamera;
public:
People()
{
actor = new PlayerActor();
actor.setWorldPosition(Vec3(-10.0f, 0.00f, 10.0f));
actor.setControls(0);
actor.setMinThetaAngle(20.0f);
actor.setMaxThetaAngle(60.0f);
actor.setPhiAngle(0.0f);
actor.setThetaAngle(-20.0f);
//创建人的mesh: 需要提前将people.mesh放入mesh文件夹
mesh = new ObjectMeshStatic("people.mesh");
mesh.setMaterial("mesh_base", "*");
mesh.setWorldPosition(vec3(0, 0, 0));
mesh.setTransform(mesh.getTransform() * rotateZ(90.0f));
//创建相机
newcamera = new PlayerPersecutor();
//使得player不可以手动控制
newcamera.setControls(0);
//设置跟随的目标: newcamera会自动地跟着people
//因此需要在update()函数中更新newcamera的方向, 而不需要刻意更新其位置
newcamera.setTarget(mesh);
//设置newcamera的位置
newcamera.setPosition(Vec3(-2.0f, 0.0f, 4.0f));
//设置锚: 可以简单地认为是newcamera在people的坐标系下的跟随点
newcamera.setAnchor(vec3(0.0f, 0.0f, 2.0f));
//设置最小的跟随距离
newcamera.setMinDistance(2.0f);
//设置最大的跟随距离
newcamera.setMaxDistance(2.0f);
//设置最小的俯仰角度
newcamera.setMinThetaAngle(20.0f);
//设置最大的俯仰角度
newcamera.setMaxThetaAngle(60.0f);
engine.game.setPlayer(newcamera);//非常重要:游戏所看到的场景来自这个player
}
void update()
{
mat4 m1 = translate(vec3(0, 3 * engine.game.getIFps()*sin(engine.game.getTime()), 0));

//mesh和actor做相同的移动
actor.setTransform(actor.getTransform() * m1);
mesh.setTransform(mesh.getTransform() * m1);
//设置Phi角(水平方向角)和Theta角(垂直俯仰角)
newcamera.setPhiAngle(actor.getPhiAngle());
newcamera.setThetaAngle(actor.getThetaAngle());
}
~People()
{
delete actor;
delete mesh;
delete newcamera;
}
};
int init()
{
//为了使得能够清晰地看到视觉的变化,在场景中创建了一些盒子
int size = 10;
for (int y = -size; y <= size; y += 3) {
for (int x = -size; x <= size; x += 3)
{
Object mesh = Unigine::createBox(vec3(0.1, 0.1, 0.1));
mesh.setMaterial("mesh_base","*");
mesh.setWorldPosition(vec3(x, y, 0));
}
}

//创建people
people = new People();
return 1;
}

int shutdown()
{
return 1;
}

int update()
{
people.update();
return 1;
}

第一人称player

1、资源文件

链接:[. /Resource/Res_0005]

2、创建First_People工程

3、代码:

//使用PlayerSpectator来实现第一人称
#include <core/unigine.h>
#include <core/scripts/primitives.h>


People people = NULL;

class People
{
private:
//人的mesh
ObjectMeshStatic mesh;
//player
PlayerSpectator newcamera;
public:
People()
{
//创建人的mesh: 需要提前将people.mesh放入mesh文件夹
mesh = new ObjectMeshStatic("people.mesh");
mesh.setMaterial("mesh_base", "*");
mesh.setWorldPosition(vec3(0, 0, 0));
mesh.setWorldTransform(mesh.getTransform() * rotateZ(90));
//创建相机
newcamera = new PlayerSpectator();
//相机不能被手动控制
newcamera.setControls(0);
//设置相机位置
newcamera.setPosition(Vec3(0.5f, 0.0f, 2.0f));
//设置相机方向
newcamera.setDirection(vec3(1.0f, 0.0f, 0.0f));//newcamera的朝向实际上是自身坐标系Z轴的朝向。
engine.game.setPlayer(newcamera);//非常重要:游戏所看到的场景来自这个player

}
void update()
{
float delta = 3.0f * engine.game.getIFps()*sin(engine.game.getTime());
//不同的转换矩阵的原因: mesh 和 newcamera坐标系的朝向不一样。
mat4 m1 = translate(vec3(0, delta, 0));
mat4 m2 = translate(vec3(0, 0, delta));
//设置新的转换矩阵
mesh.setWorldTransform(mesh.getWorldTransform() * m1);
newcamera.setWorldTransform(newcamera.getTransform() * m2);
}
~People()
{
delete mesh;
delete newcamera;
}
};
int init() {
//为了使得能够清晰地看到视觉的变化,在场景中创建了一些盒子
int size = 10;
for (int y = -size; y <= size; y += 3)
{
for (int x = -size; x <= size; x += 3)
{
Object mesh = Unigine::createBox(vec3(0.1, 0.1, 0.1));
mesh.setMaterial("mesh_base","*");
mesh.setWorldPosition(vec3(x, y, 0));
}
}

//创建people
people = new People();

return 1;
}

int shutdown() {
return 1;
}

int update()
{
people.update();
return 1;
}

        关于Unigine引擎

         Unigine引擎是一个具有广泛适用性的虚拟现实开发平台,应用领域包含但不限于工业设计及制造、海事模拟、铁路运输、飞行模拟、车辆模拟、医疗模拟、建筑可视化、城市规划、军事、模拟等等。模拟仿真/虚拟现实行业发展到今天,原本使用的各个引擎也已经到了亟需更新换代的时候,Unigine正是抓住了这个机会,非常迅速的踏入了这个行业。随着中国模拟仿真/虚拟现实行业的迅猛发展,工业制作业、科研、医疗、军事军工、娱乐等等领域都产生了大量的需求,而面对这些需求时,曾经引进的那些引擎已经出现了明显的瓶颈,而Unigine问世正好提供了解决方法。

         针对仿真行业的特殊要求,Unigine拥有很多针对性的功能,并进行了优化,比如高度逼真的图像渲染、精细宏大场景、多通道图像生产、非线性图像校正、边缘融合、支持非对称显示输出、适用于CAVE显示系统、立体画面输出、支持头戴显示设备、支持3D空间定位设备、支持多种工业模型数据格式、支持真实世界地理信息数据、强劲性能和可扩展性、丰富的内容支持等,使其在仿真领域更具专业性。

         了解更多详细信息,敬请访问Unigine官方网站:https://www.unigine.com

         Unigine Demo视频演示:https://i.youku.com/unigine

标签:Unigine
上一篇:Unigine2.0教程十《Script实现物体移动》下一篇:Unigine2.0教程八《制作简单的关键帧动画》
网友评论:Unigine2.0教程九《Script实现相机》
留名: 验证码:
最新评论
查看全部评论0
暂无评论
您可能还需要关注一下内容:
·Unigine2.0教程一《初识Unigine》
·Unigine2.0教程二《安装与创建工程》
·Unigine2.0教程三《设置规范化的文件夹》
·Unigine2.0教程四《Editor导入模型》
·Unigine2.0教程五《创建材质(Material)》
·Unigine2.0教程六《Nodes介绍》
·Unigine2.0教程七《为模型加骨骼动画》
·Unigine2.0教程八《制作简单的关键帧动画》
·Unigine2.0教程十《Script实现物体移动》
·Unigine2.0教程十一《简单的AI:寻路》
☏ 推荐产品

小宅 Z5 2018青春版
商家:小宅

杰瑞特运动平台
商家:杰瑞特智能

Dikalis眼动追踪
商家:赢富仪器

魔神 Hawk
商家:魔神运动分析

5DT Binoculars
商家:四维宇宙

Christie DS+750
商家:四维宇宙

Zalman M220W
商家:四维宇宙

全息360°
商家:四维宇宙

PD F10 AS3D
商家:四维宇宙

PHANTOM系列
商家:四维宇宙
☞ 外设导航
☏ 企业名录
【宁波】宁波维真显示科技股份有限公司
【潍坊】歌尔股份有限公司
【上海】霍尼韦尔(中国)有限公司
【北京】科视Christie-中国
【北京】北京华如科技股份有限公司
【北京】北京乐卡仕技术有限公司
【广州】广州弥德科技有限公司
【上海】刃之砺信息科技(上海)有限公司
【北京】北京度量科技有限公司
【北京】北京小鸟看看科技有限公司
关于本站联系我们融资计划免责声明网站建设广告服务咨询策划行业推广
北京第三维度科技有限公司 版权所有 京ICP备15051154号-3
2008-2020 Beijing The third dimension Inc. All Rights Reserved.
Email:d3dweb@163.com  QQ:496466882
Mob:13371637112(24小时)
关注虚拟现实
关注第三维度