首页 > 其他分享 >Three.js——十三、自定义大小画布、UI交互按钮以及3D场景交互、渲染画布为文件(图片)

Three.js——十三、自定义大小画布、UI交互按钮以及3D场景交互、渲染画布为文件(图片)

时间:2024-01-06 22:31:40浏览次数:53  
标签:canvas const 自定义 画布 link renderer 设置 交互

画布全屏以及自定义大小画布

<!-- canvas元素默认是行内块元素 -->
<div
  class="model"
  style="background-color: #ff0000;"
  width="300"
  height="180"
></div>

画布随窗口变化

// 画布跟随窗口变化
window.onresize = function () {
  const width = window.innerWidth - "多余的宽度"; //model画布高度
  const height = window.innerHeight - "多余的高度"; //model画布宽度
  renderer.setSize(width, height);
  camera.aspect = width / height;
  camera.updateProjectionMatrix();
};

UI 交互按钮与 3D 场景交互

通过按钮点击事件设置模型颜色,我这里使用 element-plus 的按钮

<el-button class="yellow-btn" type="warning" plain @click="yellowBtn"
  >黄色</el-button
>
const yellowBtn = () => {
  console.log(mesh);
  mesh.material.color.set(0xe5a144);
};

效果:

Three.js——十三、自定义大小画布、UI交互按钮以及3D场景交互、渲染画布为文件(图片)_数据

背景透明度

.setClearAlpha()方法
renderer.setClearAlpha(0.0); // 完全透明
设置背景透明alpha: true
// 在构造函数参数中设置alpha属性的值
var renderer = new THREE.WebGLRenderer({
  alpha: true,
});
.setClearColor()方法

.setClearColor()方法的参数 2,可以用来设置背景颜色透明度。

renderer.setClearColor(0xb9d3ff, 0.4); //设置背景颜色和透明度

这里我给创建画布的 div 添加一个背景颜色

.container {
  width: 100%;
  height: 100vh;
  position: relative;
  z-index: 1;
  background: #ff5810;
}

模型背景需要删掉

// scene.background = new THREE.Color(0xaaaaaa);

这时模型的背景会变成透明,适应 div 的背景

Three.js——十三、自定义大小画布、UI交互按钮以及3D场景交互、渲染画布为文件(图片)_下载文件_02

渲染结果保存为图片

<el-button class="save-btn" @click="saveFile">下载</el-button>
const saveFile = () => {
  const link = document.createElement("a");
  // 通过超链接herf属性,设置要保存到文件中的数据
  link.href = window.URL.createObjectURL(
    new Blob([JSON.stringify(scene), JSON.stringify(mesh)])
  );
  link.download = "模型数据.txt"; //下载文件名
  link.click(); //js代码触发超链接元素a的鼠标点击事件,开始下载文件到本地
};

下载完成后会生成一个 txt 文档,内容里是放一些场景的属性以及模型的信息

1. 配置 webgl 渲染器preserveDrawingBuffer:true

// WebGL渲染器设置
const renderer = new THREE.WebGLRenderer({
  //想把div画布上内容下载到本地,需要设置为true
  preserveDrawingBuffer: true,
});

2.绑定按钮的点击事件

<el-button class="save-btn" @click="saveFile">下载</el-button>
const saveFile = () => {
  const saveFile = () => {
    const link = document.createElement("a");
    // 通过超链接herf属性,设置要保存到文件中的数据
    var canvas = renderer.domElement; //获取canvas对象
    link.href = canvas.toDataURL("image/png");
    link.download = "threejs.png"; //下载文件名
    link.click(); //js代码触发超链接元素a的鼠标点击事件,开始下载文件到本地
  };
};

效果:

Three.js——十三、自定义大小画布、UI交互按钮以及3D场景交互、渲染画布为文件(图片)_超链接_03

3.Cavnas 方法.toDataURL()

const link = document.createElement('a');
// 通过超链接herf属性,设置要保存到文件中的数据
const canvas = renderer.domElement; //获取canvas对象
link.href = canvas.toDataURL("image/png");
// link.href = canvas.toDataURL("image/jpeg");
// link.href = canvas.toDataURL("image/bmp");

标签:canvas,const,自定义,画布,link,renderer,设置,交互
From: https://blog.51cto.com/u_15947040/9128120

