Spring Boot WebGL小程序

Spring Boot应用连接数据库MySQL 基础上实现一个WebGL的小程序。

添加JS文件

在/webapp/static/js目录下添加glMatrix-0.9.5 .js文件。glMatrix-0.9.5 下载地址

添加图片

在/webapp/static/images目录下一个webgl.jpg图片,图片内容随意。

编写JSP文件

在/webapp/WEB-INF/jsp目录下新建一个名为webgl的jsp文件。代码 如下:

<!DOCTYPE html >
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="/static/js/glMatrix-0.9.5.js"></script>
<script id="shader-vs" type="x-shader/x-vertex">
        attribute vec3 v3Position;
        uniform mat4 um4Rotate;
        varying vec2 v_texCoord;
       void main(void)
       {
             vec4 v4pos = um4Rotate * vec4(v3Position, 1.0);
                v_texCoord = vec2((v4pos.x+1.0)/2.0, 1.0-(v4pos.y+1.0)/2.0);
                gl_Position = v4pos;
            //v_texCoord = vec2((v3Position.x+1.0)/2.0, 1.0-(v3Position.y+1.0)/2.0);
            //gl_Position = um4Rotate * vec4(v3Position, 1.0);
        }
</script>

    <script id="shader-fs" type="x-shader/x-fragment">
#ifdef GL_FRAGMENT_PRECISION_HIGH
    precision highp float;
#else
    precision mediump float;
#endif
uniform sampler2D s_texture;
varying vec2 v_texCoord;

void main(void)
{
    gl_FragColor = texture2D(s_texture, v_texCoord);
}
    </script>

<script>
function ShaderSourceFromScript(scriptID)
{
    var shaderScript = document.getElementById(scriptID);
    if (shaderScript == null) return "";

    var sourceCode = "";
    var child = shaderScript.firstChild;
    while (child)
    {
        if (child.nodeType == child.TEXT_NODE ) sourceCode += child.textContent;
        child = child.nextSibling;
    }

    return sourceCode;
}

var webgl = null;
var vertexShaderObject = null;
var fragmentShaderObject = null;
var programObject = null;
var triangleBuffer = null; 
var v3PositionIndex = 0;
var textureObject = null;
var samplerIndex = -1;
var interval = 300;
var angle = 0;
var um4RotateIndex = -1;

function LoadData()
{
    var jsArrayData = [
        0.0, 0.5, 0.0,//上顶点
        -0.5, -0.5, 0.0,//左顶点
        0.5, 0.0, 0.0];//右顶点

    triangleBuffer = webgl.createBuffer();
    webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer);
    webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(jsArrayData), webgl.STATIC_DRAW);

    textureObject = webgl.createTexture();
    webgl.bindTexture(webgl.TEXTURE_2D, textureObject);
    var img = document.getElementById('myTexture');
    webgl.texImage2D(webgl.TEXTURE_2D, 0, webgl.RGB, webgl.RGB, webgl.UNSIGNED_BYTE, img);

    return 0;
}

function RenderScene()
{
    webgl.clearColor(0.0, 0.0, 0.0, 1.0);
    webgl.clear(webgl.COLOR_BUFFER_BIT);

    webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer); 
    webgl.enableVertexAttribArray(v3PositionIndex); 
    webgl.vertexAttribPointer(v3PositionIndex, 3, webgl.FLOAT, false, 0, 0);

    webgl.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_MIN_FILTER, webgl.NEAREST);
    webgl.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_MAG_FILTER, webgl.NEAREST);
    webgl.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_WRAP_S, webgl.CLAMP_TO_EDGE);
    webgl.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_WRAP_T, webgl.CLAMP_TO_EDGE);

    webgl.activeTexture(webgl.TEXTURE0);
    webgl.bindTexture(webgl.TEXTURE_2D, textureObject);
    webgl.uniform1i(samplerIndex, 0);

    var m4Rotate = mat4.create();
    mat4.identity(m4Rotate);
    mat4.rotateZ(m4Rotate, angle*Math.PI/180);
    webgl.uniformMatrix4fv(um4RotateIndex, false, m4Rotate);

    webgl.drawArrays(webgl.TRIANGLES, 0, 3);
}

function RotateTriangle()
{
 angle += 10;
 if(angle >= 360) angle -= 360;

 RenderScene();
}

function Init()
{
    var myCanvasObject = document.getElementById('myCanvas');
    webgl = myCanvasObject.getContext("experimental-webgl");

    webgl.viewport(0, 0, myCanvasObject.clientWidth, myCanvasObject.clientHeight);

    vertexShaderObject = webgl.createShader(webgl.VERTEX_SHADER);
    fragmentShaderObject = webgl.createShader(webgl.FRAGMENT_SHADER);

    webgl.shaderSource(vertexShaderObject, ShaderSourceFromScript("shader-vs"));
    webgl.shaderSource(fragmentShaderObject, ShaderSourceFromScript("shader-fs"));

    webgl.compileShader(vertexShaderObject);
    webgl.compileShader(fragmentShaderObject);

    if(!webgl.getShaderParameter(vertexShaderObject, webgl.COMPILE_STATUS)){alert(webgl.getShaderInfoLog(vertexShaderObject));return;}
    if(!webgl.getShaderParameter(fragmentShaderObject, webgl.COMPILE_STATUS)){alert(webgl.getShaderInfoLog(fragmentShaderObject));return;}

    programObject = webgl.createProgram();

    webgl.attachShader(programObject, vertexShaderObject);
    webgl.attachShader(programObject, fragmentShaderObject);

    webgl.bindAttribLocation(programObject, v3PositionIndex, "v3Position");

    webgl.linkProgram(programObject);
    if(!webgl.getProgramParameter(programObject, webgl.LINK_STATUS)){alert(webgl.getProgramInfoLog(programObject));return;}

    samplerIndex = webgl.getUniformLocation(programObject, "s_texture");
    um4RotateIndex = webgl.getUniformLocation(programObject, "um4Rotate");

    webgl.useProgram(programObject);

    if(LoadData() != 0){alert("error:LoadData()!");return;}
    window.setInterval("RotateTriangle()", interval);
}
</script>
    </head>
    <body  onload='Init()'>
        <img id = "myTexture" src ="/static/images/webgl.jpg" style = "display:None"/>
        <canvas id="myCanvas" style="border:1px solid red;" width='600px' height='450px'></canvas>
    </body>
    <script src="/static/js/jquery-3.1.1.min.js"></script>
