当前位置: 首页 > article >正文

vue3+three.js加载glb模型

<template>
  <div>
    <!-- 亮度调节滑块 -->
    <div class="controls">
      <label for="brightness">背景光亮度:</label>
      <input
          type="range"
          id="brightness"
          v-model="brightness"
          min="0"
          max="2"
          step="0.1"
      />
      <span>{{ brightness }}</span>
    </div>
  <div ref="container" className="three-container"></div>
  </div>
</template>

<script setup>
import {ref, onMounted, onBeforeUnmount, watch} from 'vue';
import * as THREE from 'three';
import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader.js';
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls.js';

// 定义容器引用
const container = ref(null);

// 定义 Three.js 相关变量
let scene, camera, renderer, controls, model;

// 定义环境光
let ambientLight;

// 定义亮度变量
const brightness = ref(1); // 初始亮度为 1

// 初始化 Three.js 场景
const initThree = () => {
  // 创建场景
  scene = new THREE.Scene();
  scene.background = new THREE.Color(0xffc0cb); // 淡粉色
  // 创建相机
  camera = new THREE.PerspectiveCamera(
      75,
      container.value.clientWidth / container.value.clientHeight,
      0.1,
      1000
  );
  camera.position.set(5, 5, 5);

  // 创建渲染器
  renderer = new THREE.WebGLRenderer({antialias: true});
  renderer.setSize(container.value.clientWidth, container.value.clientHeight);
  container.value.appendChild(renderer.domElement);

  // 添加轨道控制器
  controls = new OrbitControls(camera, renderer.domElement);
  controls.enableDamping = true;

  // 添加环境光
  const ambientLight = new THREE.AmbientLight(0xffffff, brightness.value);
  scene.add(ambientLight);

  renderer.toneMapping = THREE.ACESFilmicToneMapping; // 设置色调映射
  renderer.toneMappingExposure = 1.5; // 增加曝光值

  // 添加平行光
  const directionalLight = new THREE.DirectionalLight(0xffffff, 2);
  directionalLight.position.set(1, 1, 1).normalize();
  scene.add(directionalLight);
};

// 加载 GLB 模型
const loadModel = () => {
  const loader = new GLTFLoader();
  loader.load(
      '/api/demo.glb', // 替换为你的 GLB 文件路径
      (gltf) => {
        model = gltf.scene;
        scene.add(model);
      },
      undefined,
      (error) => {
        console.error('An error happened while loading the model:', error);
      }
  );
};

// 动画循环
const animate = () => {
  requestAnimationFrame(animate);
  controls.update();
  renderer.render(scene, camera);
};

// 监听亮度变化
watch(brightness, (newBrightness) => {
  if (ambientLight) {
    ambientLight.intensity = newBrightness;
  }
});

// 组件挂载时初始化
onMounted(() => {
  initThree();
  loadModel();
  animate();
});

// 组件卸载时清理资源
onBeforeUnmount(() => {
  if (renderer) {
    renderer.dispose();
  }
});
</script>

<style scoped>
.three-container {
  width: 100%;
  height: 100vh;
}
</style>

http://www.kler.cn/a/512405.html

相关文章:

  • 在Windows/Linux/MacOS C++程序中打印崩溃调用栈和局部变量信息
  • pthread_exit函数
  • JavaScript系列(36)--微服务架构详解
  • 如何在龙蜥 OS(AliOS)上安装极狐GitLab?
  • 浅谈安科瑞电能质量监测和治理产品在分布式光伏电站的应用-安科瑞 蒋静
  • 【AI | pytorch】torch.view_as_complex的使用
  • 基于SpringBoot + Mybatis Plus + SaToken + Thymeleaf + Layui的后台管理系统
  • Python基于Django的社区爱心养老管理系统设计与实现【附源码】
  • Cyber Security 101-Security Solutions-Firewall Fundamentals(防火墙基础)
  • Java Web开发高级——Spring Boot与Docker容器化部署
  • 电子电气架构 --- 车载通信诊断
  • 【开源免费】基于SpringBoot+Vue.JS密接者跟踪系统(JAVA毕业设计)
  • 大语言模型增强推荐系统:分类、趋势、应用与未来
  • c# PDF文件合并工具
  • python milvus及curl命令进行query请求
  • Java工程结构:服务器规约(JVM 碰到 OOM 场景时输出 dump 信息、设置tomcat的 JVM 的内存参数、了解服务平均耗时)
  • STM32更新程序OTA
  • 为AI聊天工具添加一个知识系统 之54 为事务处理 设计 基于DDD的一个 AI操作系统 来处理维度
  • npm配置electron专属的淘宝镜像进行安装
  • 2、ansible的playbook
  • MongoDB文档查询
  • PyTorch使用教程(11)-cuda的使用方法
  • Skeleton 骨架屏
  • 【漫话机器学习系列】051.错误类型(Error Type)
  • kafka 学习笔记3-传统部署Kraft模式集群——筑梦之路
  • git 常见问题