当前位置:   article > 正文

Three.js系列:坐标信息_threejs获取模型坐标

threejs获取模型坐标

1. 层级结构

Three.js描述的场景Sence,是一个以Sence为根节点的层级结构,如下图所示。其中Group不是必须的,并且可嵌套的。

遍历方法:traverse()

  1. scene.traverse(function(obj) {
  2. if (obj.type === "Group") {
  3. console.log(obj.name);
  4. }
  5. if (obj.type === "Mesh") {
  6. console.log(obj.name);
  7. }
  8. // 打印id属性
  9. console.log(obj.id);
  10. // 打印该对象的父对象
  11. console.log(obj.parent);
  12. // 打印该对象的子对象
  13. console.log(obj.children);
  14. })

2. 坐标差异

2.1.概念

2.1.1 世界坐标和局部坐标

根据参照物的不同,Three.js将坐标分为世界坐标和本地坐标。

世界坐标

是以Sence为参照进行描述的坐标信息。是由局部坐标加上父级的变化场景:平移(position)、旋转(rotation)、缩放(scale)计算后得出。Three.js中常见的世界坐标有mesh.getWorldPosition()、THREE.Box3()、THREE.Box2()等。

局部坐标

是以父层级为参照进行描述的坐标信息。可以理解成在建模时,基于建模原点生成的一个坐标数据。一般,不明确指明是世界坐标,大多说的是本地坐标信息。Three.js中常见的局部坐标有:mesh。position,geometry.vertices等。

2.1.2 屏幕坐标和世界坐标

在屏幕上,对于用户的操作我们能获取的只能是屏幕坐标。在处理其与Three.js场景进行交互时,我们需要进行屏幕坐标和世界坐标的相互转化。

3. 实战篇

3.1 浏览器屏幕坐标转化成世界坐标

  1. screenToWorld(){
  2. //浏览器屏幕坐标转换成标准屏幕坐标
  3. let pX = (screenPoint.x / this.scene.renderer.domElement.clientWidth) * 2 - 1;
  4. let pY = - (screenPoint.y / this.scene.renderer.domElement.clientHeight) * 2 + 1;
  5. let p = new THREE.Vector3(pX, pY, -1).unproject(this.scene.camera)
  6. return new THREE.Vector2(p.x,p.y);
  7. }

3.2 本地坐标转换成世界坐标

例如,对于mesh几何体的顶点坐标就是基于mesh的本地坐标,只需要加上mesh的世界坐标即可。

  1. // 顶点坐标加上mesh的世界矩阵
  2. var vector = mesh.geometry.vertices[i].clone();
  3. vector.applyMatrix4( mesh.matrixWorld );
  4. // 利用mesh的localToWorld方法
  5. var vector = mesh.position.clone();
  6. mesh.localToWorld( vector );

3.3 获取object的坐标位置

  1. // 获取本地坐标
  2. mesh.position
  3. // 获取世界坐标
  4. worldPosition= new Vector3();
  5. mesh.getWorldPosition(worldPosition);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/96048
推荐阅读
相关标签
  

闽ICP备14008679号