分享
查看: 2147|回复: 0

[分享] 物联网可视化平台ThingJS中camera摄像机操作解析

[复制链接]

物联网可视化平台ThingJS中camera摄像机操作解析

发表于 2020-8-11 17:44:41 来自 分享 阅读模式 倒序浏览
zzv_icon2147 zzr_icon0 查看全部
p>作为一个物联网可视化平台,ThingJS的优点我们就不再赘述,而开发物联网可视化项目,除了场景模型,就是对于摄像机的控制了(ThingJS将渲染封装到了最底层,使得开发人员无需过多了解建模知识,只需要专注于三维场景的开发),ThingJS中的摄像机是camera对象,我们如果是在ThingJS平台中,打印出camera的信息则需要使用到以下代码:

  1. app.camera.log() //在控制台中打印摄像机位置信息
复制代码

摄像机的位置信息以及目标点信息

camera摄像机有position属性以及target属性:

  1. var pos = app.camera.position; //获取摄像机镜头位置
  2. var target = app.camera.target; //获取摄像机目标点位置
  3. console.log(pos +target); //在控制台打印出摄像机镜头位置以及摄像机目标点位置
复制代码

一般我们通过摄像机的 lookAt() 方法,可以让摄像机一直“盯着”某个位置或物体看。

 //摄像机一直“盯着”[0,0,0]点看
 app.camera.lookAt([0, 0, 0]);
 //摄像机一直“盯着”某物体看
 var obj = app.query("car01")[0];app.camera.lookAt(obj);
 //取消摄影机一直盯着物体看
 app.camera.lookAt(null);[/code]

通过摄像机的 fit() 方法,也可以设置摄像机位置。

  1. app.camera.fit({
  2. position: [100, 100, 100],
  3. target: [0, 0, 0]
  4. });
复制代码

如果 fit() 方法中传的是物体对象,那么镜头将“聚焦”到该物体,此时 ThingJS 会计算出该对象的“最佳看点”,从而“自适应”该对象来设置摄像机位置。

  1. //设置摄像机到物体的“最佳看点”
  2. app.camera.fit(obj);
  3. //当不传参数时,设置摄像机到当前整个场景下的“最佳看点”
  4. app.camera.fit();
复制代码
园区&地球摄像机飞行

ThingJS中的摄像机分为在园区使用以及在地球场景中使用,所以对于经常在ThingJS中开发园区场景,突然有一天需要将场景应用在地球上时,就会发现摄像机飞行事件无法使用,这是因为在园区中,我们一般使用 flyTo() 方法,而地球中我们需要使用earthFlyTo()方法。

  1. 园区场景-flyTo()用法:
  2. //从当前摄像机位置飞到指定位置,飞行时间2s,飞行结束后调用回调函数app.camera.flyTo({
  3. position: [0, 20, 20],
  4. target: [-30, 10, 0],
  5. time: 2 * 1000,
  6. complete: function() {
  7. console.log("飞行结束");
  8. }});
  9. //以Quartic.In的插值方式 让飞行速度渐增
  10. app.camera.flyTo({
  11. position: [0, 20, 20],
  12. target: [-30, 10, 0],
  13. time: 3 * 1000,
  14. lerpType: THING.LerpType.Quartic.In});
  15. //飞到物体的最佳视角,默认飞行时间3s
  16. app.camera.flyTo(obj);
  17. //2s飞到物体的最佳视角
  18. app.camera.flyTo({
  19. object: obj,
  20. time: 2 * 1000,
  21. complete: function() {
  22. console.log("飞行结束");
  23. }});
  24. //自定义飞到物体的摄像机位置参数(同fit)
  25. app.camera.flyTo({
  26. object: obj,
  27. xAngle: 30, //绕物体自身X轴旋转角度
  28. yAngle: 60, //绕物体自身Y轴旋转角度
  29. radiusFactor: 3, //物体包围盒半径的倍数
  30. time: 5 * 1000,
  31. complete: function() {
  32. console.log("飞行结束");
  33. }});
  34. // 也可以通过设置距离物体包围盒中心的距离(radius)确定摄像机位置
  35. app.camera.flyTo({
  36. object: obj,
  37. xAngle: 30, //绕物体自身X轴旋转角度
  38. yAngle: 60, //绕物体自身Y轴旋转角度
  39. radius: 3, //距离物体包围盒中心的距离 单位米
  40. time: 5 * 1000,
  41. complete: function() {
  42. console.log("飞行结束");
  43. }});
复制代码

  1. 地球场景-earthFlyTo()用法:
  2. //设置地图中心和相机高度
  3. app.camera.earthFlyTo({
  4. lonlat: [116.372, 39.863],//目标点经纬度
  5. height: 5000,//离地高度
  6. heading: 60,//水平方向角度
  7. pitch: 45//垂直方向角度});
  8. //调整地图视角到地图数据范围
  9. app.camera.earthFlyTo({
  10. lonlat: [116.372, 39.863],//目标点经纬度
  11. height: 5000,//离地高度
  12. heading: 60,//水平方向角度
  13. pitch: 45//垂直方向角度});
  14. //飞到指定位置
  15. app.camera.earthFlyTo({
  16. time: 3000,
  17. lonlat: [116.39, 39.96],
  18. height: 5000,
  19. heading: 90,
  20. pitch: 45,
  21. complete: function () {
  22. console.log('earth fly finished');
  23. }
  24. });
  25. //飞到物体
  26. let geoPolygon = app.query('.GeoPolygon')[0];
  27. app.camera.earthFlyTo({
  28. time: 3000,
  29. object: geoPolygon,
  30. complete: function () {
  31. console.log('earth fly finished');
  32. }
  33. });
  34. //停止地球上的飞行和旋转动作
  35. app.camera.stopEarthFly()
复制代码
摄像机官方示例

ThingJS中有着关于摄像机使用的官方示例,在这里则仅展示摄像机控制这一示例:

  1. /**
  2. * 说明:摄像机控制
  3. * 操作:点击按钮进行摄像机操作,如果需要复位可直接操作鼠标
  4. * 教程:摄像机——>交互控制
  5. * 难度:★★☆☆☆
  6. */
  7. var app = new THING.App({
  8. url: 'https://www.thingjs.com/static/models/storehouse'
  9. });
  10. // 水平移动
  11. new THING.widget.Button('水平右移', function () {
  12. app.camera.move(10, 0);
  13. });
  14. new THING.widget.Button('水平左移', function () {
  15. app.camera.move(-10, 0);
  16. });
  17. // 垂直移动
  18. new THING.widget.Button('垂直上移', function () {
  19. app.camera.move(0, 10);
  20. });
  21. new THING.widget.Button('垂直下移', function () {
  22. app.camera.move(0, -10);
  23. });
  24. // 推进
  25. new THING.widget.Button('向前', function () {
  26. app.camera.zoom(10);
  27. });
  28. new THING.widget.Button('向后', function () {
  29. app.camera.zoom(-10);
  30. });
  31. // 旋转
  32. new THING.widget.Button('水平旋转', function () {
  33. app.camera.rotateAround({
  34. target: app.camera.target,
  35. yRotateAngle: 10,
  36. time: 3000
  37. });
  38. });
  39. new THING.widget.Button('俯仰旋转', function () {
  40. app.camera.rotateAround({
  41. target: app.camera.target,
  42. xRotateAngle: 10,
  43. time: 1000
  44. });
  45. });
复制代码



avatar
游客~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

130700ppkpl8x3t7tt1b1t