threejs 相机渲染范围、位置和目标

threejs yekong 255℃

今天学习相机的渲染范围,位置和目标。

threejs版本选择

"three": "^0.154.0",

在场景中添加多个物体

之前我们学习了通过Three.js实现一个基础渲染代码,今天我们在之前的代码基础上,添加三个物体

在场景中添加多个物体

我们在场景中添加了一个椭圆体 正方体 以及圆柱体

添加一个立方体

通过下面的代码,我们添加了一个长宽高都是100的立方体

  // 立方体网格模型
var geometry1 = new THREE.BoxGeometry(100, 100, 100);
var material1 = new THREE.MeshLambertMaterial({
color: 0x0000ff
}); //材质对象Material
var mesh1 = new THREE.Mesh(geometry1, material1); //网格模型对象Mesh
scene.add(mesh1); //网格模型添加到场景中

添加一个球体

使用SphereGeometry添加球体,可以通过threejs SphereGeometry球体几何体,进一步了解此方法。

// 球体网格模型
var geometry2 = new THREE.SphereGeometry(60, 40, 40);
var material2 = new THREE.MeshLambertMaterial({
color: 0xff00ff
});
var mesh2 = new THREE.Mesh(geometry2, material2); //网格模型对象Mesh
mesh2.translateY(230); //球体网格模型沿Y轴正方向平移230
scene.add(mesh2);

添加一个圆柱体

使用CylinderGeometry方法来创建圆柱体,threejs CylinderGeometry 圆柱体几何体方法介绍及使用

// 圆柱网格模型
var geometry3 = new THREE.CylinderGeometry(50, 50, 100, 25);
var material3 = new THREE.MeshLambertMaterial({
color: 0xffff00
});
var mesh3 = new THREE.Mesh(geometry3, material3); //网格模型对象Mesh
// mesh3.translateX(120); //球体网格模型沿X轴正方向平移120
mesh3.position.set(120,0,0);//设置mesh3模型对象的xyz坐标为120,0,0
scene.add(mesh3);

演示实例地址

在场景中添加多个物体

相机显示范围控制

我们可以设置系数来控制相机的渲染范围,系数越大,显示的范围也越大。

/**
* 相机设置
*/
var width = rendererDom.value.clientWidth; //窗口宽度
var height = rendererDom.value.clientHeight; //窗口高度
var k = width / height; //窗口宽高比
var s = 200; //三维场景显示范围控制系数,系数越大,显示的范围越大
// var s = 90;//渲染范围更小,立方体占据屏幕cavnas画布比例更大,超出渲染范围的球体被剪裁掉
//创建相机对象
var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
camera.position.set(200, 300, 200); //设置相机位置
camera.lookAt(scene.position); //设置相机方向(指向的场景对象)

相机显示范围

范围控制系数调整效果

我们来使用gui来调整相机的显示范围 近裁截面 远裁截面

// 添加 GUI 控制器并设置标题
const sController = gui.add(controls, 's', 100, 300).onChange(value => {
// 当 GUI 控制值改变时,更新相机和渲染器
camera.left = -value * camera.aspect;
camera.right = value * camera.aspect;
camera.top = value;
camera.bottom = -value;
camera.updateProjectionMatrix();
renderer.setSize(rendererDom.value.clientWidth, rendererDom.value.clientHeight);
});
sController.name('显示范围');

const nearController = gui.add(controls, 'near', 0, 1000).onChange(value => {
// 当 GUI 控制值改变时,更新相机和渲染器
camera.near = value;
camera.updateProjectionMatrix();
renderer.setSize(rendererDom.value.clientWidth, rendererDom.value.clientHeight);
});
nearController.name('近裁截面');

const farController = gui.add(controls, 'far', 0, 1000).onChange(value => {
// 当 GUI 控制值改变时,更新相机和渲染器
camera.far = value;
camera.updateProjectionMatrix();
renderer.setSize(rendererDom.value.clientWidth, rendererDom.value.clientHeight);
});
farController.name('远裁截面');

这里我们通过gui来控制范围系数,通过拖动进度条,我们可以看到范围系数对相机范围的影响。

范围控制系数调整效果

移动相机的位置

移动相机的位置

我们来使用gui来控制相机的坐标,以便于更直观的查看相机在x y z 三个坐标轴上位置变化后的效果。

// 监听相机位置 x 坐标的控制器值变化
const cameraXController = gui.add(controls, 'cameraX', 1, 1000);
cameraXController.name('相机 X 坐标');
cameraXController.onChange(value => {
camera.position.x = value;
});

// 监听相机位置 y 坐标的控制器值变化
const cameraYController = gui.add(controls, 'cameraY', 1, 1000);
cameraYController.name('相机 Y 坐标');
cameraYController.onChange(value => {
camera.position.y = value;
});

// 监听相机位置 z 坐标的控制器值变化
const cameraZController = gui.add(controls, 'cameraZ', 1, 1000);
cameraZController.name('相机 Z 坐标');
cameraZController.onChange(value => {
camera.position.z = value;
});

相机位置

相机指向

camera.lookAt也就是我们的眼睛看向哪里,这里我们通过gui来控制坐标查看效果。

// 监听 lookAt 目标 x 坐标的控制器值变化
const lookAtXController = gui.add(controls, 'lookAtX', -500, 500);
lookAtXController.name('lookAt 目标 X 坐标');
lookAtXController.onChange(value => {
camera.lookAt(new THREE.Vector3(value, controls.lookAtY, controls.lookAtZ));
});

// 监听 lookAt 目标 y 坐标的控制器值变化
const lookAtYController = gui.add(controls, 'lookAtY', -500, 500);
lookAtYController.name('lookAt 目标 Y 坐标');
lookAtYController.onChange(value => {
camera.lookAt(new THREE.Vector3(controls.lookAtX, value, controls.lookAtZ));
});

// 监听 lookAt 目标 z 坐标的控制器值变化
const lookAtZController = gui.add(controls, 'lookAtZ', -500, 500);
lookAtZController.name('lookAt 目标 Z 坐标');
lookAtZController.onChange(value => {
camera.lookAt(new THREE.Vector3(controls.lookAtX, controls.lookAtY, value));
});

相机指向

视频教程地址

今天学习视频教程 《WebGL/Three.js前端高薪3D可视化》-大屏3D地图可视化- 相机渲染范围、位置和目标

地图Web3D可视化-WebGL/Three.js

实例代码下载

当前学习笔记演示实例代码

项目运行环境 vue3 vite js nodejs 14

相关文件下载地址
此资源需支付 ¥1 后下载
支付宝购买扫右侧红包码购买更优惠,如无法下载请联系微信:17331886870
喜欢 (1)
threejs 相机渲染范围、位置和目标