</html>

编写控制器Controller

在一个控制器类添加下面代码。

@RequestMapping("/webgl")
public String testWebGL() {
    return "webgl";
}

运行

网页的显示框动态变化,下面是截图:
这里写图片描述

这里写图片描述

返回 Java EE Web开发系列导航

<think>好的,用户想了解或开发与AEC相关的小程序。首先我需要明确AEC在这里的具体含义。AEC通常指“Architecture, Engineering, and Construction”,即建筑、工程和施工行业。接下来,我需要考虑用户可能的背景和需求。他们可能是开发者、行业从业者,或者企业想通过小程序优化工作流程。 首先,用户可能需要了解AEC行业在小程序中的应用场景。比如,BIM模型查看、项目协同管理、施工进度跟踪等。需要列举一些典型的小程序功能,帮助他们明确方向。 然后,开发AEC相关小程序需要哪些技术支持?可能需要提到3D可视化引擎(如Three.js)、云存储(如阿里云OSS)、实时通信(WebSocket)以及后端框架(Django、Spring Boot)。这些技术点能帮助用户了解开发的基础架构。 用户可能还关心开发流程,所以需要分步骤说明:需求分析、技术选型、核心功能开发、测试优化和上线维护。每个步骤简要说明重点,让用户有清晰的路线图。 另外,用户可能想参考现有案例,比如Autodesk Viewer的小程序版、施工管理工具或材料计算器。这些案例能提供实际应用的启发,并帮助他们找到灵感。 最后,生成相关问题,引导用户进一步思考或解决可能遇到的疑问。比如,如何实现BIM模型在小程序中的渲染?如何保障数据安全?这些问题是开发过程中常见的挑战,用户可能需要更深入的指导。 需要确保回答结构清晰,信息准确,并且符合用户的中文需求。同时,按照系统指令正确使用数学公式的格式,不过在这个主题下可能涉及较少数学内容,但要注意其他格式要求,如代码块和引用标识。检查是否有合适的引用来源,比如提到的Autodesk Viewer和腾讯云文档,确保引用正确标注。 总结下来,回答需要覆盖应用场景、技术要点、开发步骤、案例参考以及相关问题,帮助用户全面了解AEC小程序的开发方向和关键点,同时符合格式规范。</think>### AEC相关微信小程序的开发与信息 AEC(建筑、工程与施工)行业的小程序开发需结合行业特性和技术需求,以下是关键方向和技术要点: #### 1. **AEC小程序典型应用场景** - **BIM模型轻量化查看**:通过微信小程序展示建筑信息模型(BIM),支持旋转、缩放、构件属性查询[^1]。 - **项目协同管理**:实时更新施工进度、任务分配与文档共享,例如基于WebSocket的即时通信模块。 - **工程量计算工具**:集成公式引擎,例如混凝土用量计算:$$V = L \times W \times H$$,支持输入参数自动生成结果。 - **AR/VR现场辅助**:结合摄像头与AR技术,实现管线布置模拟或安全巡检。 #### 2. **技术实现要点** - **3D可视化**:使用Three.js或Babylon.js等库渲染BIM模型,需优化模型轻量化(如GLTF格式)。 - **数据存储与同步**:采用云开发(腾讯云)或自建后端(Node.js/Django),存储项目数据及用户权限管理。 - **实时协作**:通过WebSocket或MQTT协议实现多端数据同步,例如施工日志更新[^2]。 - **安全与性能**:数据加密传输(HTTPS+JWT)、模型分块加载以降低内存占用。 #### 3. **开发步骤示例** ```javascript // 示例:小程序中调用Three.js渲染模型(需使用WebGL Canvas) Page({ onReady() { const canvas = wx.createOffscreenCanvas({ type: 'webgl' }); const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, canvas.width / canvas.height, 0.1, 1000); const renderer = new THREE.WebGLRenderer({ canvas: canvas }); // 加载GLTF模型 const loader = new THREE.GLTFLoader(); loader.load('model.gltf', (gltf) => { scene.add(gltf.scene); }); } }); ``` #### 4. **参考案例与资源** - **Autodesk Viewer小程序版**:提供BIM模型查看与批注功能(需对接Forge API)。 - **施工进度管理工具**:如“腾讯微工”小程序,支持甘特图与任务分配。 - **行业文档**:腾讯云《小程序开发指南》中关于3D渲染的优化方案[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值