当前位置:首页 > 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 的模板语法创建注册表单,包含用户名、邮箱、密码和确认密码字段。表单需绑定 v-model 实现双向数据绑定。 <template>…

vue实现发送值接受值

vue实现发送值接受值

Vue 实现父子组件传值 父组件向子组件传值(props) 父组件通过 v-bind 或简写 : 向子组件传递数据。子组件通过 props 接收数据。 父组件代码: <template&g…

vue实现文章锚点定位

vue实现文章锚点定位

实现文章锚点定位的方法 在Vue中实现文章锚点定位可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML锚点 通过HTML的id属性和<a>标签的href属性实现锚点跳转。在Vu…

vue实现标签

vue实现标签

Vue 实现标签的方法 在 Vue 中实现标签功能可以通过多种方式完成,以下是几种常见的方法: 使用动态组件 动态组件可以根据不同的条件渲染不同的标签内容。通过 :is 属性动态绑定组件名,实现标签…

vue实现浮标

vue实现浮标

Vue 实现浮动按钮(浮标) 使用 Vue 实现浮动按钮可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 定位和 Vue 组件 创建 Vue 组件并配合 CSS 固定定位实现浮动按钮:…

vue实现CRUD

vue实现CRUD

Vue 实现 CRUD 操作 Vue 提供了响应式数据绑定和组件化开发能力,结合后端 API 可以轻松实现 CRUD(增删改查)功能。以下是基于 Vue 3 和 Axios 的完整实现方案。 安装依…