当前位置:首页 > VUE

vue结合threejs实现贴图

2026-02-23 06:00:11VUE

vue结合threejs实现贴图的方法

安装依赖

确保项目中已安装threevue-threejs(可选)。通过npm或yarn安装:

npm install three @vueuse/core

基础场景搭建

在Vue组件中初始化Three.js场景、相机和渲染器:

import * as THREE from 'three';
import { onMounted } from 'vue';

export default {
  setup() {
    let scene, camera, renderer;

    onMounted(() => {
      scene = new THREE.Scene();
      camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
      renderer = new THREE.WebGLRenderer({ antialias: true });
      renderer.setSize(window.innerWidth, window.innerHeight);
      document.getElementById('container').appendChild(renderer.domElement);
    });
  }
};

加载纹理贴图

使用THREE.TextureLoader加载图片作为纹理:

const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load('/path/to/texture.jpg');

// 创建带贴图的材质
const material = new THREE.MeshBasicMaterial({ map: texture });

应用贴图到几何体

将材质应用到几何体(如立方体)并添加到场景:

const geometry = new THREE.BoxGeometry();
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.z = 5;

动画循环

通过requestAnimationFrame实现渲染循环:

function animate() {
  requestAnimationFrame(animate);
  cube.rotation.x += 0.01;
  cube.rotation.y += 0.01;
  renderer.render(scene, camera);
}
animate();

响应式处理

使用@vueuse/coreuseResizeObserver实现画布自适应:

vue结合threejs实现贴图

import { useResizeObserver } from '@vueuse/core';

useResizeObserver(document.body, () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
});

进阶优化(可选)

  • 使用THREE.OrbitControls添加交互控制
  • 通过THREE.CubeTextureLoader加载环境贴图
  • 使用THREE.MeshStandardMaterial配合光照实现PBR效果

完整组件示例

<template>
  <div id="container"></div>
</template>

<script setup>
import * as THREE from 'three';
import { onMounted } from 'vue';
import { useResizeObserver } from '@vueuse/core';

let scene, camera, renderer, cube;

onMounted(() => {
  initThree();
  animate();
});

function initThree() {
  // 初始化场景
  scene = new THREE.Scene();

  // 初始化相机
  camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
  camera.position.z = 5;

  // 初始化渲染器
  renderer = new THREE.WebGLRenderer({ antialias: true });
  renderer.setSize(window.innerWidth, window.innerHeight);
  document.getElementById('container').appendChild(renderer.domElement);

  // 加载贴图
  const texture = new THREE.TextureLoader().load('/texture.jpg');
  const material = new THREE.MeshBasicMaterial({ map: texture });

  // 创建立方体
  const geometry = new THREE.BoxGeometry();
  cube = new THREE.Mesh(geometry, material);
  scene.add(cube);

  // 响应式处理
  useResizeObserver(document.body, () => {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
  });
}

function animate() {
  requestAnimationFrame(animate);
  cube.rotation.x += 0.01;
  cube.rotation.y += 0.01;
  renderer.render(scene, camera);
}
</script>

注意事项

  • 贴图文件需放在public目录或通过Webpack配置别名
  • 跨域图片需确保服务器配置CORS或使用代理
  • 性能敏感场景建议使用THREE.CompressedTextureLoader加载压缩纹理

标签: 贴图vue
分享给朋友:

相关文章

vue架构实现

vue架构实现

Vue 架构实现核心方案 Vue.js 的架构实现通常围绕模块化、组件化和状态管理展开。以下为常见实现方案: 基于单文件组件(SFC)的模块化 通过 .vue 文件组织模板、脚本和样式: <…

vue实现节流

vue实现节流

vue实现节流的方法 在Vue中实现节流(throttle)功能,通常用于限制高频事件的触发频率,例如滚动、输入或按钮点击。以下是几种常见的实现方式: 使用Lodash的throttle函数 安装L…

vue多选实现

vue多选实现

Vue 多选实现方法 基础实现(v-model + multiple) 在 Vue 中实现多选可以通过 <select> 元素的 multiple 属性结合 v-model 完成。v-mo…

vue实现ppt

vue实现ppt

Vue 实现 PPT 的功能 Vue 可以结合第三方库或自定义组件实现类似 PPT 的演示效果。以下是几种常见的方法: 使用第三方库 reveal.js reveal.js 是一个流行的演示框架,支…

vue filter 实现

vue filter 实现

在 Vue.js 中,过滤器(Filter)是一种用于文本格式化的功能,可以在模板中直接使用。以下是实现过滤器的详细方法: 全局过滤器注册 通过 Vue.filter 方法注册全局过滤器,可在所有组…

vue拼图实现

vue拼图实现

实现 Vue 拼图游戏的方法 使用 Vue 组件和动态数据绑定 创建一个 Vue 组件来管理拼图的状态和逻辑。通过 v-for 动态渲染拼图块,利用 v-bind 绑定样式和位置。拼图块的数据可以存储…