720云部分功能在Unity中的制作(1)——场景操作

新人刚到公司就被分配了给大专生写教材的任务(后续还要去大专教书,大专老师钱是真少啊),负责人给了一个720云的案例让俺实现部分功能,写个小博客留个档吧,后面就要去学习webvr相关的知识了。

在建模软件中导出模型时建议选择.fbx格式,可以尽可能保存建模软件中已经添加好的贴图文件。

案例中对场景的操作是按住鼠标左键上下移动来控制摄像头上下移动来预览场景,同时鼠标滚轮控制摄像机fov的缩放来实现场景的缩放,如下面的gif所示。场景操作gif

接下来进入我们的程序,先将主摄像机调整至合适位置,然后创建一个CameraMode脚本文件用于控制场景中摄像机的旋转和缩放,脚本挂载到主摄像机上。首先设定需要使用到的各类基本参数。

//控制摄像机的模式
static int mode = 0;

//旋转的目标
public Transform target;

//摄像机
private Camera mCamera;

[Header("鼠标左键 旋转")]
//旋转速度
public float RotateSpeed = 2f;

[Header("鼠标中键 缩放")]
//缩放速度和fov初始值
public float fovSpeed = 20f;
private float fov = 0.0f;

其中模式切换会和后面的功能结合使用,,mode=0时为正常模式。

一、鼠标滚轮控制摄像机fov的缩放

在Start()函数中获取到摄像机的fov,后续会通过代码来修改摄像机的fov值实现鼠标滚轮控制视野的放大和缩小。

void Start()
{
    //获取摄像机初始的fov
    mCamera = GetComponent<Camera>();
    fov = mCamera.fieldOfView;
}

创建一个Zoom()函数,修改摄像机的fov值,通过Input.GetAxis(“Mouse ScrollWheel”)传递鼠标滚轮往上滚还是往下滚的参数,结合之前设定的缩放数值更改fov的值,通过-=实现鼠标上滚放大下滚缩小,随后将更改的值赋予摄像机的fov。

private void Zoom() //摄像机滚轮缩放
{
    //获取鼠标滚轮的滑动量
    fov -= Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * 2000 * fovSpeed;

    //改变相机的 fov
    mCamera.fieldOfView = (fov);
}

在Update()函数中在正常模式下调用Zoom()函数即可实现通过滚轮来进行摄像机的缩放。

void Update()
{
    if (mode == 0)	//当是正常模式时
    {
        //鼠标中键缩放
        Zoom();
    }
}

但此时使用鼠标滚轮时可能会出现场景图像失真的情况,如下图所示。在这里插入图片描述

这时候我们便需要设定fov的上下限来对fov进行限制修正,使fov的变化在正常范围内。

添加两个参数设定fov的最值。

//fov 最大最小角度
public int fovMinLimit = 20;
public int fovMaxLimit = 100;

然后在Zoom()函数中添加一句代码,使用Clamp可将某个值限制为最小值和最大值定义的某个范围内,该句代码的作用就是将fov限制在一段范围内,这样在运行时便不会出现失真现象。

//如果fov小于min,返回fovMinLimit;如果fov大于fovMaxLimit,返回fovMaxLimit;否则返回fov
fov = Mathf.Clamp(fov, fovMinLimit, fovMaxLimit);

二、鼠标左键旋转摄像机进行场景预览

在Update()函数中在正常模式下用两个参数分别存储获取到的鼠标X、Y轴移动,然后进行鼠标左键按下的判断,若按下,则类似于之前摄像机自动旋转的代码,根据之前设定的旋转速度参数来进行旋转。因为RotateAround()函数每次只能修改X轴或Y轴的值,因此连续使用两次该函数来控制摄像机同时在X轴和Y轴进行旋转。

if (mode == 0)	//当是正常模式时
{
	//鼠标中键缩放
    Zoom();

    var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
    var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动

    //鼠标左键旋转
    if (Input.GetMouseButton(0))
    {
        mCamera.transform.RotateAround(target.transform.position, Vector3.up, mouse_x * RotateSpeed);

        mCamera.transform.RotateAround(target.transform.position, transform.right, mouse_y * RotateSpeed);
    }
}

此时脚本中的Target为空,右键Main Camera创建一个名为CameraTarget的空物体,选中该物体,在右侧Inspector面板中点击Transform组件右边的三个点,选择Reset,这样CameraTarget就和Main Camera在同一位置。

将CameraTarget赋值给Target即可。
在这里插入图片描述

技术不精,复刻出来的勉强能看吧。展示

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值