相关文章

  • 人机交互主板定制_基于联MT8735安卓核心板的自助查询机/触摸一体机方案
    人机交互主板是一种商用智能终端主板,主要用于各种场景下的人机交互应用。它广泛适用于广告机、工控一体机、教学一体机、智能自助终端、考勤机、智能零售终端、O2O智能设备、取号机、计算机视觉、医疗健康设备以及机器人设备等。这款人机交互主板采用了联发科MTK8735芯片平......
  • 如何在Spring Boot中创建和自定义Starter
    引言SpringBoot提供了一种简化Spring应用开发的方式,并通过提供大量的starter依赖来进一步减少配置。然而,有时候我们需要根据特定需求来创建自定义的starter。本文将详细介绍如何创建和自定义SpringBootstarter。创建自定义Starter的步骤步骤1:创建项目结构创建一个Maven项目,并......
  • Vue3 自定义Hooks大全:一站式解决你的疑惑!
    前言不知道喜欢vue3的小伙伴和我是不是一样,刚上手vue3的时候对自定义hooks一脸懵逼,在一些视频网站学习的时候老师讲解到自定义hooks最喜欢用加减乘除来描述自定义hooks是咋用的,可能是我理解能力比较差吧,我看了这个加减乘除的自定义hooks之后感觉跟没看一样,还是一脸懵逼,......
  • SpringCloud微服务实战——搭建企业级开发框架(三十一):自定义MybatisPlus代码生成器实现
      理想的情况下,代码生成可以节省很多重复且没有技术含量的工作量,并且代码生成可以按照统一的代码规范和格式来生成代码,给日常的代码开发提供很大的帮助。但是,代码生成也有其局限性,当牵涉到复杂的业务逻辑时,简单的代码生成功能无法解决。  目前市面上的代码生成器层出不穷,大多......
  • Logstash自定义正则表达式ETL实战
    0、题记本文建立在干货|LogstashGrok数据结构化ETL实战上,并专注于在Grok中使用自定义正则表达式。有时Logstash没有我们需要的模式。幸运的是,我们有正则表达式库:Oniguruma。Oniguruma是一个灵活的正则表达式库。 它包含多种语言的不同正则表达式实现的特性。Github地址:https://......
  • TuGraph Analytics交互式图查询:让图所见即所得
    作者:廖梵抒TuGraphAnalytics提供了OLAP图分析能力,实现图上的交互式查询,用户在构图并导入数据之后,可以通过输入GQL语句对图查询分析,并以可视化的方式直观地展示点边结果。OLAP架构在TuGraphAnalyticsOLAP架构中,主要以下组件:Client:用户通过Client提交查询语句,Client负责和Co......
  • [Android] 如何把自定义的 可执行文件/库文件/apk 放到系统目录下
    找到源码目录device/......./<devicename>/<devicename>.mk,以waydroid为例:/device/waydroid/waydroid/waydroid_arm64打开如下文件: lineage_waydroid_arm64.mk添加PRODUCT_PACKAGES变量到上述文件中,比如:PRODUCT_PACKAGES+=可执行文件名/动态库名字/静态库文件名字/apk文件名......
  • EasyCVR自定义协议添加步骤
    有用户在使用EasyCVR平台时,想添加自身的自定义协议,不知如何操作。收到用户请求后,技术人员立即对用户进行反馈,以下为具体步骤:1、首先在添加设备中选择GM设备,并把项目id、身份标识和秘钥传入添加设备的接口中;2、随后再找到添加设备的接口,并写个GM协议接入,来判断上面三个参数是否为空;3......
  • 【C++】STL 容器 - set 集合容器 ⑤ ( 仿函数 functor 简介 | 仿函数 functor 调用 |
    文章目录一、仿函数functor1、仿函数functor简介2、仿函数functor调用3、代码示例-仿函数functor调用二、为自定义类元素设置排序规则-仿函数functor1、自定义类排序规则2、仿函数-实现自定义类排序规则3、重载<运算符函数-实现自定义类排序规则一、仿函数fu......
  • 【C++】STL 容器 - set 集合容器 ④ ( 设置 set 集合容器的排序规则 | 默认的 set 集
    文章目录一、设置set集合容器的排序规则1、默认的set集合容器-从小到大排列2、设置set集合容器从大到小排列二、使用仿函数自定义set集合容器排序规则1、仿函数概念2、使用仿函数实现set集合容器排序规则一、设置set集合容器的排序规则1、默认的set集合容器-......