image3D 使用 WebGL 绘制三维图片

程序名称:image3D

授权协议: MIT

操作系统: 跨平台

开发语言: JavaScript

image3D 介绍

image3D是一个基于WebGL开发的web端3D绘图库,包括常用的三维接口和辅助方法,帮助你快速绘制自己的三维图形。

如何使用?

首先,我们不得不说明一下绘图的基本流程: 编辑着色器 → 创建3D对象 → 准备好数据 → 绘制

我们接下来准备绘制一个点,点的颜色、大小和位置不停改变。

绘图的时候,本质上我们都是需要通过着色器来和GPU进行数据交互,因此,需要传递的数据都需要在这里提前定义好,看看本例子的着色器:

    <!-- 顶点着色器 -->
    <script type='x-shader/x-vertex' id='vs'>
        attribute vec4 a_position;
        attribute float a_size;
        attribute vec4 a_color;
        varying vec4 v_color;
        void main(){
            gl_Position=a_position;
            gl_PointSize=a_size;
            v_color=a_color;
        }
    <script>

    <!-- 片段着色器 -->
    <script type='x-shader/x-fragment' id='fs'>
        precision mediump float;
        varying vec4 v_color;
        void main(){
            gl_FragColor=v_color;
        }
    <script>

着色器分二类:顶点着色器和片段着色器,前者用于传递点的位置和大小,后者用于传递点的颜色。

本质上来讲,着色器其实就是二个字符串,用script标签包裹是为了在html文本中方便编辑,在后面的过程就可以看出来了。

着色器的代码有点像C语言,我们目前需要了解这三点:

  • gl开头的有三个,分别对应点的位置、大小和颜色(从上到下),这是着色器内置的变量,分别隶属于二个着色器,我们所谓的传值,从这个层次看,就是最终给这三个变量赋值。
  • 然后再看看attribute修饰的三个变量,被这个修饰符修饰的变量等于暴露了一个入口,image3D提供了传值的方法,所谓的传值,也就是通过这个入口实现的(第二个修饰符,vec4和float是变量的数据类型,类似别的语言)。
  • 前一条说的入口由attribute修饰实现,是针对每个点提供的,片段着色器是针对全部的点,因此attribute不可以直接出现在第二类着色器中,我们需要使用varying修饰符来标记一个桥梁,实现二个着色器之间的数据传递。

着色器准备好了以后,我们就可以使用这二个着色器创建3D对象了,同样的,看看本例中的代码:

    var image3d = new image3D(document.getElementsByTagName('canvas')[0], {

        // 传递着色器
        "vertex-shader": document.getElementById("vs").innerText,
        "fragment-shader": document.getElementById("fs").innerText

    });

从这里是不是可以看出来,着色器只不过是二段字符串。

实际的例子是不停的改变,我们为了方便说明,这里假设某个瞬间的操作:

    image3d
        // 设置点的位置
        .setAttributeFloat("a_position", 0.5, 0.5, 0.0)
        // 设置点的大小
        .setAttributeFloat("a_size", 50.0)
        // 设置点的颜色
        .setAttributeFloat("a_color", 1.0, 0.0, 0.0);

比如点的位置,“a_position”是和着色器中attribute修饰的变量对应的。大部分根据感觉应该就可以看出来,下面稍微提二点:

  • image3D选择的是右手坐标系,记作uvz(对应数学中的坐标系就是xyz),每个轴的有效可视范围是-1.0~1.0,因此这里的坐标(0.5, 0.5, 0.0)页面上看上去就是位于第一象限中心(右上角),请注意和浏览器的坐标区分。
  • 点的颜色需要传递三个值,范围是0.0~1.0,分别对应RGB(当然还可以有一个alpha透明度,这里没有传递)。

一切准备完毕,获取画笔绘制即可:

    image3d.Painter().drawPoint(0, 1);

这里缩减版的例子最终会绘制一个大小是50px,位于第一象限中心的红色正方形。完整的例子请
点击此处 查看运行效果。

当然,上面的例子可能过于简单,你也可以试试
旋转的二十四边形
这个稍微复杂点的例子,下面是某个瞬间的截图(本身是运动的,不停旋转):

image3D 官网

https://yelloxing.github.io/image3D

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


BlazeDS 是一个基于服务器的Java 远程控制(remoting)和Web消息传递(messaging)技术, 它能够使得后端的Java应用程序和运行在浏览器上的Adobe
OVal 是一个可扩展的Java对象数据验证框架,验证的规则可以通过配置文件、Annotation、POJOs 进行设定。可以使用纯 Java
Volta 是一套开发工具,专为开发分布式、实时系统应用。它包括级联,控制流分析工具,
OpenDDS 是一个开源的 C++ 实现的 对象管理组织 OMG 的 数据分布式服务 (DDS) 。OpenDDS利用自适应通信环境(ACE)提供一个跨平台的环境。
JADE (Java Agent DEvelopment Framework) 是一个完全用Java语言实现的软件框架。它通过一个兼容 FIPA
FastMM ,在D2006和2007中已代替了原来的内存管理器。
WebRTC 是一项在浏览器内部进行实时视频和音频通信的技术,是谷歌于2010年以6820万美元收购VoIP软件开发商 Global IT
gwtwiki - The Java Wikipedia API (Bliki engine),是一个 Wikipedia/Mediawiki 语法解析器,可以把 wiki 的文本转换成 HTML。它支持 wiki 标签,例如 bold, italic, headers, nowiki,
Esper 是一个复杂事件处理组件(CEP - Complex Event Processing),它有 Java 版本和 .NET 版本(NEsper)。
LuaTinker 的作者是Kwon-il Lee韩国人写的,最新的版本是0.2.C,这个C++ wrapper For Lua能够方便和
各种语言环境下gitignore文件的一个集合。
简介 ContentExtractor 是一个开源的网页正文抽取工具,用JAVA实现,具有非常高的抽取精度。
SwiftRandom 是一组函数集合,可以从不同的分布生成伪随机变量。 使用示例: //Single pseudorandom normal variable
java-linq-examples 是 101 个 LINQ 示例的 Java 移植版本。Android 兼容 Java 1.7. 此外还有以下语言移植版本:
mal,Make a Lisp,顾名思义,用图灵完备的编程语言写 Lisp 交互器,目前已经有35种不同语言的实现:
一个 Go 语言实现的中国行政区划查询工具。 介绍 最新中国行政区划,数据来源:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201608/t20160809_1386477.html
Teaf 简介 Tencent Easy ACE Framework,基于 ACE 的高性能轻量级服务框架,单进程多线程模型,支持 select/epoll 等多种网络
介绍 让 Guzzle 支持 Swoole 协程,这个项目目的就是这么简单明了! Guzzle-Swoole 是 Guzzle 的处理器(Handler),并没有对 Guzzle 本身代码进行修改,理论上可以兼容后续版本。
goproxy-shell goproxy服务端部署脚本 使用方法 wget --no-check-certificate https://github.com/sjz123321/goproxy-
1. pyMd2Doc介紹(pip版本) 利用python将markdown转换成带可收缩、可跳转到文本内容的目录文档。