8. Threejs案例-SVG渲染器和WEBGL渲染器对比

8. Threejs案例-SVG渲染器和WEBGL渲染器对比

实现效果

效果

知识点

SVG渲染器 (SVGRenderer)

SVGRenderer 被用于使用 SVG 来渲染几何数据,所产生的矢量图形在以下几个方面十分有用:

  • 动画标志 logo 或者图标 icon
  • 可交互的 2D3D 图表或图形
  • 交互式地图
  • 复杂的或包含动画的用户界面

SVGRenderer 具有很多优势。它产生清晰并且锐利的图像输出,它和实际视口分辨率无关。
SVG 元素可以通过 CSS 来控制样式;并且由于它可以添加诸如标题或者描述文字之类的元数据 (
对于搜索引擎或者屏幕阅读器十分有用) ,因此它具有十分良好的可访问性。

然而,SVG 也有一些十分重要的限制:

  • 没有高级的着色器
  • 不支持纹理
  • 不支持阴影
方法
clear()

告诉渲染器来清除其绘图表面。

getSize()

返回一个包含有渲染器宽和高的对象。

render(scene, camera)

使用 camera 来渲染一个 scene

setClearColor(color, alpha)

设置 clearColor 以及 clearAlpha

setPrecision(precision)

设置用于创建路径的数据的精度。

setQuality()

设置渲染质量。可能的值有 lowhigh

setSize(width, height)

改变渲染器尺寸。

基础线条材质 (LineBasicMaterial)

一种用于绘制线框样式几何体的材质。

属性
color

材质的颜色,默认值为白色。

fog

材质是否受雾影响。默认为 true

linewidth

控制线宽。默认值为 1

linecap

定义线两端的样式。可选值为 butt, roundsquare。默认值为 round

linejoin

定义线连接节点的样式。可选值为 round, bevelmiter。默认值为 round

代码

<!DOCTYPE html>
<html lang="zh">
<head>
    <title></title>
    <meta charset="UTF-8">
    <script src="ThreeJS/three.js"></script>
    <script src="ThreeJS/jquery.js"></script>
    <script src="ThreeJS/Projector.js"></script>
    <script src="ThreeJS/SVGRenderer.js"></script>

</head>
<body>
<p>
    <button id="myButton1">启用SVG渲染器</button>
    <button id="myButton2">启用WebGL渲染器</button>
</p>
<div id="myContainer"></div>
<script>
    // 初始化一个变量,用于决定是否使用SVG渲染器
    let isSVGRenderer = true;
    
    // 创建SVG渲染器,并设置其大小为窗口大小
    const myRenderer1 = new THREE.SVGRenderer();
    myRenderer1.setSize(window.innerWidth, window.innerHeight);
    
    // 创建WebGL渲染器,开启抗锯齿功能,并设置其大小为窗口大小
    const myRenderer2 = new THREE.WebGLRenderer({antialias: true});
    myRenderer2.setSize(window.innerWidth, window.innerHeight);
    
    // 创建一个透视相机,设置其视场角度和位置
    const myCamera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
    myCamera.position.z = 4;
    
    // 创建一个场景,并设置其背景色为白色
    const myScene = new THREE.Scene();
    myScene.background = new THREE.Color(0xffffff);
    
    // 创建一个用于存储顶点坐标的数组
    const myVertices = [];
    let i;
    
    // 通过循环生成顶点坐标,并存储到myVertices数组中
    for (i = 0; i <= 150; i++) {
        const v = (i / 150) * (Math.PI * 2);
        const x = Math.sin(v);
        const z = Math.cos(v);
        myVertices.push(x, 0, z);
    }
    
    // 创建一个几何体,并设置其位置属性
    const myGeometry = new THREE.BufferGeometry();
    myGeometry.setAttribute('position', new THREE.Float32BufferAttribute(myVertices, 3));
    
    // 创建三个线段,设置其材质、大小和旋转属性,并将它们添加到场景中
    for (i = 1; i <= 3; i++) {
        const myMaterial = new THREE.LineBasicMaterial({
            color: Math.random() * 0xffffff,
            linewidth: 20
        });
        let myLine = new THREE.Line(myGeometry, myMaterial);
        myLine.scale.setScalar(i / 3);
        myScene.add(myLine);
    }
    
    // 调用animate函数来渲染图形
    animate();
    
    // animate函数用于更新和渲染场景中的物体,并启动动画循环
    function animate() {
        let myOffset = 0;
        const myTime = performance.now() / 1000; // 获取当前时间并计算出时间差
        myScene.traverse(function (child) { // 遍历场景中的每个物体,更新其旋转属性
            child.rotation.x = myOffset + (myTime / 3); // 在x轴上旋转物体,并随时间变化产生动画效果
            child.rotation.z = myOffset + (myTime / 4); // 在z轴上旋转物体,并随时间变化产生动画效果
            myOffset++; // 每次循环时增加旋转角度,以产生连续的动画效果
        });
        let myRenderer = myRenderer1; // 根据isSVGRenderer变量的值选择渲染器,默认为SVG渲染器
        $("#myContainer").html(''); // 清空指定的容器元素的内容,以便将渲染器的DOM元素添加进去
        if (isSVGRenderer) { // 如果选择SVG渲染器,则使用myRenderer1渲染器进行渲染
            myRenderer = myRenderer1;
        } else { // 如果选择WebGL渲染器,则使用myRenderer2渲染器进行渲染
            myRenderer = myRenderer2;
        }
        $("#myContainer").append(myRenderer.domElement); // 将渲染器的DOM元素添加到指定的容器中,以便在网页上显示渲染结果
        myRenderer.render(myScene, myCamera); // 使用指定的渲染器和相机渲染场景,并将结果输出到DOM元素中
        requestAnimationFrame(animate); // 使用requestAnimationFrame函数启动动画循环,继续下一帧的渲染和动画效果生成
    }
    
    //响应单击“启用SVG渲染器”按钮
    $("#myButton1").click(function () {
        isSVGRenderer = true;
    });
    //响应单击“启用WebGL渲染器”按钮
    $("#myButton2").click(function () {
        isSVGRenderer = false;
    });
