THREE.JS:从3D透视场景转换为2D正交平视场景

布吉奇林

使用透视相机和使用正交相机设置的2D HUD,我在3D场景中有物体(很远):

this.scene = new THREE.Scene();
this.hud = new THREE.Scene();

this.camera = new THREE.PerspectiveCamera( 30, aspect, front, back );
this.camera.position.set(0,0,0);

this.hudCamera = new THREE.OrthographicCamera (-this.windowHalfX,this.windowHalfX, this.windowHalfY, -this.windowHalfY, 1, 10);
this.hudCamera.position.set(0,0,10);

这是我的渲染循环:

  updateFrame : function () {
    this.renderer.clear();
    this.renderer.render( this.scene, this.camera );
    this.renderer.clearDepth();
    this.renderer.render( this.hud, this.hudCamera );
  },

如何使用3D场景中的对象找到HUD中对象的位置?

布吉奇林

为了找到一个3D对象的2D HUD位置(使用three.js所版本R71),你可以做到以下几点,我从修改这篇文章

  findHUDPosition : function (obj) {
      var vector = new THREE.Vector3();

      obj.updateMatrixWorld();
      vector.setFromMatrixPosition(obj.matrixWorld);
      vector.project(this.camera);

      vector.x = ( vector.x * this.windowHalfX );
      vector.y = ( vector.y * this.windowHalfY );

      return {
          x: vector.x,
          y: vector.y,
          z: vector.z
      }
  }

该参数obj是您要在平铺中查找位置的对象。

vector.project(this.camera);this.camera通过near相机平面从对象绘制矢量到的位置

vector的分量的新值是投影向量和this.camera的近平面的交点。

坐标虽然在three.js的世界坐标系中,所以我们必须快速转换为像素坐标,以放大到画布的大小。

  vector.x = ( vector.x * this.windowHalfX );
  vector.y = ( vector.y * this.windowHalfY );

上面的转换是针对HUD坐标系在屏幕中心具有原点(0,0),并且最大值是画布分辨率的一半的设置。例如,如果您的画布是1024 x 768像素,则右上角的位置将是(512,384)。

对于典型的屏幕坐标系,右下角为(1024,768),屏幕中间为(512,384)。有此设置,您可以使用下面的转换,如在这个岗位

    vector.x = ( vector.x * widthHalf ) + widthHalf;
    vector.y = - ( vector.y * heightHalf ) + heightHalf;

注意,因为我们处于2D状态,所以z坐标现在不再重要。

您要做的最后一件事是确保您要在2D中显示的对象实际上对透视相机可见。这就像检查对象是否落在的视锥中一样简单this.camera以下代码的来源

checkFrustrum : function (obj) {
    var frustum = new THREE.Frustum();
    var projScreenMatrix = new THREE.Matrix4();

    this.camera.updateMatrix();
    this.camera.updateMatrixWorld();

    projScreenMatrix.multiplyMatrices( this.camera.projectionMatrix, this.camera.matrixWorldInverse );

    frustum.setFromMatrix( new THREE.Matrix4().multiplyMatrices( this.camera.projectionMatrix,
                                                     this.camera.matrixWorldInverse ) );
    return frustum.containsPoint ( obj.position );
}

如果不这样做,则可以将位于摄像机后面的对象注册为在2D场景中可见(这会给对象跟踪带来麻烦)。更新obj的matrix和matrix world也是一个好习惯

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

THREE.JS:从3D透视场景转换为2D正交平视场景

来自分类Dev

如何在three.js中确定相机视场的3D边界

来自分类Dev

Three.js使用正交相机将2D映射到3D

来自分类Dev

拖动以更改Three.js场景中3D模型对象的位置

来自分类Dev

使用three.js在3D场景中绘制不规则水

来自分类Dev

Three.js:如何将场景的2D SnapShot制成JPG图像?

来自分类Dev

如何在Three.js场景上放置2D文本?

来自分类Dev

THREE.js使正交摄影机适合场景

来自分类Dev

将“视场”值转换为CSS3D透视值

来自分类Dev

将SVG组转换为3D形状| 用Three.js增加厚度

来自分类Dev

如何将图像转换为3D对象-three.js

来自分类Dev

Three.js 3D球面看起来像2D

来自分类Dev

使用three.js从2D旋转到3D

来自分类Dev

如何在three.js中从BufferGeometry绘制2D/3D网格

来自分类Dev

将Three.js场景旋转转换为极坐标?

来自分类Dev

Three js 3D rotation

来自分类Dev

如何清除THREE.JS场景

来自分类Dev

无法获得场景以Three.js呈现

来自分类Dev

在画布中渲染Three.js场景

来自分类Dev

场景中的静态对象-Three.js

来自分类Dev

Three.js获得场景的中心

来自分类Dev

Three.js 2D X,Y坐标始终位于镜头前的3D X,Y,Z坐标

来自分类Dev

Unity3D-在2D场景中嵌入3D场景

来自分类Dev

在three.js中将Point3D转换为Screen2D会得到错误的结果

来自分类Dev

无法添加到场景 - 伪造查看器。错误:“THREE.Object3D.add:对象不是 THREE.Object3D 的实例。”

来自分类Dev

three.js 3d模型作为超链接

来自分类Dev

Three.js中的多种3D声音

来自分类Dev

Three.js 3D文字弯曲

来自分类Dev

在THREE.js中绘制3d边界框