此篇将threeJs相机的应用做一下记录,简略的封装为vue组件,以备参考。
之后缓缓欠缺此文。

一、立方相机cubeCamera

cubeCamera,结构一个蕴含6个PerspectiveCameras(透视摄像机)的立方摄像机,并将其拍摄的场景渲染到一个WebGLCubeRenderTarget上,生成指标纹理(WebGLCubeRenderTarget.texture)。
render target是一个缓存,缓存显卡为正在后盾渲染的场景绘制的像素。被用于不同的成果,例如用在一个图像渲染到屏幕上之前先做一些前期解决。
此处,将WebGLCubeRenderTarget.texture作为某个具备envMap属性材质的模型的环境贴图,即此模型反射的环境图案。

CubeCamera.vue

<template>  <div>    <div id="canvasContainer" style="width: 900px; height: 800px"></div>  </div></template><script setup>import { onMounted } from 'vue'import * as THREE from 'three'import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'let scene, camera, renderer, width, height, controlsonMounted(() => {  init()})function init() {  const canvasContainer = document.querySelector('#canvasContainer')  width = canvasContainer.clientWidth  height = canvasContainer.clientHeight  // 1、创立场景  scene = new THREE.Scene()    // 2、创立渲染器    renderer = new THREE.WebGLRenderer()  // renderer.setClearColor('#FFFFFF') // 设置渲染器的背景色  renderer.setClearColor('#88b4e1')  renderer.setSize(width, height) // 设置渲染区域尺寸    canvasContainer.appendChild(renderer.domElement) // 将渲染器创立的canvas元素增加到容器元素    // 3、创立透视相机,用于拍摄主场景  camera = new THREE.PerspectiveCamera(fov, width / height, 0.1, 1000)  camera.position.set(100, 50, 200) // 设置相机地位  camera.lookAt(scene.position) // 设置相机方向(指向的场景对象)   // 4、创立立方相机  cubeCamera() // 为具备镜面反射成果的模型A拍摄反射的图形,而后作为A的环境贴图  // 要先创立renderer, 因为cubeCamera.update(renderer, scene)    // 5、其余  pointLight() // 点灯光  initControls() // 用鼠标管制透视相机的拍摄角度  axisHelper() // 坐标辅助器  animate() }// 循环动画渲染function animate() {  requestAnimationFrame(animate)  renderer.render(scene, camera)}// 轨道控制器,使得相机围绕指标进行轨道静止function initControls() {  controls = new OrbitControls(camera, renderer.domElement)}// 辅助三维坐标系function axisHelper() {  const axis = new THREE.AxesHelper(250)  scene.add(axis)}// 创立一个虚构的球形网格Mesh的辅助对象来模仿点光源PointLightfunction pointLight() {  const pointLight = new THREE.PointLight(0xffffff, 1, 1000)  pointLight.position.set(100, 150, 100)  //点光源地位  scene.add(pointLight)  // 创立点光源辅助对象模仿点光源  const pointLightHelper = new THREE.PointLightHelper(pointLight, 1)  scene.add(pointLightHelper)}let sphere, box// 创立立方相机function cubeCamera() {  // 创立cube相机的渲染指标  const cubeRenderTarget = new THREE.WebGLCubeRenderTarget(128, {    format: THREE.RGBAFormat,    generateMipmaps: true,     minFilter: THREE.LinearMipmapLinearFilter   });    // 创立cube相机  const cubeCamera = new THREE.CubeCamera(1, 100000, cubeRenderTarget)  scene.add(cubeCamera)    // 创立具能反射环境的模型  const sphereGeometry = new THREE.SphereGeometry(50)  const sphereMaterial = new THREE.MeshPhongMaterial({    color: 0xff0000,     envMap: cubeRenderTarget.texture   });  sphere = new THREE.Mesh(sphereGeometry, sphereMaterial)  sphere.position.set(80, -50, 0)  scene.add(sphere)    // 创立被反射的模型  const boxGeometry = new THREE.BoxGeometry(20, 20, 20)  const boxMaterial = new THREE.MeshPhongMaterial({    color: 0x00ff00   })  box = new THREE.Mesh(boxGeometry, boxMaterial)  box.position.set(80, 100, 0)  scene.add(box)    // 更新渲染指标对象  sphere.visible = false  cubeCamera.position.copy(sphere.position)  cubeCamera.update(renderer, scene)  // 能够渲染场景了  sphere.visible = true}</script>

效果图: