最近在做的项目中遇到需要保存当前的3d管道视角设置的问题,用户希望在对3d场景内的管道进行了缩放、旋转、移动之后可以将场景当前的视角状态保存在数据库中,并在下次加载时读取。 经过不断的尝试和研究,在同事的帮助下总算完成,下面说一下注意事项并附上实现代码。

首先,经过测试保存视角取决于两个部分,一个是camera这个超大的js对象,另一个就是右键平移执行的操作在controls中(开发中使用的是TrackballControls.js)。

先来说camera这个对象参数非常多,详细参数不再做说明,大家可以直接参考Three.js的 camera定义部分的源码,主要有up(相机的z坐标方向)、position(相机位置)、rotation(相机旋转,里面又包含_quaternion)、scale(比例),除了这些之外还有matrix、matrixWorld、matrixWorldInverse、projectionMatrix这几4×4的矩阵,另外还有far、aspect、near参数。这些因素共同决定了相机的视角。要逐个保存这些数据是一项相当繁琐的工作,因此我们想办法将这些对象合并成一个json字符串并在读取时将它们反转。

首先考虑的自然是 JSON.stringify() ,使用该方法转字符串的时候在谷歌浏览器下提示 循环引用的对象(貌似是谷歌的BUG,FF下应该是正常的未测试),因此无法转换,找了一下相关文章发现该方法可以传递一个自定义函数进来,避免循环对象的引用。如下所示

var tc = camera.clone();
var cache = [];
var pdata = JSON.stringify(tc, function(key, value) {
if (typeof value === 'object' && value !== null) {
if (cache.indexOf(value) !== -1) {
// Circular reference found, discard key
return;
}
// Store value in our collection
cache.push(value);
}
return value;
});
cache = null; // Enable garbage collection

这样就可以将camera的参数保存为一个json字符串形式从而可以保存到数据库中。

对于平移的保存,查看TrackballControls.js文件即可找到 控制平移的参数为 controls.target 为一个THREE.Vector3的向量类型,那很轻易的就可以将其保存,如下所示我们将上面的camera和controls.target合并为一个JSON字符串并保存到数据库中即可。

var target0 = controls.target.clone();
var ptarget = JSON.stringify(target0);
pdata = '{"cam":'+pdata+',"ctrl":'+ptarget+'}';

上面的方式一般都可以想得到,关键是如何将这个json字符串读取出来并完整的赋值给新的camera对象。

我们使用ajax读取后,并将其反转为JSON对象即  :

var r = JSON.parse(d.angleView);  //d.angleView为数据库中读取出来的视角字符串参数

//关键在这里,使用jquery的extend方法合并相机参数与反转过来的json对象,其中的camera为全局的camera对象,页面初始化时已经定义,此处clone是新生成一个对象,因为camera的赋值均为引用赋值非直接赋值,类似传址
var tcamera = $.extend(true, {}, camera.clone(), r.cam);
var tctrl = new THREE.Vector3(r.ctrl.x,r.ctrl.y,r.ctrl.z); camera = tcamera.clone();
controls = new THREE.TrackballControls(camera, renderer.domElement); //重新为相机加载控制器
camera.updateProjectionMatrix(); //更新相机 controls.target.copy(tctrl);//更新控制器的中心点 copy方法可以在TrackballControls.js中找到

这样 我们就完整的实现了保存相机视角的功能。