</script>
</body>
</html>


演示链接

示例链接

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6、应急响应-日志自动提取自动分析ELKLogkitLogonTracerAnolog等

用途&#xff1a;个人学习笔记&#xff0c;欢迎指正 目录 背景: 一、日志自动提取-七牛Logki&观星应急工具 1、七牛Logkit: (支持Windows&Linux&Mac等) 2、观星应急工具(只支持Windows) 二、日志自动分析-Web-360星图&Goaccess&ALB&Anolog 1、W…

Pandas.Series.var() 方差 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

vit细粒度图像分类(六)FBSD学习笔记

1.摘要 从判别局部区域学习特征表示在细粒度视觉分类中起着关键作用。利用注意机制提取零件特征已成为一种趋势。然而&#xff0c;这些方法有两个主要的局限性:第一&#xff0c;它们往往只关注最突出的部分&#xff0c;而忽略了其他不明显但可区分的部分。其次&#xff0c;他们…

从零搭建Vue3 + Typescript + Pinia + Vite + Tailwind CSS + Element Plus开发脚手架

项目代码以上传至码云&#xff0c;项目地址&#xff1a;https://gitee.com/breezefaith/vue-ts-scaffold 文章目录 前言脚手架技术栈简介vue3TypeScriptPiniaTailwind CSSElement Plusvite 详细步骤Node.js安装创建以 typescript 开发的vue3工程集成Pinia安装pinia修改main.ts创…

图解Vue组件通讯【一图胜千言】

Vue的每个组件都有独自的作用域&#xff0c;组件间的数据是无法共享的&#xff0c;但实际开发工作中我们常常需要让组件之间共享数据&#xff0c;今天我们来学习下面三种组件通信方式&#xff1a; 父子组件之间的通信 兄弟组件之间的通信 祖先与后代组件之间的通信 1. 父子组件…

MySQL进阶之锁(全局锁以及备份报错解决)

锁 全局锁 全局锁就是对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff0c;后续的DML的写语句&#xff0c;DDL语 句&#xff0c;已经更新操作的事务提交语句都将被阻塞。 其典型的使用场景是做全库的逻辑备份&#xff0c;对所有的表进行锁定&#xff…

Windows篇|连接共享文件夹映射驱动器教程

前言 昨天给小伙伴们分享了如何设置Windows共享文件夹的教程 超简单设置Windows共享文件夹,传输文件无烦恼 A电脑设置完共享文件夹之后,只要在同一局域网下,所有的电子设备都可以连接访问A电脑的共享文件夹里的内容。 这样就省去了U盘传输的麻烦,只要A电脑开着机,文件放入…

Mac如何设置一位数密码?

一、问题 Mac如何设置一位数密码&#xff1f; 二、解答 1、打开终端 2、清除全局账户策略 sudo pwpolicy -clearaccountpolicies 输入开机密码&#xff0c;这里是看不见的&#xff0c;输入完回车即可 3、重新设置密码 &#xff08;1&#xff09;打开设置-->用户和群组…

Docker 容器卷

