说在前面:加载和旋转缩放没什么好说的,但是平移还是用些细节要注意的。我也是跳了几天才偶然发现问题。

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并实现旋转、缩放、平移相关推荐

  1. Unity3D使用鼠标旋转缩放平移视角

    Unity使用鼠标旋转缩放平移视角 用代码在Game界面完美实现Scene界面的操作方法. 使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上. 视角跟踪的是一个空物体,当然如果你是做RPG游 ...

  2. 前端学习:jQuery--轮播图,旋转缩放平移动画,仿华为商城案例

    1.火狐浏览器超好用的网页翻译插件 火狐浏览器超好用的网页翻译插件_m0_59805351的博客-CSDN博客_火狐翻译插件哪个好学习目标:自主安装火狐浏览器网页翻译插件学习内容:提示:这里可以添加要 ...

  3. [cocos2d-x]图层的旋转缩放效果

    要实现一个两个图层叠加在一起,然后点击其中的一个图层,实现另外一个图层的旋转缩放的效果. 预期效果: 1.实现两个layer添加在一个场景中. 2.实现点击一个场景能实现另一个场景的旋转缩放的功能. ...

  4. android 缩放透明动画,Android旋转、平移、缩放和透明度渐变的补间动画

    android实现旋转.平移.缩放和透明度渐变的补间动画,具体实现如下: 1.在新建项目的res目录中,创建一个名为anim的目录,并在该目录中创建实现旋转.平移.缩放和透明度渐变的动画资源文件. 透 ...

  5. three.js使用OrbitControls.js控制几何体旋转、平移、缩放

    附带一个可用的OrbitControls.js http://www.yanhuangxueyuan.com/threejs/examples/js/controls/OrbitControls.js ...

  6. Cesium变换3DTiles的位置(平移旋转缩放)

    function add3DTilesetDataTrans(url) {             //viewer1.scene.globe.depthTestAgainstTerrain = tr ...

  7. Unity矩阵平移旋转缩放Matrix4x4

    Unity中的矩阵(Matrix4x4) 最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转.平移.缩放.(注意这里本文中的transform组件式基于unity ...

  8. PixiJS案例——移动旋转缩放

    简介: 对于选择的图片进行,移动.旋转.缩放.使用 hammer.js 做拖拽操作. 思路: 使用pixi创建一个canvas 添加一个需要移动的精灵 使用hammer做拖拽.双指旋转和缩放 素材: ...

  9. 图像中的一条直线在旋转缩放过程中会有分段现象,或产生分段节点

    图像中的一条直线在旋转缩放过程中会有分段现象. 图像在Windows照片查看器中打开.显示. 使用滚轮放大缩小. 原来的一条直线会分段. 图像旋转方式:16相位(33端).32 原图: 经旋转45,放 ...

最新文章

  1. Windows Mobile开发应该选择哪种开发语言?
  2. 212. Word Search II:多个单词查找
  3. mysql服务突然丢失解决方案
  4. python爬虫怎么挣钱_2019如何学Python?这里有你需要的答案
  5. 为什么我们公司强制弃坑Fastjson了?主推...
  6. caffe安装系列——综述
  7. 有效解决RaycastTarget勾选过多的烦恼
  8. Jquery实战视频教程学习
  9. 快逸报表传递中文参数乱码解决
  10. 测试工程师岗位投了300份简历,一份面试邀约都没有。我是不是上了黑名单了?
  11. 主流手机CPU及机型介绍!手机CPU生产厂商介绍!高通QSD8250、MSM8255、TI OMAP 3630、nVIDIA Tegra 2介绍
  12. 阿里资深架构师的学习之路
  13. PX4中的二阶巴特沃斯低通滤波
  14. unity ,color组件
  15. 判断类型是否继承_读《Java核心技术》-继承(覆盖、final、强制类型转换、抽象类)...
  16. 低通,高通,带通,带阻滤波器的定义
  17. 一行代码制作自己的QQ/微信二维码,还可以制作动态的哟~(小白再也不用去求别人了)
  18. 数学优化入门:凸优化
  19. 师徒制,多么好的工具
  20. 【考研】设计求二叉树 T 的 WPL 算法(2014-408真题)

热门文章

  1. 全国计算机三级网络工程技术复习笔记4
  2. 大一作业HTML网页作业:中华传统文化题材网页设计(纯html+css实现)科普网
  3. 注册aws账号创建ec2免费套餐
  4. Netgear R6400v2 堆溢出漏洞分析与利用
  5. SqlServer中的dbo是什么意思?
  6. Python入门学习(五)
  7. 微型计算机字,小型微型计算机系统
  8. linux 支持7代cpu,Intel第七代cpu有哪些型号
  9. 微信IOS navigator.getUserMedia undefined
  10. C语言编程习惯和修养