three.js 制作卡牌正反面 旋转

embedded/2024/10/18 16:51:02/

1.效果图

2.代码

<template><div><div id="container"></div></div>
</template><script>
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import img from "@/assets/images/3d2.png";
import imga from "@/assets/images/3d3.png";export default {data() {return {plane: null,camera: null,scene: null,renderer: null,controls: null,bgColor: "",};},mounted() {// 异步加载setTimeout(() => {this.init();}, 600);},methods: {// 初始化init() {this.createMesh(); // 创建网格模型this.createCamera(); // 创建相机this.createRender(); // 创建渲染器this.createControls(); // 创建控件对象this.render(); // 渲染},// 创建网格模型createMesh() {// 创建场景this.scene = new THREE.Scene();//创建一个长方体几何体const geom = new THREE.BoxGeometry(25, 35, 0.4);//全景图切六面图示例let materials = ["r", "l", "u", "d", "f", "b"] // 定义一个数组,表示六面图的名称.map((i) => {// 使用map方法遍历数组,并返回对应的材质if (i == "b") {return imga;} else {return img;}}).map((i) => {// 使用map方法再次遍历数组,并返回对应的材质const texture = new THREE.TextureLoader().load(i); // 加载纹理if (i == "static/img/3d3.eee30fa2.png") {this.bgColor = "#118a84"; // 设置背景颜色}//准备materialreturn new THREE.MeshBasicMaterial({side: THREE.DoubleSide, // 设置材质为双面map: texture, // 设置纹理transparent: true, // 设置透明opacity: 0.8, // 设置不透明度color: this.bgColor, // 设置透明});});// 创建网格this.plane = new THREE.Mesh(geom, materials); // 创建一个网格对象,几何体为geom,材质为materialsthis.scene.add(this.plane); // 将网格对象添加到场景中},// 创建相机createCamera() {const element = document.getElementById("container"); // 获取容器元素const width = element.clientWidth; // 窗口宽度const height = element.clientHeight; // 窗口高度const k = width / height; // 窗口宽高比this.camera = new THREE.PerspectiveCamera(35, k, 0.1, 1000); // 创建相机对象this.camera.position.set(-10, 0, 150); // 设置相机位置this.camera.lookAt(new THREE.Vector3(10, 0, 0)); // 设置相机方向this.scene.add(this.camera);},// 创建渲染器createRender() {const element = document.getElementById("container");this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true }); // 创建渲染器对象this.renderer.setSize(element.clientWidth, element.clientHeight); // 设置渲染区域尺寸this.renderer.shadowMap.enabled = true; // 显示阴影this.renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 设置阴影映射类型this.renderer.setClearColor(0x3f3f3f, 1); // 设置背景颜色element.appendChild(this.renderer.domElement);},// 渲染函数,负责动画循环和场景渲染render() {this.plane.rotation.y += 0.01; // 绕Y轴旋转this.renderer.render(this.scene, this.camera); // 使用renderer的render方法渲染场景和相机视角requestAnimationFrame(this.render); // 请求下一帧的动画,循环调用render函数},// 创建控件对象,用于相机控制createControls() {// 创建一个新的OrbitControls实例,绑定到相机和渲染器的DOM元素上// 创建一个新的OrbitControls实例,绑定到相机和渲染器的DOM元素上this.controls = new OrbitControls(this.camera, this.renderer.domElement);},},
};
</script>
<style scoped>
#container {position: absolute;width: 90%;height: 100%;
}
.vertice-span {line-height: 38px;padding: 0 2px 0 10px;
}
</style>

3.用到的图片


http://www.ppmy.cn/embedded/16949.html

相关文章

npm cnpm pnpm yarn 有什么区别? 哪个更好用呢?

npm、cnpm、pnpm 和 yarn 都是流行的 JavaScript 包管理工具&#xff0c;它们在安装和管理 Node.js 项目的依赖方面有所不同。选择哪一个主要取决于你的项目需求和个人喜好。下面是每个工具的基本概述和它们之间的主要区别&#xff1a; npm (Node Package Manager) 概述&#x…

[Flutter3] 记录Dio的简单封装(一)

文章目录 效果使用ResponseEntity类DioManager封装_onResponse / _onDioException 的设计Response的处理catch处理 效果 请求成功/失败/异常的日志输出效果 成功: 失败:500 失败:404 网络异常: 使用 举个使用的例子, 在调用 DioManager的时候, 直接通过返回值的状态, 来…

Stable Diffusion WebUI 使用 VAE 增加滤镜效果

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文主要介绍 VAE 模型&#xff0c;主要内容有&#xff1a;VAE 模型的概念、如果下载 VAE 模型、如何安装 VAE 模型、如…

问答机器人学习资料

longchain 5 分钟内搭建一个免费问答机器人&#xff1a;Milvus LangChain-腾讯云开发者社区-腾讯云 chatglm大模型 基于本地知识的问答机器人langchain-ChatGLM 大语言模型实现方法详解_python_脚本之家 探索QRobot&#xff1a;智能对话与聊天机器人的开源奇缘-CSDN博客 如何…

暴雨服务器,驱动AI未来无限

今日&#xff0c;由DOIT主办的“2024数据基础设施技术峰会”在成都隆重举办。本次峰会聚焦算力、存力与数据要素如何协同推动数字经济发展&#xff0c;吸引了众多业界专家、学者、技术开发者和企业决策者等齐聚一堂&#xff0c;共同探讨数据基础设施技术的未来趋势&#xff0c;…

web server apache tomcat11-17-default-servlet

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

使用 Flask 和 WTForms 构建一个用户注册表单

在这篇技术博客中&#xff0c;我们将使用 Flask 和 WTForms 库来构建一个用户注册表单。我们将创建一个简单的 Flask 应用&#xff0c;并使用 WTForms 定义一个注册表单&#xff0c;包括用户名、密码、确认密码、邮箱、性别、城市和爱好等字段。我们还将为表单添加验证规则&…

Elasticsearch索引中数据的增删改查与并发控制

Elasticsearch提供了丰富的REST API接口&#xff0c;使得用户能够便捷地对索引映射中的数据进行增删改查操作。本文将通过示例演示这些操作方法&#xff0c;同时介绍如何利用乐观锁进行并发控制&#xff0c;以及如何实现索引数据的批量写入。 使用REST端点对索引映射中的数据进…