当前位置:首页 > VUE

vue结合threejs实现贴图

2026-02-23 06:00:11VUE

vue结合threejs实现贴图的方法

安装依赖

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

npm install three @vueuse/core

基础场景搭建

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

vue结合threejs实现贴图

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 });

应用贴图到几何体

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

vue结合threejs实现贴图

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实现画布自适应:

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 项目中创建一个登录组件,通常命名为 Login.vue。该组件包含表单元素,如用户名和密码输入框,以及提交按钮。 <template…

vue element实现

vue element实现

Vue Element UI 实现 Vue Element UI 是基于 Vue.js 的组件库,提供丰富的 UI 组件,适合快速开发企业级中后台产品。以下是一些关键实现方法和步骤: 安装 Vue…

vue 实现闪烁

vue 实现闪烁

Vue 实现闪烁效果的方法 方法一:使用 CSS 动画 在 Vue 组件中定义一个闪烁的 CSS 动画,通过绑定 class 或 style 来控制元素的闪烁效果。 <template>…

vue实现表白

vue实现表白

Vue 实现表白页面 使用 Vue 可以快速创建一个动态、交互式的表白页面。以下是一个简单的实现方案: 基础结构 创建一个 Vue 项目或单文件组件,包含以下核心部分: <template&…

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tabl…

vue computed实现

vue computed实现

计算属性的基本用法 在Vue中,计算属性通过computed选项定义,用于声明依赖于其他属性的动态值。计算属性基于它们的依赖进行缓存,只有依赖发生变化时才会重新计算。 new Vue({ da…