首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >three.js中摄像机视场三维边界的确定

three.js中摄像机视场三维边界的确定
EN

Stack Overflow用户
提问于 2016-01-18 21:41:31
回答 1查看 2.2K关注 0票数 5

我有一个three.js场景,并想知道三维边界的视口。

例如,假设我有一个500 is宽1000 is高的画布。我的相机正在观察位置{ 0, 0, 0 }和位置{ 0, 0, 100 }

我的相机永远动不了。

假设我有一个位于{ 0, 0, 0 }的对象。我需要能够将该物体移动到可视区域内的各个点(在摄像机视野内)。我如何计算,比如说,相机视野的左上角?另外,我如何计算20%从左边和10%从相机的视野顶部下降?

这是我的相机对象:

代码语言:javascript
复制
{
    "object": {
        "uuid": "E26C5F88-CD17-45F8-A492-F3DD704949BF",
        "type": "PerspectiveCamera",
        "matrix": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 100, 1],
        "zoom": 1,
        "fov": 50,
        "aspect": 0.625,
        "near": 0.1,
        "far": 1000
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-19 00:53:29

要将对象从左侧放置20%,从顶部向下放置10%,您可以使用如下所示:

代码语言:javascript
复制
var left = 0.2;
var top = 0.1;
var depth = 0.7; // from -1 to 1, depends how far into the scene you want the object, -1 being very close, 1 being the furthest away the camera can see
object.position.set( -1 + 2 * left, 1 - 2 * top, depth ).unproject( camera );

这将从NDC (归一化设备坐标)转换为世界坐标,这些位置都在-1,1的范围内。

它本质上做了以下图像(来源)的反向操作,并将右侧图像(NDC)中的一个点转换回左侧图像(世界坐标):

例如:

代码语言:javascript
复制
var canvas = document.getElementById('canvas');
var scene = new THREE.Scene();
var renderer = new THREE.WebGLRenderer({canvas: canvas, antialias: true});
var camera = new THREE.PerspectiveCamera(45, canvas.clientWidth / canvas.clientWidth, 1, 1000);
var clock = new THREE.Clock();

var geometry = new THREE.BoxGeometry(1, 1, 1);
var material = new THREE.MeshBasicMaterial({color: '#f00', wireframe: true});
var box = new THREE.Mesh(geometry, material);

scene.add(box);

var period = 5;
  
var top = 0.3; // 30%
var left = 0.2; // 20%
var depth = 0.7;

render();

function render() {
  requestAnimationFrame(render);
  
  if (canvas.width !== canvas.clientWidth || canvas.height !== canvas.clientHeight) {
    renderer.setSize(canvas.clientWidth, canvas.clientHeight, false);
    camera.aspect = canvas.clientWidth /  canvas.clientHeight;
    camera.updateProjectionMatrix();
  }
  
  box.position.set(-1 + 2 * left, 1 - 2 * top, depth).unproject(camera);
  box.rotation.y += clock.getDelta() * 2 * Math.PI / period;
  
  renderer.render(scene, camera);
}
代码语言:javascript
复制
html, body, canvas {
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100%;
    display: block;
}
代码语言:javascript
复制
<script src="//cdnjs.cloudflare.com/ajax/libs/three.js/r73/three.min.js"></script>
<canvas id="canvas"></canvas>

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34864578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档