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

这篇具有很好参考价值的文章主要介绍了8. Threejs案例-SVG渲染器和WEBGL渲染器对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

实现效果

threejs svg渲染,Threejs,threejs,svg,webgl,渲染器,SVGRenderer,WebGLRenderer

知识点

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>


演示链接

示例链接文章来源地址https://www.toymoban.com/news/detail-829357.html

到了这里,关于8. Threejs案例-SVG渲染器和WEBGL渲染器对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Web3D数学基础(平移、旋转、缩放矩阵)—WebGL、WebGPU、Threejs

    Web3D数学基础(平移、旋转、缩放矩阵)—WebGL、WebGPU、Threejs

    参考资料:threejs中文网 threejs qq交流群:814702116 本下节课给大家介绍下矩阵的概念,以及用于几何变换的矩阵,比如平移矩阵、缩放矩阵、旋转矩阵。 如果你对这些几何变换的矩阵概念比较熟悉,可以跳过本节课。 线性代数、图形学 如果你有《线性代数》、《计算机图形学

    2024年02月03日
    浏览(23)
  • uniapp vue3中使用threejs渲染3D模型

    前言: 因为公司需求, 需要在App中内嵌一个3D模型. 在市场上看了一下情况, 大部分都是vue2的, 并没有vue3的版本...现在vue3也不是个新东西了. 后期模型会放入App内. 下面写法并不支持App(已解决在App中渲染, 关注我可见), 支持h5 template: js: 上面写法并不优雅, 只是临时作为一个demo可

    2024年02月12日
    浏览(10)
  • THREEJS 地图可视化案例分享

    个人练习学习案例,代码放在git了,需要的可以下载 threejs_map: threejs 地图可视化案例 效果预览

    2024年02月12日
    浏览(20)
  • 50套Threejs实现的Web3D学习案例,总有一套适合你

    50套Threejs实现的Web3D学习案例,总有一套适合你

    个人主页: 左本Web3D,更多案例预览请点击==》 在线案例 个人简介:专注Web3D使用ThreeJS实现3D效果技巧和学习案例 💕 💕积跬步以至千里,致敬每个爱学习的你。喜欢的话请三连,有问题请私信或者加微信 从18年开始,我由前后端开发开始专注Web3D开发,目前也已经快5年了

    2024年01月23日
    浏览(8)
  • ThreeJS案例一——在场景中添加视频,使用人物动作以及用键盘控制在场景中行走的动画

    ThreeJS案例一——在场景中添加视频,使用人物动作以及用键盘控制在场景中行走的动画

    首先我们需要两个模型,一个是场景模型,另一个是人物模型。 人物模型我这里用的Threejs官网中的给的模型,名称是 Xbot.glb 。 当然人物模型也可以自己去这个网站下载sketchfab,下载后给模型添加动画mixamo 下载模型动画 先让入你的模型 选择正确的模型文件格式 这里注意一

    2024年02月12日
    浏览(8)
  • SVG图标,SVG symbols,SVG use标签

    项目中图标的使用,趋势是使用svg作图标的,优点如下 兼容现有图片能力前提还支持矢量 可读性好,有利于SEO与无障碍 在性能和维护性方面也比iconfont要强很多 怎么在项目中优雅的使用svg图标,下面我们将采用类似雪碧图的做法 1、普通的使用 普通的使用遇到以下的问题:

    2024年02月15日
    浏览(15)
  • 什么是SVG?——SVG快速入门

    什么是SVG?——SVG快速入门

    最近在学习一个前端数据可视化D3.js,它的图表绘制是基于SVG的,作为一个小菜鸡,我并不知道什么是SVG,于是我决定把D3.js放一放,先学一下SVG。 那么什么是SVG呢?百度百科上是这么介绍的:“SVG是一种图形文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢

    2024年02月16日
    浏览(8)
  • Windows SVG预览工具(SVG Explorer Extension)

    Windows SVG预览工具(SVG Explorer Extension)

    Windows系统不支持在文件夹下直接预览svg图片,需要使用SVG扩展插件解决。 SVG Viewer Extension for Windows Explorer:它是一款功能实用的SVG图片格式本地预览工具,有了它即可轻松的进行本地文件夹中查看和浏览SVG格式资源文件 Github 地址 https://github.com/tibold/svg-explorer-extension 下载地

    2024年02月16日
    浏览(9)
  • vue中写svg组件svg图片加载不出来

    vue中写svg组件svg图片加载不出来

    结构 首先要安装3个插件:svg-sprite-loader,svgo,svgo-loader package.json src/icons/index.js src/components/SvgIcon/index.vue main.js vue.config.js

    2024年02月15日
    浏览(8)
  • 【Android】Glide加载SVG,SVG转PNG

    Dependency SvgDecoder 负责解码SVG资源 SvgTranscoder 负责将SVG转为Android的Drawable或Bitmap SvgModule 注册Glide自定义插件 GlideApp 编译会生成一个GlideApp,用它来取代默认的Glide加载资源即可

    2024年04月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包