精华内容
下载资源
问答
  • WebGL三维动态系统可视化
  • 基于three.js 和arcgis js api webgl 三维热力简介基于three.js 和arcgis js api webgl 三维热力基于three.js 和arcgis js api webgl 三维热力heatmap3dRenderer三维热力渲染效果图完整代码下载地址联系方式 ...

    简介

       ArcGIS API for JavaScript  是ESRI 推出面向 WEB 端 GIS   API,可构建引人注目的web 地图应用程序,通过交互式用户体验和令人惊叹的2D和3D可视化来释放地理时空大数据的潜力。同时提供了一个轻量级接口来访问SceneView的WebGL上下文,因此可以创建与内置层相同的方式与场景交互的自定义可视化。开发人员可以直接编写WebGL代码,也可以与第三方WebGL库集成
    

    基于three.js 和arcgis js api webgl 三维热力图heatmap3dRenderer 扩展类

    define
    展开全文
  • WebGL三维模型实现Phong着色1. demo效果2. Phong着色与Gouraud 着色2.1Gouraud 着色2.2 Phong 着色3. 实现要点4. demo代码 1. demo效果 2. Phong着色与Gouraud 着色 通过前面几篇文章,大致知道典型的照明技术有三...

    1. demo效果

    在这里插入图片描述
    在这里插入图片描述

    2. Phong着色与Gouraud 着色

    通过前面几篇文章,大致知道典型的照明技术有三种:漫反射光(diffuse light)、环境光(ambient light)和反射光(specular light)。通过与它们组合使用可以实现更加逼真的照明效果。

    2.1Gouraud 着色

    前几篇文章的光照实现都是在顶点着色器实现的,会对每个三角形的顶点进行一次着色,这样的着色称为Gouraud 着色,Gouraud 着色时颜色信息从顶点着色器传向片元着色器的过程中会进行颜色插值,因此在颜色变化的边界处可能会出现锯齿。尤其是在顶点数比较少的时候。下图是Gouraud 着色的效果,可以看到红色框内的阴影有些许锯齿
    在这里插入图片描述

    2.2 Phong 着色

    Gouraud着色是在顶点着色器处理处理完成在向片元着色器传输的过程中会进行颜色插值,Phong 着色是直接在片元着色器处理,是对每个像素进行颜色插值。与Gouraud着色相比,Phong 着色使用逐像素颜色插值来消除不自然的锯齿,计算量会大一些,但在相同顶点数量的情况下,可以获得更加平滑的阴影和更美丽自然的高光。下图是使用Phong着色实现的效果,可以与Gouraud着色的效果对比一下

    Phong着色效果
    在这里插入图片描述
    Gouraud着色效果
    在这里插入图片描述

    3. 实现要点

    与上一篇文章相比,这一次将计算光的过程放在了片元着色器中,但是在顶点着色器中需要定义varying变量vNormal和vColor向片元着色器中传值法线信息和顶点颜色信息

    //顶点着色器
    var VSHADER_SOURCE = `
      attribute vec3 position; //顶点位置信息
      attribute vec4 color; //颜色
      attribute vec3 normal; //法线
      uniform mat4 uMvpMatrix; //模型视图投影矩阵
      varying vec3 vNormal; //向片元着色器传值法线信息
      varying vec4 vColor; //向片元着色器传值颜色信息
      void main(){
        vNormal = normal;
        vColor = color;
        gl_Position = uMvpMatrix*vec4(position,1.0); //将模型视图投影矩阵与顶点坐标相乘赋值给顶点着色器内置变量gl_Position
      }
      `
    

    在片元着色器中接收顶点着色器传来的法线信息和顶点颜色信息,然后分别计算慢反射光、反射光,并与接收到的环境颜色,使用公式:颜色 = 顶点颜色 * 漫反射光 + 反射光 + 环境光 计算着色使用的颜色

    //片元着色器
    var FSHADER_SOURCE = `
      #ifdef GL_ES
        precision mediump float; // 设置float类型为中精度
      #endif
      uniform mat4 uInvMatrix;//模型坐标变换矩阵的逆矩阵
      uniform vec3 uLightDirection;//平行光方向
      uniform vec4 uAmbientLightColor;//环境光颜色
      uniform vec3 uEyeDirection;//视点方向
      varying vec3 vNormal; //接收法线信息
      varying vec4 vColor; //接收颜色信息
      void main(){
        vec3 invLight = normalize(uInvMatrix*vec4(uLightDirection,0.0)).xyz;
        vec3 invEye = normalize(uInvMatrix*vec4(uEyeDirection,0.0)).xyz;
        vec3 halfLE = normalize(invLight + invEye);//半程向量
        float diffuse = clamp(dot(vNormal,invLight),0.0,1.0);//将结果限定在0.0~1.0内
        float specular = pow(clamp(dot(vNormal, halfLE), 0.0, 1.0), 50.0);//计算高光
        //颜色 = 顶点颜色 * 漫反射光 + 反射光 + 环境光
        vec4 destColor = vColor*vec4(vec3(diffuse),1.0) + vec4(vec3(specular), 1.0)+uAmbientLightColor;
        gl_FragColor = destColor;//将计算的颜色信息赋值给内置变量gl_FragColor
      }
    `
    

    4. demo代码

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <title></title>
    </head>
    
    <body>
      <!--通过canvas标签创建一个800px*800px大小的画布-->
      <canvas id="webgl" width="800" height="800"></canvas>
      <script type="text/javascript" src="./lib/cuon-matrix.js"></script>
      <script>
        //顶点着色器
        var VSHADER_SOURCE = `
          attribute vec3 position; //顶点位置信息
          attribute vec4 color; //颜色
          attribute vec3 normal; //法线
          uniform mat4 uMvpMatrix; //模型视图投影矩阵
          varying vec3 vNormal; //向片元着色器传值法线信息
          varying vec4 vColor; //向片元着色器传值颜色信息
          void main(){
            vNormal = normal;
            vColor = color;
            gl_Position = uMvpMatrix*vec4(position,1.0); //将模型视图投影矩阵与顶点坐标相乘赋值给顶点着色器内置变量gl_Position
          }
          `
    
        //片元着色器
        var FSHADER_SOURCE = `
          #ifdef GL_ES
            precision mediump float; // 设置float类型为中精度
          #endif
          uniform mat4 uInvMatrix;//模型坐标变换矩阵的逆矩阵
          uniform vec3 uLightDirection;//平行光方向
          uniform vec4 uAmbientLightColor;//环境光颜色
          uniform vec3 uEyeDirection;//视点方向
          varying vec3 vNormal; //接收法线信息
          varying vec4 vColor; //接收颜色信息
          void main(){
            vec3 invLight = normalize(uInvMatrix*vec4(uLightDirection,0.0)).xyz;
            vec3 invEye = normalize(uInvMatrix*vec4(uEyeDirection,0.0)).xyz;
            vec3 halfLE = normalize(invLight + invEye);//半程向量
            float diffuse = clamp(dot(vNormal,invLight),0.0,1.0);//将结果限定在0.0~1.0内
            float specular = pow(clamp(dot(vNormal, halfLE), 0.0, 1.0), 50.0);//计算高光
            //颜色 = 顶点颜色 * 漫反射光 + 反射光 + 环境光
            vec4 destColor = vColor*vec4(vec3(diffuse),1.0) + vec4(vec3(specular), 1.0)+uAmbientLightColor;
            gl_FragColor = destColor;//将计算的颜色信息赋值给内置变量gl_FragColor
          }
        `
    
        onload = function () {
    
          //通过getElementById()方法获取canvas画布
          var canvas = document.getElementById('webgl');
    
          //通过方法getContext()获取WebGL上下文
          var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
    
    
          //创建程序对象
          var prg = createProgram(VSHADER_SOURCE, FSHADER_SOURCE);
    
          //获取顶点位置、法线、颜色的存储地址
          var attLocations = {
            position: gl.getAttribLocation(prg, 'position'),
            normal: gl.getAttribLocation(prg, 'normal'),
            color: gl.getAttribLocation(prg, 'color'),
          }
    
          //每个顶点属性的大小(分量数)
          var attStrides = {
            position: 3,
            normal: 3,
            color: 4,
          }
    
    
          // 生成绘制甜圈圈的信息
          var torusData = torus(50, 50, 3.0, 8.0);
    
          var position = torusData[0];
          var normal = torusData[1];
          var color = torusData[2];
          var index = torusData[3];
    
          // 创建存放顶点、法线、颜色的VBO
          var vbos = {
            position: create_vbo(position),
            normal: create_vbo(normal),
            color: create_vbo(color),
          }
    
          // 设置VBO
          set_attribute(vbos, attLocations, attStrides);
    
          // 创建IBO
          var ibo = create_ibo(index);
    
          // IBO绑定
          gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);
    
    
          //获取uniform变量模型视图投影矩阵、模型坐标变换矩阵的逆矩阵、平行光方向、环境光颜色、视角方向
          var uniformLocations = {
            uMvpMatrix: gl.getUniformLocation(prg, 'uMvpMatrix'),
            uInvMatrix: gl.getUniformLocation(prg, 'uInvMatrix'),
            uLightDirection: gl.getUniformLocation(prg, 'uLightDirection'),
            uAmbientLightColor: gl.getUniformLocation(prg, 'uAmbientLightColor'),
            uEyeDirection: gl.getUniformLocation(prg, 'uEyeDirection'),
    
          }
          //给顶点着色器uniform变量uLightDirection-平行光方向传值[-2.5, 3.5, 0.5]
          gl.uniform3fv(uniformLocations.uLightDirection, [-2.5, 3.5, 0.5]);
    
          //给顶点着色器uniform变量uAmbientLightColor- 环境光颜色传值(0.2, 0.1, 0.2, 1.0)
          gl.uniform4f(uniformLocations.uAmbientLightColor, 0.2, 0.1, 0.2, 1.0);
    
          //给顶点着色器uniform变量uEyeDirection-视点方向传值[0.0, 0.0, 20.0]
          gl.uniform3fv(uniformLocations.uEyeDirection, [0.0, 0.0, 20.0]);
    
    
          var currentAngle = [0.0, 0.0]; //当前旋转的角度[x-axis, y-axis]
          var g_MvpMatrix = new Matrix4(); //模型视图投影矩阵 
          var viewProjMatrix = new Matrix4(); //创建视图投影矩阵
          var modelMatrix = new Matrix4(); //创建模型矩阵
          var invMatrix = new Matrix4(); //创建模型矩阵
    
          viewProjMatrix.setPerspective(45.0, canvas.width / canvas.height, 1.0, 100.0);
          viewProjMatrix.lookAt(0.0, 20.0, 30.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    
    
          gl.enable(gl.DEPTH_TEST); //开启隐藏面消除
          gl.depthFunc(gl.LEQUAL); //如果传入值小于或等于深度缓冲区值,则通过
          gl.enable(gl.CULL_FACE); //激活多边形正反面剔除
          var rotateSpeed = 0.1; // 自动旋转速度
          (function tick() {
    
            // gl初始化
            gl.clearColor(0.0, 0.0, 0.0, 1.0); //指定调用 clear() 方法时使用的颜色值
            gl.clearDepth(1.0); //设置深度清除值
            gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); //清空颜色和深度缓冲区
    
    
            //计算模型视图投影矩阵 
            g_MvpMatrix.set(viewProjMatrix); //设置视图投影矩阵 
    
            modelMatrix.setRotate(currentAngle[0], 1.0, 0.0, 0.0); //沿X轴旋转设置矩阵
            modelMatrix.rotate(currentAngle[1], 0.0, 1.0, 0.0); //沿Y轴旋转设置矩阵
    
            rotateSpeed += 0.3;
            //modelMatrix.rotate(rotateSpeed, 0.0, 1.0, 1.0); //更新旋转矩阵
    
            g_MvpMatrix.multiply(modelMatrix) //相乘模型变换矩阵
    
            //计算模型坐标变换矩阵的逆矩阵
            invMatrix.setInverseOf(modelMatrix)
    
            //向着色器传值模型视图投影矩阵uMvpMatrix、模型坐标变换矩阵的逆矩阵uInvMatrix
            gl.uniformMatrix4fv(uniformLocations.uMvpMatrix, false, g_MvpMatrix.elements);
            gl.uniformMatrix4fv(uniformLocations.uInvMatrix, false, invMatrix.elements);
    
    
            //绘图
            gl.drawElements(gl.TRIANGLES, index.length, gl.UNSIGNED_SHORT, 0);
    
            gl.flush();
    
            requestAnimationFrame(tick)
    
          })();
    
          initEventHandlers(canvas, currentAngle) //注册鼠标事件
    
          //创建程序对象
          function createProgram(vshader, fshader) {
    
            //创建顶点着色器对象
            var vertexShader = loadShader(gl.VERTEX_SHADER, vshader);
            //创建片元着色器对象
            var fragmentShader = loadShader(gl.FRAGMENT_SHADER, fshader);
    
            if (!vertexShader || !fragmentShader) {
              return null
            }
    
            //创建程序对象program
            var program = gl.createProgram();
            if (!gl.createProgram()) {
              return null
            }
    
            //分配顶点着色器和片元着色器到program
            gl.attachShader(program, vertexShader);
            gl.attachShader(program, fragmentShader);
            //链接program
            gl.linkProgram(program);
    
            //检查程序对象是否连接成功
            var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
            if (!linked) {
              var error = gl.getProgramInfoLog(program);
              console.log('程序对象连接失败: ' + error);
              gl.deleteProgram(program);
              gl.deleteShader(fragmentShader);
              gl.deleteShader(vertexShader);
              return null
            }
    
            //使用program
            gl.useProgram(program);
    
            gl.program = program;
            //返回程序program对象
            return program
          }
    
          function loadShader(type, source) {
            // 创建顶点着色器对象
            var shader = gl.createShader(type);
            if (shader == null) {
              console.log('创建着色器失败');
              return null
            }
    
            // 引入着色器源代码
            gl.shaderSource(shader, source);
    
            // 编译着色器
            gl.compileShader(shader);
    
            // 检查顶是否编译成功
            var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
            if (!compiled) {
              var error = gl.getShaderInfoLog(shader);
              console.log('编译着色器失败: ' + error);
              gl.deleteShader(shader);
              return null
            }
    
            return shader
          }
    
    
          function initEventHandlers(canvas, currentAngle) {
            var dragging = false; //默认鼠标拖动不旋转物体
            var lastX = -1,
              lastY = -1; //鼠标最后的位置
    
            canvas.onmousedown = function (ev) { //注册鼠标按下事件
              var x = ev.clientX,
                y = ev.clientY;
    
              //鼠标在物体上开始拖动
              var rect = ev.target.getBoundingClientRect();
              if (rect.left <= x && x < rect.right && rect.top <= y && y < rect.bottom) {
                lastX = x;
                lastY = y;
                dragging = true;
              }
            }
    
            //鼠标松开拖动结束
            canvas.onmouseup = function (ev) {
              dragging = false;
            }
    
            canvas.onmousemove = function (ev) { //注册鼠标移动事件
              var x = ev.clientX,
                y = ev.clientY;
              if (dragging) {
                var factor = 100 / canvas.height; //旋转因子
                var dx = factor * (x - lastX);
                var dy = factor * (y - lastY);
                //沿Y轴的旋转角度控制在-90到90度之间
                currentAngle[0] = Math.max(Math.min(currentAngle[0] + dy, 90.0), -90.0);
                currentAngle[1] = currentAngle[1] + dx;
              }
              lastX = x;
              lastY = y;
            }
          }
    
          // 创建VBO
          function create_vbo(data) {
            //创建缓冲区对象
            var vbo = gl.createBuffer();
    
            //绑定缓冲区到ARRAY_BUFFER
            gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
    
            //将数据写入缓冲区对象
            gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
    
            //解绑缓冲区
            gl.bindBuffer(gl.ARRAY_BUFFER, null);
    
            return vbo
          }
    
    
          // 向VBO写入数据
          function set_attribute(vbo, attLocation, attStride) {
    
            for (var key in vbo) {
              //绑定缓冲区到ARRAY_BUFFER
              gl.bindBuffer(gl.ARRAY_BUFFER, vbo[key]);
    
              //分配缓存区到指定地址
              gl.vertexAttribPointer(attLocation[key], attStride[key], gl.FLOAT, false, 0, 0);
    
              //开启缓冲区
              gl.enableVertexAttribArray(attLocation[key]);
            }
          }
    
          // 创建IBO
          function create_ibo(data) {
            //创建缓冲区对象
            var ibo = gl.createBuffer();
    
            //绑定缓冲区到ELEMENT_ARRAY_BUFFER
            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);
    
            //将数据写入缓冲区对象
            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Int16Array(data), gl.STATIC_DRAW);
    
            //解绑缓冲区
            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
    
            return ibo;
          }
    
          //生成甜圈圈
          //第一个参数表示管道截面圆分段数,第二个参数表示管道圆的分段数,
          //第三个参数管道截面圆的半径。第四个参数表示从管道中心到管道截面圆中心的距离
          function torus(row, column, irad, orad) {
            var position = new Array(),
              normal = new Array(),
              color = new Array(),
              index = new Array();
            for (var i = 0; i <= row; i++) {
              var r = Math.PI * 2 / row * i; //管道圆上每个分段的弧度
              var rr = Math.cos(r);
              var ry = Math.sin(r);
              for (var ii = 0; ii <= column; ii++) {
                var tr = Math.PI * 2 / column * ii;
                //每个顶点位置的x、y、z分量
                var tx = (rr * irad + orad) * Math.cos(tr);
                var ty = ry * irad;
                var tz = (rr * irad + orad) * Math.sin(tr);
    
                var rx = rr * Math.cos(tr);
                var rz = rr * Math.sin(tr);
                position.push(tx, ty, tz);
                normal.push(rx, ry, rz);
                var tc = hsva(360 / column * ii, 1, 1, 1);
                color.push(tc[0], tc[1], tc[2], tc[3]);
              }
            }
            for (i = 0; i < row; i++) {
              for (ii = 0; ii < column; ii++) {
                r = (column + 1) * i + ii;
                index.push(r, r + column + 1, r + 1);
                index.push(r + column + 1, r + column + 2, r + 1);
              }
            }
            return [position, normal, color, index];
          }
    
          //将HSV颜色转换为RGB颜色
          function hsva(h, s, v, a) {
            if (s > 1 || v > 1 || a > 1) {
              return;
            }
            var th = h % 360;
            var i = Math.floor(th / 60);
            var f = th / 60 - i;
            var m = v * (1 - s);
            var n = v * (1 - s * f);
            var k = v * (1 - s * (1 - f));
            var color = new Array();
            if (!s > 0 && !s < 0) {
              color.push(v, v, v, a);
            } else {
              var r = new Array(v, n, m, m, k, v);
              var g = new Array(k, v, v, n, m, m);
              var b = new Array(m, m, k, v, v, n);
              color.push(r[i], g[i], b[i], a);
            }
            return color;
          }
    
        }
      </script>
    </body>
    
    </html>
    
    展开全文
  • webGL三维开发 …\supermap-iserver-10.0.1-win64-zip\iClient\for3D\webgl\zh目录下 \examples --示例程序(源代码方便开发人员快速构建应用) \Build\Cesium --开发脚本库 \index.html --首页,整合示范程序、...
    一、webGL三维开发

    …\supermap-iserver-10.0.1-win64-zip\iClient\for3D\webgl\zh目录下

    • \examples --示例程序(源代码方便开发人员快速构建应用)
    • \Build\Cesium --开发脚本库
    • \index.html --首页,整合示范程序、类参考说明以及专题技术文档
    • iClient3D for webgl具有的能力:在这里插入图片描述
    • 示例、API:
      http://support.supermap.com.cn:8090/webgl/examples/examples.html#layer
      看cesium API文档
      http://support.supermap.com.cn:8090/webgl/Build/Documentation/index.html
              webGL 应用的倾斜摄影: 加载倾斜摄影模型–>对它进行单体化
    • http://www.supermapol.com/earth/
    二、webGL–helloworld:
    • 1.引入脚本库
      在这里插入图片描述
      代码路径修改为: paths: {
      ‘Cesium’: ‘…/Build/Cesium/Cesium’ },
      新建index.html 文件,添加下面代码块代码
    • 2.添加三维场景的装载容器
    • 3.显示三维场景
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta http-equiv="Content-Type" content="text/html charset=utf-8"/>
    		<title>helloWorldwebGL</title>
    		<link href="css/widgets.css"rel="stylesheet">
    		<script type="text/javascript"src="js/require.min.js"data-main="js/main"></script>
    	</head>
    	<body>
    		<div id="cesiumContainer"style="width:100%;height:100%"></div> <!--div 命名的对象id用来承载整个三维场景-->
    		<script type="text/javascript">
    				var viewer;
    				function onload(Cesium){
    						viewer=new	Cesium.Viewer('cesiumContainer');<!--Viewer包含三维球和以外的东西(弹窗等)-->
    						var scene=viewer.scene;<!--Viewer包含三维场景,(通过)显示其就可以显示三维场景;定义scene对象-->
    				}
    		</script>
    	</body>
    </html>
    
    • 4.发布工程
      在这里插入图片描述
        电脑开启服务:startup.bat ;使用浏览器访问: http://localhost:8090/helloWorld/index.html
    三、Viewer中的数据组织

    在这里插入图片描述
    不完整例子编码诠释上图:scene.primitives.add(new Cesium.Primitive({
    geometryInstances : instance,
    appearance : new Cesium.EllipsoidSurfaceAppearance({
    material : Cesium.Material.fromType(‘Checkerboard’)
    })
    }));//primitives是集合,可以使用add方法添加树形下面的实例

    var collection = new Cesium.PrimitiveCollection();

    collection.add(billboards);

    new Cesium.S3MInstance(context, index, ownerGroup, options) S3M模型实例对象。

    Name Type Description
    context Context context对象。
    index Number 该实例所在组的索引位置。
    ownerGroup Object 该实例所在组。
    options Object 对象具有以下属性:

    //new S3MTilesLayer instance //通过该图层类实现加载缓存

    var S3MTilesLayer = new S3MTilesLayer({
    gl : gl,
    servers : [“http://localhost:8090”],
    urls : [“http://localhost:8090/data/tile_001.xml”,“http://localhost:8090/data/tile_002.xml”],
    position : [10,20],
    name : [“S3MTilesLayer”]
    });
    TerrainProvider添加到**图层中 再添加到scene中 从上图中看出(同一时间)地形只有(可以添加)1个,影像有多个
    //camera帮助我们定位的

    四、客户端加载数据–保存的场景

    打开startup.bat;访问:localhost:8090/iserver/manager 主页->服务管理页面->三维服务下有数据(3D-CBD)-点击->进入rest服务根目录下(localhost:8090/iserver/services/3D-CBD/rest/realspace/scenes/CBD ) (支持浏览s3m缓存)

    • 1.初始化Viewer和Scene(场景类)
      加载保存在工作空间中的三维场景localhost:8090/iserver/services/3D-CBD/rest/realspace
    • 2.获取场景服务地址
    • 3.打开场景
      通过Scene.open(url)方法加载
    • 4.设置相机视角,转换坐标

    以下编码 均未运行!

    <!DOCTYPE html>
    <html >
    	<head>
    		<meta charset="utf-8">
    		<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    		<title>数据加载</title>
    		<link href="css/widgets.css" rel="stylesheet">
    		<script type="text/javascript" src="js/require.min.js" data-main="js/main"></script>
    		<script type="text/javascript">
    			var viewer,url;
    			function onload(Cesium){
    				viewer=new Cesium.Viewer('cesiumContainer');
    				var scene= viewer.scene;
    				
    				var url="http://localhost:8090/iserver/services/3D-CBD/rest/realspace";
    				var promise=scene.open(url);//
    				Cesium.when(promise,function(layers){
    				         scene.camera.setView({destination:new       Cesium.Cartesian3.fromDegrees(116.45438,39.910263,2000)});
    						   });										
    			}	
    		</script>	
    	</head>
    	<body>
    		<div id="cesiumContainer" style="width:100%;height:100%"></div>
    	</body>
    </html>
    
    • 访问 localhost:8090/helloWorld/addData-2.html
    五、客户端加载数据–s3m(Spatial 3D Model)缓存图层
    • 加载三维切片缓存—*.s3m格式
    • 倾斜摄影模型、BIM模型、点云数据、精细模型、矢量数据等。
    • 通过Scene.addS3MTilesLayerByScp(url,options) 的方式
      • 1.获取S3M图层服务地址

      • 2.添加S3M图层服务

      • 3.设置相机视角,转换坐标

        找到发布的(数据服务 data-bim/rest),三维服务下的3D-bim/rest
        localhost:8090/iserver/services/3D-bim/rest/realspace/datas/bim/config 再点击获取配置文件 得到此 需要的地址

    <!DOCTYPE html>
    <html >
    	<head>
    		<meta charset="utf-8">
    		<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    		<title>数据加载</title>
    		<link href="css/widgets.css" rel="stylesheet">
    		<script type="text/javascript" src="js/require.min.js" data-main="js/main"></script>
    		<script type="text/javascript">
    			var viewer,url;
    			function onload(Cesium){
    				viewer=new Cesium.Viewer('cesiumContainer');
    				var scene= viewer.scene;
    				// 博文中步骤五 添加BIM模型
    				var url = 'http://localhost:8090/iserver/services/3D-bim/rest/realspace/datas/bim/config';
    				var promise = scene.addS3MTilesLayerByScp(url,{name:'bim'});
    				Cesium.when(promise,function(layer){
    					//设置相机视角,将经度、纬度、高度的坐标转换为笛卡尔坐标
    					scene.camera.setView({destination:Cesium.Cartesian3.fromDegrees(106.453557529491150,29.476442887855072,100)});		
    				});
    					*/										
    			}	
    		</script>	
    	</head>
    	<body>
    		<div id="cesiumContainer" style="width:100%;height:100%"></div>
    	</body>
    </html>
    
    六、客户端加载数据–影像、CesiumTerrainProvider
    /加载  影像
    				var imageryLayers=viewer.imageryLayers;
    				地形可以加载一个,但影像可以加载多个
    				var imageryProvider=new Cesium.SuperMapImageryProvider({
    				url:'http://www.supermapol.com/realspace/services/3D-zf_tin_image_z/rest/realspace/datas/image'
    				});
    				var layer=imageryLayers.addImageryProvider(imageryProvider);
    				viewer.flyTo(layer);
    
    加载地形
    				var viewer=new Cesium.Viewer('cesiumContainer',{
    					terrainProvider:new Cesium.CesiumTerrainProvider({
    					url:'http://www.supermapol.com/realspace/services/3D-zf_tin_image_z/rest/realspace/datas/info',
    					requestWaterMask:true,
    					requestVertexNormals:true,
    					isSct:true//地形服务源自SuperMap iServer发布时需设置isSct为true		
    				
    					})
    				});
    				
    
    七、客户端加载数据–影像
    • var imageryProvider=new Cesium.SuperMapImageryProvider
      imageryProvider支持加载的数据类型:
      在这里插入图片描述
    八、客户端加载数据–KML
    • KML可包含点、线、面、地标、模型、动画模型等要素
    <tilt>0</tilt>
    <roll>0</roll>
    </Orientation>
    <Scale>
    <x>1</x>
    <y>1</y>
    <z>1</z>
    </Scale>
      <Link><href>../models/crane.gltf</href></Link>
      </Model>
      </Placemark>
      </kml>
    
    //上面..中包含编码
    viewer.dataSources.add(Cesium.KmlDataSource.load('kml/crane.kml',{
    	camera:viewer.scene.camera,
    	canvas:viewer.scene.canvas
    }));
    
    
    九、客户端加载数据–CZML

    CZML是一种JSON格式的字符串,其包含点、线、地标、模型等元素
    用于描述与时间有关的动画场景,加载方式如下

    var dataSource=new Cesium.CzmlDataSource();
    var czml=‘data/simple.czml’;
    dataSource.load(czml);
    viewer.dataSources.add(dataSource);

    十、客户端加载数据–GeoJson

    GeoJson是较为通用的一种网络矢量数据传输方案,加载方式如下:

    viewer.dataSources.add(Cesium.GeoJsonDataSource.load('mydata.geojson',{
    	stroke:Cesium.Color.BLUE.withAlpha(0.8),
    	strokeWidth:2.3,
    	fill:Cesium.Color.RED.withAlpha(0.3),
    	clampToGround:true
    }));
    
    展开全文
  • 三维Web应用实现流程 矢量数据和专题图 – 先保存场景,选中保存的场景单击右键, 生成场景缓存,格式为s3m。 • 精细模型&BIM; – 先保存场景,选中保存的场景单击右键, 生成场景缓存,格式为s3m; – 选中模型...
  • 特征提取与描述目标(和自身)在三维空间中的位置关系目标的三维形状及其改变、目标的位移符号识别数字图像处理三维感知首先需要指出的是,对于计算机来说视觉数据的最原始表示是数字图像——栅格(离散)化的三维...

    70370376-b914-eb11-8da9-e4434bdf6706.png
    1. 缘起
    2. 三维感知
    3. 目标识别
      3.0. 目标是什么
      3.1. 图像分割
      3.2. 纹理与材质
      3.3. 特征提取与描述
    4. 目标(和自身)在三维空间中的位置关系
    5. 目标的三维形状及其改变、目标的位移
    6. 符号识别
    7. 数字图像处理

    三维感知

    首先需要指出的是,对于计算机来说视觉数据的最原始表示是数字图像——栅格(离散)化的三维世界在二维平面的投影,如果要还原三维世界需要经过复杂而耗时的处理过程;对于人眼来说似乎接直接接收到了三维数据。不管事实到底如何,从二维数字图像入手是计算机视觉不得不做出的选择。另外,基于多视几何的从数字图像还原三维世界的技术虽然已经趋于成熟,但是并没有在计算机视觉研究者中获得广泛的关注。 目前各种分割、目标检测、跟踪等算法方面的进展集中于处理二维数字图像,由此即可窥见计算机视觉当前的进展离“得出场景的完整理解”这个目标的巨大距离。

    还需了解的是,目前基于多视几何的三维重建相关技术的首要目标并没有将“得出场景的完整理解”考虑在内,仅仅是为了建立真实世界的可视化模型——格网贴图模型,其生产过程经历了自动连接点匹配、光束法平差、极(核)线像对生成、密集立体匹配、点云融合、点云构网、纹理贴图。到密集立体匹配这一步才生成了能够代表三维世界的离散点云数据,如果要获得超过一个像对视域范围的点云数据还需要进行点云融合。

    73370376-b914-eb11-8da9-e4434bdf6706.png
    密集点云

    74370376-b914-eb11-8da9-e4434bdf6706.png
    3D格网

    75370376-b914-eb11-8da9-e4434bdf6706.png
    格网贴图3D模型

    考察我们自己理解场景的两种情形,观察真实的三维世界和观察二维图片,都可以感知到其中的三维信息。这仿佛暗示了基于多视几何的三维感知手段对于“得出场景的完整理解”并不是举足轻重的,其意义或许仅仅在于将真实三维环境与三维环境的透视投影图像区分开来,以防自主行使设备尝试走进一副画里。观察二维图片时,是如何感知三维信息的?基于个人的经验,认为利用了推理这种高级智能。在看到二维图片的一瞬间,人类就可以认出其中包含的目标,目标的二维透视投影形状以及目标在一定照明条件下形成的高光、阴影与三维形状有着对应关系,识别出对应关系就还原了三维信息。透视投影的规律是客观的,平行线消失于灭点是每个人潜意识里的常识,它并没有包含在图片当中。也就是说图片自身对于感知图片的三维信息来说并不是完备的,还需要人类智能利用总结出来的规律和常识做出推理。

    透视投影的规律是明确的,应该是计算机视觉的一项基本原理,上面的论述或许缺乏说服力。下面将给出另外一个例子,当观察一幅多山的卫星影像时,第一感觉会将稍暗的一面识别为山的南面,稍亮的一面识别为山的北面,然而却有一条流淌在山顶的河流,村庄和城镇都坐落在山峰的两侧,这是多么的诡异!直觉和认知产生了冲突,为什么会如此呢?因为在人类常处于的环境中,看得见的暗处一定是阴影,阴影处一定是前高后低。然而对于北半球上部朝北的卫星影像来说,是由太阳光从南向北照亮的,所以通常卫星影像上稍暗的一面为山的北面,稍亮的一面为山的南面。经过一定的思维训练,再次观看卫星影像时就可以直接感知到正确的三维地形。这是一个利用外部常识推理来进行三维感知出错的例子,因为所利用的外部常识并不是定律而是经常出现的事实——看得见的暗处一定是阴影,阴影处一定是前高后低。幸好还有其它的常识可以用来发现错误,比如江河绝对不会流淌在山顶上,村落和城镇不会坐落在山峰两侧。

    79370376-b914-eb11-8da9-e4434bdf6706.png
    上部朝北的卫星影像,绝大多数人都不能第一眼区分山峰和山谷

    在前文中默认了人类通过二维图片感知三维信息时首先识别出了目标,事实是否如此不得而知?至今尚未看到有人开展了相关研究。三维感知与目标识别的关系是什么? 这是本文指出的第一项计算机视觉研究中的缺失。不妨大胆的猜测,三维感知和目标识别同时开始,初始结果的出现各有先后,之后开始相互佐证。 人类在观察真实的三维世界时,是否同时使用了基于多视几何的三维感知手段和基于常识推理的三维感知手段?这两种三维感知手段之间的关系是怎么样的? 还是只能猜测,这两种三维感知手段同时进行,而目标识别则在基于多视几何的三维感知手段之后执行,同样初始结果的出现各有先后,之后开始相互佐证。这是认知心理学的问题,随着本文的展开,将会看到更多与认知心理学相关的缺失。这说起来会有点可笑,毕竟每位计算机视觉的参与者都认为计算机视觉是包含了心理学的综合学科,然而涉及到心理学的问题都是依靠参与者的直觉,更遑论猜测和验证。

    附言:

    三维感知已经成熟了,现有三维感知技术有三种结构光、多视几何、测光法。测光法可说没什么价值,只能再专用实验平台上做。结构光和多视几何都是光线三角交会的技术,很容易结合在一起取长补短。基于光线三角交会的方法最关键的就在于确定同名点(包括稀疏连接点和密集匹配),如果要建立格网贴图模型,构网和网络优化也很有难度。稀疏连接点和密集匹配方面,大家的技术都不相上下,导致效果差异的原因在于编码能力而不是理论水平构网和网络优化方面,一些公司(CC、Altizure等)有很好的解决方案,但是都作为技术秘密没有公开相关方面的论文都是无关痛痒的,真正的好东西都藏着掖着在

    可能有人会说大规模平差,其实就是一个增量平差,用的非线性优化算法都是很成熟的东西,实际情况也非常符合理论。稀疏连接点、密集匹配、构网和网络优化方面假设和实际情况符合程度要差一些。

    可以说基于光线三角交会的三维感知并没有什么需要研究的地方了,主要在于应用。今后三维点云或者深度图应该作为一种非常基础的数据被计算机视觉研究任意广泛应用。而不是用深度学习再去过拟合深度图。

    结合透视、光照直接在单图片上感知三维的方法有很大的研究价值。难度也是相当大的,目前没有任何有意义的成果。

    展开全文
  • WebGL 三维正射投影

    2019-08-01 20:35:53
    本文来自:https://webglfundamentals.org/webgl/lessons/zh_cn/webgl-3d-orthographic.html------------...
  • 针对webgl的库threejs框架项目功能实战讲解实时数据功能:对生产设备设施、传感器、开关控制的实时数据和运行状态查看,在三维场景中实时数据和状态,根据报警级别显示不同设备颜色。车辆路径导航:工厂车辆位置坐标...
  • 基于Threejs/Webgl三维实时数据&车辆路径导航功能 项目实战一 多...
  • SM_webGL三维开发笔记

    2020-02-14 12:02:18
    今天使用的软件是SuperMap iServer和webGL开发包,推荐下载iServer的64位Zip包:...三维场景能与二维场景联动么,例如鹰眼图 14:57超图-宋翔 可以的,请下载http://support.supermap.com.cn/Uploa...
  • 事件 ...用户可以监听这些事件,在事件回调中进行相应的业务逻辑处理。 事件介绍 全局绑定事件和局部绑定事件 用户的操作以及场景的变化,都将会触发相应的事件。你可以监听这些事件,然后在回调方法中做相应的处理...
  • 大数据可视化平台是通过三维表现技术来表示复杂的信息,实现对海量数据的立体呈现。可视化技术借助人脑的视觉思维能力,通过挖掘数据之间重要的关联关系将若干关联性的可视化数据进行汇总处理,揭示数据中隐含的规律...
  • 12月20日,超图集团质控与支持中心组织了岁末冲刺技术服务福利第三弹——三维空间分析,在讲解过程中就不断有朋友们在留言区提问,后面有朋友们提出将问题整理为文档,方便大家后续查看。于是,技术支持的同事们...
  • #三维可视化##3D开发# WebGL 3D技术框架-ThingJS 三维管线基础数据收集 三维管线模型分类创建 三维管线可视化系统开发 基于ThingJS的通用架构设计随着社会经济的不断发展,城市中的各类地下管线数量不断增加,...
  • 问:webgl中bingmapkey过期如何更新? 答:bingmap官网申请新的key,设置Cesium.BingMapsApi.defaultKey 问:设置好的风格的点数据生成缓存,发布服务,在webgl加载时没有数据 ...问:发布倾斜摄影三维服务后,在i...
  • 问:打开webgl包的视频投放示例,使用谷歌浏览器打开后,视频没有播放 答:在谷歌浏览器地址栏中输入:chrome://flags,搜索“Autoplay policy”,默认为“Default”,修改为 “No user gesture is required” 就...
  • supermap 9D 产品中,可以先获取到模型的simd值,再调用setOnlyObjsVisible方法控制模型中单个物体的显示和隐藏。 var smid = "94"; //楼层的smid值,多个楼层,则用数组的方式 var ids = [];...
  • 问:SuperMap iClient3D 9D for WebGL中,如何设置所有标签实体的可见距离? 答;“给每个标签实体(LabelGraphics)分别设置distanceDisplayCondition。例: entity.label.distanceDisplayCondition = new Cesium....
  • html5+webgl 三维街景的渲染

    千次阅读 2012-04-12 17:48:24
    又看到google街景和soso街景效果很炫,就产生了小试牛刀的想法,我何不把手头的图片变成渲染成三维街景放到网上呢。于是开始搜集相关信息,经过5天的尝试,终于有了初步的效果;  首先,感谢...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,839
精华内容 2,735
关键字:

webgl三维