Three.js 保存camera(视角)设置到数据库,包括场景的缩放、旋转、移动等的更多相关文章

  1. 如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量

    概述: 本地化是系统或软件运行的语言和文化环境.设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式. NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用 ...

  2. 入门系列之在Ubuntu上使用MySQL设置远程数据库优化站点性能

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由苏子晨 发表于云+社区专栏 介绍 随着您的应用程序或网站的增长,您可能已经超出了当前的服务器设置.如果您在同一台计算机上托管Web服务 ...

  3. 【Unity3D】使用鼠标键盘控制Camera视角(即时战略类游戏视角):缩近,拉远,旋转

    今天写一个demo,要用到鼠标键盘控制三维视角,因此写了个脚本用于控制. 该脚本可以用于即时战略类游戏的视角,提供了缩进,拉伸,旋转.同时按住鼠标右键不放,移动鼠标可以实现第一人称视角的效果. usi ...

  4. html5获取经纬度,百度api获取街区名,并使用JS保存进cookie

    引用js<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak= ...

  5. php中关于js保存文件至本地的问题

    最近在搞一个livezilla的在线客服聊天的东东,客户界面要求添加一个下载聊天记录的功能.于是我就是翻看了下网上的各种关于”js保存文件至本地“的资料,发现只能在IE下通过execCommand实现 ...

  6. ECMALL目录结构设置与数据库表

    [Ecmall]ECMALL目录结构设置与数据库表   最近在做ecmall的开发,ecmall在开源方面还有待进步啊,官方没有提供开发文档,也没有关于系统架构组织的贡献,使用者都要自己从0开始,官方 ...

  7. js 判断js函数、变量是否存在 JS保存和删除cookie操作,判断cookie是否存在的方法

    //是否存在指定函数 function isExitsFunction(funcName) {    try {        if (typeof(eval(funcName)) == " ...

  8. Android 保存用户偏好设置

    很多情况下都允许用户根据自己的习惯和爱好去设置软件,而我们需要保存这些设置,可以用一个专业保存用户偏好的类:SharedPreferences. 这个类是实现方法其实也就是创建和修改 XML 文件, ...

  9. 程序启动读取和关闭时保存应用程序设置(QSettings)

    保存应用程序设置(QSettings)1. QSettings 类 QSettings 提供保存应用程序当前设置的接口,可以方便地保存程序的状态,例如窗口大小和位置,选项的选中状态等等.在 Windo ...

随机推荐

  1. JDFS:一款分布式文件管理系统,第五篇(整体架构描述)

    一 前言 截止到目前为止,虽然并不完美,但是JDFS已经初步具备了完整的分布式文件管理功能了,包括:文件的冗余存储.文件元信息的查询.文件的下载.文件的删除等.本文将对JDFS做一个总体的介绍,主要是 ...

  2. java数据库编程之数据库的设计

    第一章:数据库的设计 1.1:为什么需要规范数据库的设计 1.1.1:什么是数据库设计 数据库设计就是将数据中的数据实体及这些数据实体之间的关系,进行规范和结构的过程. 1.1.2:数据库设计非常重要 ...

  3. 监控利器 sysdig - 每天5分钟玩转 Docker 容器技术(79)

    sysdig 是一个轻量级的系统监控工具,同时它还原生支持容器.通过 sysdig 我们可以近距离观察 linux 操作系统和容器的行为. Linux 上有很多常用的监控工具,比如 strace,tc ...

  4. 关于Android SDK Manager无法获取更新列表的正确设置

    1.以"管理员身份运行"SDK Manager. 2.Android SDK Manager"=>"Tools"=>"Optio ...

  5. Cookie同域,跨域单点登录

    Cookie 同域单点登录 最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录. 单点登 ...

  6. Echarts数据可视化radar雷达坐标系,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  7. mac 通过brew安装php70 +php-fpm+ phalcon3.0.3

    安装php7.0.15 brew install homebrew/php/php70 brew install homebrew/php/php70-mcrypt brew install home ...

  8. FastDFS分布式文件系统

    FastDFS分布式文件系统 阅读目录 相关文章 1 分布式文件系统介绍 2 系统架构介绍 3 FastDFS性能方案 4 Linux基本命令操作 5 安装VirtualBox虚拟机并配置Ubuntu ...

  9. C#使用互斥量(Mutex)实现多进程并发操作时进程间的同步操作(进程同步)

    本文主要是实现操作系统级别的进程同步的代码及测试结果,代码经过测试,可直接使用,也可供参考. 承接上一篇博客的业务场景[C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题]. 随着服务进 ...

  10. java中集合类HashSet、ArrayList、LinkedList总结

    [HashSet] 1. HashSet存储不能够存储相同的元素,元素是否相同的判断:重写元素的equals方法.equals方法和hashCode方法必须兼容,如:equals方法判断的是用户的名字 ...