C1——primitives添加gltf并实现旋转、缩放、平移
说在前面:加载和旋转缩放没什么好说的,但是平移还是用些细节要注意的。我也是跳了几天才偶然发现问题。
1.primitives方式加载:
handler.setInputAction(function (evt) {let cartesian = viewer.scene.pickPosition(evt.position);if (Cesium.defined(cartesian)) {let headingPitchRoll = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(0), Cesium.Math.toRadians(0), Cesium.Math.toRadians(0));let modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(cartesian, headingPitchRoll, Cesium.Ellipsoid.WGS84, Cesium.Transforms.eastNorthUpToFixedFrame, new Cesium.Matrix4());let model = viewer.scene.primitives.add(Cesium.Model.fromGltf({url : '../src/data/GLTF/oneBuilding.gltf',modelMatrix : modelMatrix,minimumPixelSize : 128,scale : 1,cull:false,}));}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
2.旋转和缩放(说明一点,我设定的鼠标在3Dtiles上移动点击才可以。向直接在地表点击的话可能需要修改 判断是否是渠道模型 的那句代码)
// 旋转的关键代码
handler.setInputAction(function (evt) {let pickedObject = viewer.scene.pick(evt.position); //判断是否拾取到模型if ( pickedObject ){let m = pickedObject.primitive.modelMatrix;// 带旋转模型的矩阵let rotationM = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(rtaleX)); // rtaleX表示水平方向旋转的度数let newMatrix4 = Cesium.Matrix4.multiplyByMatrix3(m, rotationM, new Cesium.Matrix4());// 计算矩阵4的变换矩阵(在原变换中,累加变换)pickedObject.primitive.modelMatrix = newMatrix4}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);// 调整高度的关键代码
handler.setInputAction(function (evt) {let pickedObject = viewer.scene.pick(evt.position); //判断是否拾取到模型if ( pickedObject ){let oldMatrix = pickedObject.primitive.modelMatrix;// 模型的矩阵let oldCenter = new Cesium.Cartesian3(oldMatrix[12],oldMatrix[13],oldMatrix[14]);// 模型高度调整前中心点笛卡尔坐标let oldCartographic = Cesium.Cartographic.fromCartesian(oldCenter);// 高度调整前的弧度坐标let newHeight = oldCartographic.height+height;let newCartographic = new Cesium.Cartographic( oldCartographic.longitude, oldCartographic.latitude, newHeight ); // 高度调整后的弧度坐标let newCartesian = viewer.scene.globe.ellipsoid.cartographicToCartesian(newCartographic);let headingPitchRoll = new Cesium.HeadingPitchRoll(0,0,0);let m = Cesium.Transforms.headingPitchRollToFixedFrame(newCartesian, headingPitchRoll, Cesium.Ellipsoid.WGS84, Cesium.Transforms.eastNorthUpToFixedFrame, new Cesium.Matrix4());pickedObject.primitive.modelMatrix = m;// 平移变换}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
3平移:这是我写这篇博客的关键。管网demo里升降平移是对3Dtiles,对gltf不一定有效的,我也是愣了几天偶然改正确的,主要就是获取鼠标移动时坐标。
// 移动模型
function moveGltfModel ( ) {let _this = this;let viewer = _this.viewer;let handler = new Cesium.ScreenSpaceEventHandler( viewer.canvas);let pickedObject = null;let leftDownFlag = false;let rtaleX = parseFloat( $("#rangeRtaleX").val() );handler.setInputAction(function (movement) {pickedObject = viewer.scene.pick(movement.position);if(Cesium.defined(pickedObject)){if (pickedObject.primitive.isCesium3DTileset == undefined ){leftDownFlag = true;document.body.style.cursor = 'pointer';viewer.scene.screenSpaceCameraController.enableRotate = false;//锁定相机pickedObject.primitive.color = new Cesium.Color(0, 1, 0, 1); //选中模型后高亮pickedObject.primitive.silhouetteSize = 3.0;//选中模型后高亮}}}, Cesium.ScreenSpaceEventType.LEFT_DOWN);handler.setInputAction(function () {pickedObject.primitive.color = new Cesium.Color(1, 1, 1, 1);pickedObject.primitive.silhouetteSize = 0;leftDownFlag = false;pickedObject = null;viewer.scene.screenSpaceCameraController.enableRotate = true;//解除锁定相机handler.destroy();//销毁左键监听事件document.body.style.cursor = 'default';}, Cesium.ScreenSpaceEventType.LEFT_UP);handler.setInputAction((movement) => {if ( leftDownFlag && pickedObject.primitive.modelMatrix ) {// ************g关键代码:cartesian的值************let ray = viewer.camera.getPickRay(movement.endPosition);let cartesian = viewer.scene.globe.pick(ray, viewer.scene);let headingPitchRoll = new Cesium.HeadingPitchRoll( Cesium.Math.toRadians(0),0,0);let m = Cesium.Transforms.headingPitchRollToFixedFrame(cartesian, headingPitchRoll, Cesium.Ellipsoid.WGS84, Cesium.Transforms.eastNorthUpToFixedFrame, new Cesium.Matrix4());pickedObject.primitive.modelMatrix = m;}}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
}
说明一下:我之前用了好几种获取鼠标坐标导致的结果是移动时会到处跑。但下面这样获取就不会。
// 这样获取就不会到处跑
let ray = viewer.camera.getPickRay(movement.endPosition);
let cartesian = viewer.scene.globe.pick(ray, viewer.scene);//列几种我之前的获取方式会出问题的额
// let headingPitchRoll = new Cesium.HeadingPitchRoll(0,0,0);
// let cartesian = viewer.scene.pickPosition(movement.endPosition);// let headingPitchRoll = new Cesium.HeadingPitchRoll(0,0,0);
// let position = viewer.scene.globe.pick(viewer.camera.getPickRay(movement.endPosition), viewer.scene);// 获取鼠标移动后的点
// let cartesian = new Cesium.Cartesian3( position.x, position.y, position.z )
扩展一下:entity加载的话,直接修改entity的position就可以了
handler.setInputAction(function (movement) {if (leftDownFlag === true && pointDraged != null) {let ray = viewer.camera.getPickRay(movement.endPosition);let cartesian = viewer.scene.globe.pick(ray, viewer.scene);console.log(cartesian);pointDraged.id.position = new Cesium.CallbackProperty(function () {return cartesian;}, false);//防止闪烁,在移动的过程}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
C1——primitives添加gltf并实现旋转、缩放、平移相关推荐
- Unity3D使用鼠标旋转缩放平移视角
Unity使用鼠标旋转缩放平移视角 用代码在Game界面完美实现Scene界面的操作方法. 使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上. 视角跟踪的是一个空物体,当然如果你是做RPG游 ...
- 前端学习:jQuery--轮播图,旋转缩放平移动画,仿华为商城案例
1.火狐浏览器超好用的网页翻译插件 火狐浏览器超好用的网页翻译插件_m0_59805351的博客-CSDN博客_火狐翻译插件哪个好学习目标:自主安装火狐浏览器网页翻译插件学习内容:提示:这里可以添加要 ...
- [cocos2d-x]图层的旋转缩放效果
要实现一个两个图层叠加在一起,然后点击其中的一个图层,实现另外一个图层的旋转缩放的效果. 预期效果: 1.实现两个layer添加在一个场景中. 2.实现点击一个场景能实现另一个场景的旋转缩放的功能. ...
- android 缩放透明动画,Android旋转、平移、缩放和透明度渐变的补间动画
android实现旋转.平移.缩放和透明度渐变的补间动画,具体实现如下: 1.在新建项目的res目录中,创建一个名为anim的目录,并在该目录中创建实现旋转.平移.缩放和透明度渐变的动画资源文件. 透 ...
- three.js使用OrbitControls.js控制几何体旋转、平移、缩放
附带一个可用的OrbitControls.js http://www.yanhuangxueyuan.com/threejs/examples/js/controls/OrbitControls.js ...
- Cesium变换3DTiles的位置(平移旋转缩放)
function add3DTilesetDataTrans(url) { //viewer1.scene.globe.depthTestAgainstTerrain = tr ...
- Unity矩阵平移旋转缩放Matrix4x4
Unity中的矩阵(Matrix4x4) 最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转.平移.缩放.(注意这里本文中的transform组件式基于unity ...
- PixiJS案例——移动旋转缩放
简介: 对于选择的图片进行,移动.旋转.缩放.使用 hammer.js 做拖拽操作. 思路: 使用pixi创建一个canvas 添加一个需要移动的精灵 使用hammer做拖拽.双指旋转和缩放 素材: ...
- 图像中的一条直线在旋转缩放过程中会有分段现象,或产生分段节点
图像中的一条直线在旋转缩放过程中会有分段现象. 图像在Windows照片查看器中打开.显示. 使用滚轮放大缩小. 原来的一条直线会分段. 图像旋转方式:16相位(33端).32 原图: 经旋转45,放 ...
最新文章
- Windows Mobile开发应该选择哪种开发语言?
- 212. Word Search II:多个单词查找
- mysql服务突然丢失解决方案
- python爬虫怎么挣钱_2019如何学Python?这里有你需要的答案
- 为什么我们公司强制弃坑Fastjson了?主推...
- caffe安装系列——综述
- 有效解决RaycastTarget勾选过多的烦恼
- Jquery实战视频教程学习
- 快逸报表传递中文参数乱码解决
- 测试工程师岗位投了300份简历,一份面试邀约都没有。我是不是上了黑名单了?
- 主流手机CPU及机型介绍!手机CPU生产厂商介绍!高通QSD8250、MSM8255、TI OMAP 3630、nVIDIA Tegra 2介绍
- 阿里资深架构师的学习之路
- PX4中的二阶巴特沃斯低通滤波
- unity ,color组件
- 判断类型是否继承_读《Java核心技术》-继承(覆盖、final、强制类型转换、抽象类)...
- 低通,高通,带通,带阻滤波器的定义
- 一行代码制作自己的QQ/微信二维码,还可以制作动态的哟~(小白再也不用去求别人了)
- 数学优化入门:凸优化
- 师徒制,多么好的工具
- 【考研】设计求二叉树 T 的 WPL 算法(2014-408真题)