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

3D人物建模与WebGL渲染实战

一、建模

模型地址:https://models.readyplayer.me/685a49eb55c53bb7dad7a44a.glb
创建模型的工具: Ready Player Me - Create a Full-Body 3D Avatar From a Photo
我使用以上工具临时创建了一个3D人物,有想法的自行去尝试一下。
在这里插入图片描述

二、渲染模型

实现:渲染器(WebGLRenderer)和加载 GLTF 模型的方法

在这里插入图片描述

完整代码

<template><div class="peopleModel" id="peopleModel"></div>
</template><script setup>
import { nextTick, onMounted } from "vue";
import * as THREE from "three";
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";let scene, camera, renderer, model, controls, amlight, light, pointLight;
let boxWidth, boxHeight;function init() {// 获取容器宽高boxWidth = document.querySelector("#peopleModel").clientWidth;boxHeight = document.querySelector("#peopleModel").clientHeight;// 创建场景scene = new THREE.Scene();//   背景颜色scene.background = new THREE.Color(0xffffff);// 添加环境光、平行光和点光源amlight = new THREE.AmbientLight(0xffffff, 1); // 环境光scene.add(amlight); // 将环境光添加到场景中light = new THREE.DirectionalLight(0xffffff, 2); // 增强平行光的强度// 添加一个点光源pointLight = new THREE.PointLight(0xffffff, 2, 100); // 点光源:颜色强度,最大光照范围// 创建相机camera = new THREE.PerspectiveCamera(5, boxWidth / boxHeight, 0.1, 1000); //参数:视角,宽高比,近截面,远截面camera.position.set(0, 1, 5); // 适当设置相机位置// 创建渲染器renderer = new THREE.WebGLRenderer();renderer.setSize(boxWidth, boxHeight);document.querySelector("#peopleModel").appendChild(renderer.domElement);// 加载 GLB 模型---员工模型const loader = new GLTFLoader();loader.load(new URL("../assets/json/user.glb", import.meta.url).href,(gltf) => {model = gltf.scene; // 获取模型scene.add(model); // 将模型添加到场景中model.position.set(0, -1.5, 0); // 调整模型位置// 遍历模型的所有网格,设置材质model.traverse((child) => {if (child.isMesh) {child.material = new THREE.MeshPhysicalMaterial({color: child.material.color.getHex(), // 保持原有的颜色: 使用 getHex() 方法获取十六进制颜色值roughness: 0.67, // 设置材质的粗糙度roughnessMap: child.material.roughnessMap, // 使用原有的粗糙度贴图metalness: 0, // 设置材质的金属度map: child.material.map, // 如果有纹理贴图也需要传递});}});camera.lookAt(model.position); // 在模型加载后调整相机视角//   设置点光源的位置正对模型pointLight.position.set(model.position.x,model.position.y,model.position.z);scene.add(pointLight); // 将点光源添加到场景中light.position.set(model.position.x, model.position.y + 3, -model.position.z + 4); // 调整平行光的位置scene.add(light);},undefined,(error) => {console.error("Error loading GLTF model:", error);});// 创建辅助坐标系const axesHelper = new THREE.AxesHelper(150);// scene.add(axesHelper);// 初始化OrbitControlscontrols = new OrbitControls(camera, renderer.domElement);controls.enableDamping = true;controls.dampingFactor = 0.05;
}function animate() {requestAnimationFrame(animate);if (model) {// model.rotation.y += 0.01; // 增加一些旋转效果}controls.update(); // 更新控制器renderer.render(scene, camera);
}onMounted(() => {nextTick(() => {init();animate();});
});// 响应式窗口变化
window.onresize = function () {boxWidth = document.querySelector("#peopleModel").clientWidth;boxHeight = document.querySelector("#peopleModel").clientHeight;renderer.setSize(boxWidth, boxHeight);camera.aspect = boxWidth / boxHeight;camera.updateProjectionMatrix();
};
</script>
<style scoped>
.peopleModel {width: 100%;height: 100vh;
}
</style>

相关文章:

  • 如何查看网站语言免费找客源软件
  • 西部数码网站管理助手 绑定域名常州seo建站
  • 网站透明flash竞价推广托管公司介绍
  • 网站如何做电脑销售电商平台运营
  • wordpress首页文章轮播网站seo服务
  • 跨境电商被骗血本无归网站关键词优化
  • 开源跨平台的轻量 C# 编辑器
  • 【Unity】MiniGame编辑器小游戏(四)数独【Sudoku】
  • 从设备自动化到智能管控:MES如何赋能牛奶饮料行业高效生产?
  • “边缘化”的机顶盒,被华为云CloudDevice拉回了客厅C位
  • 0 基础读懂可视化建模
  • 技术伦理之争:OpenAI陷抄袭风波,法院强制下架宣传视频
  • 前端react使用 UmiJS 构建框架 在每次打包时候记录打包时间并在指定页面显示
  • iOS runtime随笔-消息转发机制
  • ZooKeeper集群安装
  • lib61850 代码结构与系统架构深度分析
  • 第八节 CSS工程化-CSS模块化实践
  • ASP.NET Core 中 Kestrel 的应用及在前后端分离项目中的角色
  • order、sort、distribute和cluster by(Spark/Hive)
  • 监控易运维可视化大屏:迅速精准定位关键信息
  • 基于单片机的语音控制设计(论文)
  • Vue3+el-table-v2虚拟表格大数据量多选功能详细教程
  • 安全报告:LLM 模型在无显性攻击提示下的越狱行为分析
  • 通义灵码2.5智能体模式实战———集成高德MCP 10分钟生成周边服务地图应用
  • Vue.js 列表过滤实现详解(watch和computed实现)
  • AI对话导出工具 (AI Chat Exporter)——支持 ChatGPT, Grok 和 Gemini 平台