1、概念介绍 如果是CentOS7安全模块会比之前系统版本加强&#xff0c;不安全的会先禁止&#xff0c;所以目录挂载的情况被默认为不安全的行为&#xff0c;在SELinux里面挂载目录被禁止掉了&#xff0c;如果要开启&#xff0c;我们一般使用--privlegedtrue命令&#xff0c;扩大…

Visual Studio Code安装配置C/C++教程 (windows版,亲测可行)

一.下载 Visual Studio Code https://code.visualstudio.com/ 二.安装 选择想要安装的位置: 后面的点击下一步即可。 三.下载编译器MinGW vscode只是写代码的工具&#xff0c;使用编译器才能编译写的C/C程序&#xff0c;将它转为可执行文件。 MinGW下载链接&#xff1a;…

24.云原生ArgoCD高级之数据加密seale sealed

云原生专栏大纲 文章目录 数据加密之seale sealedBitnami Sealed Secrets介绍Bitnami Sealed Secrets工作流程安装sealed-secrets和kubeseal安装sealed-secrets-controller安装kubeseal通过kubeseal将sealed-secrets公钥拿出来通过kubeseal加密secrets替换kustomize下secret为…

html2canvas 截图功能使用 VUE

html2canvas 是一个 JavaScript 库&#xff0c;可以将网页内容转换为 Canvas 元素&#xff0c;并生成图像或 PDF 文件。使用 html2canvas&#xff0c;你可以在客户端将网页的内容截图&#xff0c;并将其作为图像或 PDF 文件保存或分享。 以下是一些 html2canvas 库的特点和用途…

银河麒麟v10服务器版,specvirt测试

1 两台服务器&#xff0c;一台为SUT&#xff0c;一台为Phyclient。 1.1 两台服务器均编译安装gcc和qemu 按银河麒麟v10服务器arm版&#xff0c;qemugcc&#xff0c;跨架构安装虚拟机中步骤&#xff0c;编译安装gcc-9.3.0和qemu-7.0.0。 2 SUT服务器操作 2.1 mount数据盘到/…

XGB-1:XGBoost安装及快速上手

XGBoost是“Extreme Gradient Boosting”的缩写&#xff0c;是一种高效的机器学习算法&#xff0c;用于分类、回归和排序问题。它由陈天奇&#xff08;Tianqi Chen&#xff09;在2014年首次提出&#xff0c;并迅速在数据科学竞赛和工业界获得广泛应用。XGBoost基于梯度提升框架…

10个React状态管理库推荐

本文将为您推荐十款实用的React状态管理库&#xff0c;帮助您打造出高效、可维护的前端应用。让我们一起看看这些库的魅力所在&#xff01; 在前端开发中&#xff0c;状态管理是至关重要的一环。React作为一款流行的前端框架&#xff0c;其强大的状态管理功能备受开发者青睐。…

撰写出色的时事政治新闻资讯稿:窍门和技巧

撰写出色的时事政治新闻资讯稿&#xff1a;窍门和技巧 文章大纲写新闻/资讯&#xff08;结构部分&#xff09;较为复杂的标题&#xff08;额外扩展&#xff09;相关案例去除引题去除引题和副题注意事项讲一下什么叫导语。叙述式结论式描写式提问式摘要式 主体一要新二要“小”三…

当人工智能遇上教育,会擦出怎样的火花?

在这个时代&#xff0c;科技的风暴正以前所未有的速度席卷全球。其中&#xff0c;人工智能&#xff0c;这个被誉为21世纪的“科技之星”&#xff0c;正悄然改变着我们的生活。但是&#xff0c;当人工智能遇上传统教育领域时&#xff0c;你猜会发生什么&#xff1f; 有人说&…

宠物商业数据分析

一、宠物热销品类分布 欧睿国际更有一份数据表明&#xff0c;宠物食品在所有“它经济”中占比是最大&#xff0c;仅仅是猫狗食品就达到了59.1%&#xff0c;增速也远高于其他宠物用品。 2018年&#xff0c;中国就已经有超7700万独居成年人口&#xff0c;国内养宠主力军中90后占…

Shopee越南本土店好做吗?越南本土Shopee店家如何收款?站斧浏览器

Shopee越南本土店好做吗&#xff1f; 对于越南本土的Shopee店家来说&#xff0c;他们可能会关心Shopee平台的运营情况和是否适合他们开展电商业务。那么&#xff0c;Shopee好做吗&#xff1f;以下是一些相关的讨论点。 用户基础和市场规模 作为东南亚地区最大的电商平台之一…

10 排序的概念

目录 1.排序的概念和运用 2.排序的分类 1. 排序的概念及运用 1.1 排序的概念 排序: 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在…
最新文章