首页 > 其他分享 >three.js教程8-渲染器和前端UI界面

three.js教程8-渲染器和前端UI界面

时间:2023-02-09 21:11:05浏览次数:60  
标签:canvas 渲染器 domElement style three renderer js true

1、html的UI交互界面与Canvas画布叠加

需求:把threejs Cavnas画布和HTML元素叠加布局,在canvas上添加按钮,通过按钮点击修改canvas场景。

// canvas画布绝对定位
renderer.domElement.style.position = 'absolute';
renderer.domElement.style.top = '0px';
renderer.domElement.style.left = '0px';
renderer.domElement.style.zIndex = -1;//让场景在最底层
<div style="color: #ff0000;z-index:2;position: absolute;">红色</div>

2、Three.js背景颜色和透明度

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

// 在构造函数参数中设置alpha属性的值
var renderer = new THREE.WebGLRenderer({
  alpha: true,//默认是false
});

3、Three.js的canvas保存为图片

const renderer = new THREE.WebGLRenderer({
    //是否保留缓直到手动清除或被覆盖,想把canvas画布上内容下载到本地,需要设置为true
    preserveDrawingBuffer:true,
});
// 鼠标单击id为download的HTML元素,threejs渲染结果以图片形式下载到本地
document.getElementById('download').addEventListener('click',function(){
    // 创建一个超链接元素,用来下载保存数据的文件
    const link = document.createElement('a');
    // 通过超链接herf属性,设置要保存到文件中的数据
    link.href = renderer.domElement.toDataURL("image/png");
    link.download = 'threejs.png'; //下载文件名
    link.click(); //js代码触发超链接元素a的鼠标点击事件,开始下载文件到本地
})

//以不同的格式获取像素信息
canvas.toDataURL("image/png");
canvas.toDataURL("image/jpeg");
canvas.toDataURL("image/bmp");

4、深度冲突(模型闪烁)

问题现象:两个Mesh重合,电脑GPU分不清谁在前谁在后,这种现象,可以称为深度冲突Z-fighting

解决方法1:适当偏移,解决深度冲突,偏移尺寸相对模型尺寸比较小,视觉上两个平面近似还是重合效果。

解决方法2:logarithmicDepthBuffer=true,设置对数深度缓冲区,能缓解深度冲突,但是不能根除冲突。

// WebGL渲染器设置
const renderer = new THREE.WebGLRenderer({
    // 设置对数深度缓冲区,优化深度冲突问题
    logarithmicDepthBuffer: true
});

5、模型加载进度条

loader.load("../工厂.glb", function (gltf) {
    model.add(gltf.scene);
    // 加载完成,隐藏进度条
    // document.getElementById("container").style.visibility ='hidden';
    document.getElementById("container").style.display = 'none';
}, function (xhr) { 
    const percent = xhr.loaded / xhr.total;
    console.log('加载进度' + percent);
})

 

文章中部分素材选取自Threejs中文网:http://www.webgl3d.cn/

标签:canvas,渲染器,domElement,style,three,renderer,js,true
From: https://www.cnblogs.com/tiandi/p/17099085.html

相关文章

  • three.js教程6-加载外部三维模型gltf
    1、建模软件   3D美术常用的三维建模软件,比如Blender、3damx、C4D、maya等等Blender(轻量、免费、开源)3damxC4Dmaya   机械相关:SW、UG等   建筑......
  • JS混淆解密案例③
    今天收到一个特别大的js解密...部分代码如下functionQ0ooO(Q0oqq,Q0oqO){varoooQ0o=O0Q000o;try{if(Q0oqO&&(oooQ0o(0x293,'Qoqq')==typeofQ......
  • three.js教程5-几何体顶点UV坐标、纹理贴图
    1、纹理贴图纹理贴图,是给MeshLambertMaterial等材质一些纹理图片,以达到更好的视觉效果。使用方法:通过纹理贴图加载器TextureLoader的load()方法加载一张图片可以返回一个......
  • js函数作用域和作用域链
    定义:作用域就是限制某个变量只能在某个区域内有效。全局变量拥有全局作用域,而局部变量拥有局部作用域。在js中,作用域一共分为三类:全局作用域、局部(函数)作用域、块级作用域......
  • 详述 application/json 和 application/x-www-form-urlencoded 区别
    HTTP协议是以ASCII码传输,建立在TCP/IP协议之上的应用层规范。规范把HTTP请求分为三个部分:状态行、请求头、消息主体。协议规定,POST提交的数据必须放在消息主体(ent......
  • js构造函数详解
    1.构造函数介绍构造函数是专门用来生成对象的函数,它提供模板,描述对象的基本结构。一个构造函数,可以生成多个对象,这些对象都有相同的结构。构造函数的写法就是一个普通的函......
  • 用变量生成数据库web sql database 及操作需要JSON.stringfy/parse来操作
    用变量生成数据库web sql database 及操作需要JSON.stringfy/parse来操作:var newstr = 'checkbox0,input1,textarea2,option3,date4,flag'var newdatastr = ......
  • 【js】数组:filter函数
    前言:在使用filter的时候,永远返回的是一个“被筛选后的”新数组  1、定义 filter() 用于过滤某些元素,如果有if判断,if中往往返回的是true或false(布尔值)2、使用fil......
  • JSON.stringify()和JSON.parse()
    letdemo=['见到你',{age:18},'很开心']//1.利用JSON.stringify()将js对象序列化成JSON字符串console.lo......
  • Delphi Json的创建与解析
    1、Json的创建创建李四、王五放到data数组中  代码如下:varJson_In,Json_M,Json_A:ISuperObject;beginJson_A:=SA([]);Json_M:=SO();Json_In:=SO();J......