@google/model-viewer 导入 改纹理 (http-serve)

导入模型 改纹理

 效果图

<template><div><h1>鞋模型</h1><model-viewerstyle="width: 300px; height: 300px"id="my-replace-people"src="/imgApi/Astronaut.glb"auto-rotatecamera-controls></model-viewer><h1>图片贴到模型上</h1><div class="example-wrapper"><model-viewerid="my-replace-shop"src="/imgApi/scene.gltf"auto-rotatecamera-controls><div class="controls" id="color-controls"><button data-color="#ff0000">Red</button><button data-color="#00ff00">Green</button><button data-color="#0000ff">Blue</button><button data-color="#ffffff">White</button></div><div id="progress-bar"></div><!-- <template #progress-bar></template> --></model-viewer></div><h1>原模型</h1><!-- src="/imgApittps://res.theuniquer.com/pgc-models/picture.gltf" --><model-viewersrc="/imgApi/pgc-models_picture.gltf"auto-rotatecamera-controls></model-viewer><h1>原图片</h1><imgstyle="width: 100%; height: 100px; object-fit: contain"src="/imgApi/tietu.jpg"alt=""/><h1>图片贴到模型上</h1><div class="example-wrapper"><model-viewerid="my-replace-texture"src="/imgApi/pgc-models_picture.gltf"auto-rotatecamera-controls></model-viewer></div></div>
</template><script setup>
import { ref, onMounted } from "vue";
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import Hammer from "hammerjs";
import { useEventListener } from "@vueuse/core";
import "@google/model-viewer";const modelContainer = new THREE.Object3D();
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
);
// 在创建渲染器时,添加antiallias:true抗锯齿,让模型看起来更加平滑
const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
// 设置画布分辨率 提高画质
renderer.setPixelRatio(window.devicePixelRatio);
const loader = new GLTFLoader();
let model = null;// 光源设置
// const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // 环境光
// scene.add(ambientLight);// const pointLight = new THREE.PointLight(0xffffff, 1); // 点光源
// pointLight.position.set(10, 10, 10);
// scene.add(pointLight);// 环境光 (这是一定要的)
const ambientLight = new THREE.AmbientLight(0xffffff, 2);
// scene.add(ambientLight);// 白色平行光(模型更明亮)
const directionalLight = new THREE.DirectionalLight(0xffffff, 2); // 参数自行调整
directionalLight.position.x = 1;
directionalLight.position.y = 1;
directionalLight.position.z = 80;
directionalLight.target = modelContainer; // target指向模型
scene.add(directionalLight);// *创建点光源(这个看情况给)
var pointLight = new THREE.PointLight(0xffffff, 500); // 设置点光源的颜色和强度
pointLight.position.set(0, 0, 100); // 设置点光源的位置
scene.add(pointLight);// 设置阴影
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;// 初始化 Three.js 相关设置
camera.position.z = 5;
renderer.setSize(window.innerWidth, window.innerHeight);function initControls() {const controls = new OrbitControls(camera, renderer.domElement);// 如果使用animate方法时,将此函数删除//controls.addEventListener( 'change', render );// 使动画循环使用时阻尼或自转 意思是否有惯性controls.enableDamping = true;//动态阻尼系数 就是鼠标拖拽旋转灵敏度//controls.dampingFactor = 0.25;//是否可以缩放controls.enableZoom = true;//是否自动旋转// controls.autoRotate = true;controls.autoRotateSpeed = 0.5;//设置相机距离原点的最远距离// controls.minDistance  = 1;//设置相机距离原点的最远距离controls.maxDistance = 2000;//是否开启右键拖拽controls.enablePan = true;
}// 加载模型
loader.load("/imgApi/Astronaut.glb", (gltf) => {model = gltf.scene;model.castShadow = true; // 模型投射阴影scene.add(model);
});// 设置容器
const container = ref(null);onMounted(() => {const fn = async (modelViewer) => {const targetMaterial = modelViewer.model.materials.find((material) => material.name == "Center"); //找到材质console.log("targetMaterial=");console.log(modelViewer.model);console.log(modelViewer.model.materials);console.log(targetMaterial);const targetTexture = await modelViewer.createTexture("/imgApi/red-huawen.jpg"); // 用图片创建纹理targetMaterial.pbrMetallicRoughness.baseColorTexture.setTexture(targetTexture);};const modelViewer = document.querySelector("model-viewer#my-replace-texture"// "model-viewer#my-replace-shop");modelViewer.addEventListener("load", () => {fn(modelViewer);});const modelViewerColor = document.querySelector("model-viewer#my-replace-shop");const loadingText = document.getElementById("progress-bar");const modelViewerPle = document.querySelector("#my-replace-people");modelViewerPle.addEventListener("progress", (event) => {const loaded = event.detail.totalProgress;console.log("loading-->");console.log(`${(loaded * 100).toFixed(0)}%`);if (loadingText) loadingText.innerHTML = `${(loaded * 100).toFixed(0)}%`;// loadingText.textContent = `${(loaded * 100).toFixed(0)}%`;});modelViewerPle.addEventListener("load", async () => {const targetMaterial = modelViewerPle.model.materials.find((material) => material.name == "Center"); //找到材质console.log("modelViewerPle----->");console.log(modelViewerPle);console.log(modelViewerPle.model);console.log(modelViewerPle.model.materials);setTimeout(() => {loadingText.style.display = "none";}, 100);const targetTexture = await modelViewer.createTexture("/imgApi/red-huawen.jpg"); // 用图片创建纹理const [material] = modelViewerPle.model.materials;material.pbrMetallicRoughness.baseColorTexture.setTexture(targetTexture);});modelViewerColor.addEventListener("load", async () => {const targetMaterial = modelViewerColor.model.materials.find((material) => material.name == "Center"); //找到材质console.log("modelViewerColor----->");console.log(modelViewerColor);console.log(modelViewerColor.model);console.log(modelViewerColor.model.materials);const targetTexture = await modelViewer.createTexture("/imgApi/red-huawen.jpg"); // 用图片创建纹理const [material] = modelViewerColor.model.materials;material.pbrMetallicRoughness.baseColorTexture.setTexture(targetTexture);});// const targetMateriaShop = modelViewerColor.model.materials.find(//     (material) => material.name == "Center"//   ); //找到材质document.querySelector("#color-controls").addEventListener("click", (event) => {const colorString = event.target.dataset.color;const [material] = modelViewerColor.model.materials;material.pbrMetallicRoughness.setBaseColorFactor(colorString);});
});
</script><style scoped>
.example-wrapper model-viewer {width: 50vw;height: 50vh;margin: 20vh auto 0;background-color: #fff;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/378895.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++——函数模板和类模板

目录 一、函数模板 二、类模板 一、函数模板 当我们没有使用到模板的时候&#xff0c;我们如果要交换两个数据&#xff0c;那么我们就要根据交换的数据的类型&#xff0c;写出例如以下的函数&#xff1a; void Swap(int& a, int& b) {int tmp a;a b;b tmp; }void S…

HardeningMeter:一款针对二进制文件和系统安全强度的开源工具

关于HardeningMeter HardeningMeter是一款针对二进制文件和系统安全强度的开源工具&#xff0c;该工具基于纯Python开发&#xff0c;经过了开发人员的精心设计&#xff0c;可以帮助广大研究人员全面评估二进制文件和系统的安全强化程度。 功能特性 其强大的功能包括全面检查各…

appium2.0 执行脚本遇到的问题

遇到的问题&#xff1a; appium 上的日志信息&#xff1a; 配置信息 方法一 之前用1.0的时候 地址默认加的 /wd/hub 在appium2.0上&#xff0c; 服务器默认路径是 / 如果要用/wd/hub 需要通过启动服务时设置基本路径 appium --base-path/wd/hub 这样就能正常执行了 方法二…

react基础样式控制

行内样式 <div style{{width:500px, height:300px,background:#ccc,margin:200px auto}}>文本</div> class类名 注意&#xff1a;在react中使用class类名必须使用className 在外部src下新建index.css文件写入你的样式 .fontcolor{color:red } 在用到的页面引入…

C#学习-刘铁猛

文章目录 1.委托委托的具体使用-魔板方法回调方法【好莱坞方法】&#xff1a;通过委托类型的参数&#xff0c;传入主调方法的被调用方法&#xff0c;主调方法可以根据自己的逻辑决定调用这个方法还是不调用这个方法。【演员只用接听电话&#xff0c;如果通过&#xff0c;导演会…

STM32使用Wifi连接阿里云

目录 1 实现功能 2 器件 3 AT指令 4 阿里云配置 4.1 打开阿里云 4.2 创建产品 4.3 添加设备 5 STM32配置 5.1 基础参数 5.2 功能定义 6 STM32代码 本文主要是记述一下&#xff0c;如何使用阿里云物联网平台&#xff0c;创建一个简单的远程控制小灯示例。 完整工程&a…

vue、js截取视频任意一帧图片

html有本地上传替换部分&#xff0c;可以不看 原理&#xff1a;通过video标签对视频进行加载&#xff0c;随后使用canvas对截取的视频帧生成需要的图片 <template> <el-row :gutter"18" class"preview-video"><h4>视频预览<span&…

【概率论三】参数估计:点估计(矩估计、极大似然法)、区间估计

文章目录 一. 点估计1. 矩估计法2. 极大似然法2.1. 似然函数2.2. 极大似然估计法 3. 评价估计量的标准3.1. 无偏性3.2. 有效性3.3. 一致性 二. 区间估计1. 区间估计的概念2. 正态总体参数的区间估计 参数估计讲什么 由样本来确定未知参数参数估计分为点估计与区间估计 一. 点估…

[iOS]浅析isa指针

[iOS]浅析isa指针 文章目录 [iOS]浅析isa指针isa指针isa的结构isa的初始化注意事项 上一篇留的悬念不止分类的实现 还有isa指针到底是什么 它是怎么工作的 class方法又是怎么运作的 class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags 这里面的class又是何方…

新华三H3CNE网络工程师认证—VLAN使用场景与原理

通过华三的技术原理与VLAN配置来学习&#xff0c;首先介绍VLAN&#xff0c;然后介绍VLAN的基本原理&#xff0c;最后介绍VLAN的基本配置。 一、传统以太网问题 在传统网络中&#xff0c;交换机的数量足够多就会出现问题&#xff0c;广播域变得很大&#xff0c;分割广播域需要…

R语言优雅的把数据基线表(表一)导出到word

基线表&#xff08;Baseline Table&#xff09;是医学研究中常用的一种数据表格&#xff0c;用于在研究开始时呈现参与者的初始特征和状态。这些特征通常包括人口统计学数据、健康状况和疾病史、临床指标、实验室检测、生活方式、社会经济等。 本人在既往文章《scitb包1.6版本发…

C++客户端Qt开发——QT初识

二、QT初识 1.helloworld示例 ①图形化的方式&#xff0c;在界面上创建出一个控件&#xff0c;显示helloworld 右侧通过树形结构&#xff0c;就会显示出当前界面上有哪些控件 此时.ui文件已发生变化 qmake就会在编译项目的时候&#xff0c;基于这个内容&#xff0c;生成一段C…

35.UART(通用异步收发传输器)-RS232(2)

&#xff08;1&#xff09;RS232接收模块visio框图&#xff1a; &#xff08;2&#xff09;接收模块Verilog代码编写: /* 常见波特率&#xff1a; 4800、9600、14400、115200 在系统时钟为50MHz时&#xff0c;对应计数为&#xff1a; (1/4800) * 10^9 /20 -1 10416 …

链接追踪系列-10.mall-swarm微服务运行并整合elk-上一篇的番外

因为上一篇没对微服务代码很详细地说明&#xff0c;所以在此借花献佛&#xff0c;使用开源的微服务代码去说明如何去做链路追踪。 项目是开源项目&#xff0c;fork到github以及gitee中&#xff0c;然后拉取到本地 后端代码&#xff1a; https://gitee.com/jelex/mall-swarm.gi…

微软研究人员为电子表格应用开发了专用人工智能LLM

微软的 Copilot 生成式人工智能助手现已成为该公司许多软件应用程序的一部分。其中包括 Excel 电子表格应用程序&#xff0c;用户可以在其中输入文本提示来帮助处理某些选项。微软的一组研究人员一直在研究一种新的人工智能大型语言模型&#xff0c;这种模型是专门为 Excel、Go…

BiLSTM 实现股票多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

算法题目整合

文章目录 121. 小红的区间翻转142. 两个字符串的最小 ASCII 删除总和143. 最长同值路径139.完美数140. 可爱串141. 好二叉树 121. 小红的区间翻转 小红拿到了两个长度为 n 的数组 a 和 b&#xff0c;她仅可以执行一次以下翻转操作&#xff1a;选择a数组中的一个区间[i, j]&…

SpringBoot集成MQTT实现交互服务通信

引言 本文是springboot集成mqtt的一个实战案例。 gitee代码库地址&#xff1a;源码地址 一、什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&…

教大模型学数学,总共分几步?

大模型那么聪明&#xff0c;为什么数学题总是做不对、做不会&#xff1f; 从答高考数学卷难及格到普通数字比大小出错&#xff0c;大模型总算让大家觉得并非“无所不能”。这一方面让普通人开心&#xff0c;毕竟讲到AI取代人类看起来为时尚早&#xff0c;而另一方面&#xff0…

Autosar RTE配置-Assembly和Delegation的使用-基于ETAS软件

文章目录 前言Assembly和Delegation的含义Delegation的使用Assembly的使用总结 前言 RTE中的Compostion内部的SWC之间的连接使用Assembly Connector进行连接。这样的连接一般都是一个SWC的Pport对应另一个SWC的Rport。而Autosar软件中往往不只一个Composition(一般可以以核的数…