С Новым годом! Форум программистов, компьютерный форум, киберфорум
8Observer8
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Рисование квадратов, координаты которых считываются с удалённой базы данных MySQL и передаются с сервера через WebSocket

Запись от 8Observer8 размещена 13.01.2021 в 23:16
Показов 4034 Комментарии 0
Метки db, mysql

Содержание блога

Скачать исходники: squares-from-mysql-webgl10-js.zip (3.5 Кб)

Развернул пример на бесплатном хостинге Heroku: https://squares-from-mysql-web... kuapp.com/

Ограничение на бесплатном хостинге Heroku такое, что если приложением не пользовались 30 минут, то оно засыпает, но чтобы приложение проснулось достаточно 10-15 секунд. В настройках приложения на Heroku я соединил приложение с репозиторием на GitHub, чтобы происходило автоматическое развёртывание после каждого коммита (git push).

Исходники


index.html

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <title>Triangles from DB. WebGL 1.0, JavaScript</title>
    <script src="https://cdn.jsdelivr.net/npm/gl-matrix@3.3.0/gl-matrix-min.js"></script>
</head>
 
<body>
    <canvas id="renderCanvas" width="300" height="300"></canvas>
 
    <script type="x-shader/x-vertex" id="vertexShader">
        attribute vec3 aPosition;
        uniform mat4 uMvpMatrix;
        void main()
        {
            gl_Position = uMvpMatrix * vec4(aPosition, 1.0);
        }
    </script>
 
    <script type="x-shader/x-fragment" id="fragmentShader">
        void main()
        {
            gl_FragColor = vec4(0.5, 0.5, 1.0, 1.0);
        }
    </script>
 
    <script>
        const gl = document.getElementById("renderCanvas").getContext("webgl");
        const program = createProgram();
        const n = initVertexBuffers(program);
        const mpMatrix = glMatrix.mat4.create();
        const projMatrix = glMatrix.mat4.create();
        const viewMatrix = glMatrix.mat4.create();
        const modelMatrix = glMatrix.mat4.create();
        let coords;
 
        function main()
        {
            const socket = new WebSocket("ws://localhost:3000");
            // const socket = new WebSocket("wss://squares-from-mysql-webgl10-js.herokuapp.com");
 
            socket.onopen = () =>
            {
                console.log("Client connected");
 
                socket.onmessage = (event) =>
                {
                    coords = JSON.parse(event.data);
                    draw();
                };
            };
        }
        window.onload = () => main();
 
        function draw()
        {
            glMatrix.mat4.ortho(projMatrix, 0, 10, 10, 0, -50, 50);
            glMatrix.mat4.lookAt(viewMatrix, [0, 0, 40], [0, 0, 0], [0, 1, 0]);
 
            gl.clearColor(0.2, 0.2, 0.2, 1.0);
            gl.clear(gl.COLOR_BUFFER_BIT);
 
            coords.forEach(c =>
            {
                glMatrix.mat4.fromScaling(modelMatrix, glMatrix.vec3.fromValues(1, 1, 1));
                glMatrix.mat4.translate(modelMatrix, modelMatrix, glMatrix.vec3.fromValues(c.x, c.y, 0));
                glMatrix.mat4.rotate(modelMatrix, modelMatrix, 0 * Math.PI / 180, glMatrix.vec3.fromValues(0, 0, 1));
                glMatrix.mat4.mul(mpMatrix, projMatrix, modelMatrix);
                const uMvpMatrixLocation = gl.getUniformLocation(program, "uMvpMatrix");
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mpMatrix);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
            });
        }
 
        function initVertexBuffers(program)
        {
            const vertPositions = new Float32Array([
                0, 1, 0,
                1, 1, 0,
                0, 0, 0,
                1, 0, 0
            ]);
            const vertPosBuffer = gl.createBuffer();
            gl.bindBuffer(gl.ARRAY_BUFFER, vertPosBuffer);
            gl.bufferData(gl.ARRAY_BUFFER, vertPositions, gl.STATIC_DRAW);
            gl.bindAttribLocation(program, 0, "aPosition");
            gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
            gl.enableVertexAttribArray(0);
        }
 
        function createProgram()
        {
            const vShaderSource = document.getElementById("vertexShader").firstChild.textContent;
            const vShader = gl.createShader(gl.VERTEX_SHADER);
            gl.shaderSource(vShader, vShaderSource);
            gl.compileShader(vShader);
            const fShaderSource = document.getElementById("fragmentShader").firstChild.textContent;
            const fShader = gl.createShader(gl.FRAGMENT_SHADER);
            gl.shaderSource(fShader, fShaderSource);
            gl.compileShader(fShader);
            const program = gl.createProgram();
            gl.attachShader(program, vShader);
            gl.attachShader(program, fShader);
            gl.linkProgram(program);
            gl.useProgram(program);
            return program;
        }
    </script>
</body>
 
</html>
app.js

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
const express = require("express");
const http = require("http");
const path = require("path");
const WebSocket = require("ws");
const mysql = require("mysql2");
 
const app = express();
app.use(express.static(path.join(__dirname, "../../public")));
app.get("/", (req, res) => { res.sendFile(path.join(__dirname, "../../public/index.html")); });
 
const httpServer = http.createServer(app);
const wss = new WebSocket.Server({ server: httpServer });
 
wss.on("connection", (socket) =>
{
    console.log("Client connected");
 
    // Local host
    const pool = mysql.createPool({
        connectionLimit: 10,
        host: "localhost",
        user: "root",
        password: "your_password",
        database: "squares_db"
    }).promise();
 
    pool.query("select * from squares")
        .then(result =>
        {
            console.log(result[0]);
            socket.send(JSON.stringify(result[0]));
        })
        .catch(err =>
        {
            console.log(err.message);
        });
});
 
const port = process.env.PORT || 3000;
httpServer.listen(port, () =>
{
    console.log("Server started. Port:", port);
});
package.json

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "name": "squares-from-db-webgl10-js",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node src/server/app.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1",
    "mysql2": "^2.2.5",
    "ws": "^7.3.1"
  }
}


Команда для создания базы данных из HeidiSQL:

SQL
1
2
3
4
CREATE TABLE squares (id INTEGER AUTO_INCREMENT PRIMARY KEY, x FLOAT, y FLOAT);
INSERT INTO squares (x, y) VALUES (0, 1);
INSERT INTO squares (x, y) VALUES (3, 4);
INSERT INTO squares (x, y) VALUES (8, 8);
Клиент подключается к серверу через WebSocket. Сервер в обработчике подключения клиента отсылает ему через сокет массив координат квадратов, считанных из базы данных MySQL. Если у вас нет опыта работы с MySQL из Node.js, то рекомендую начать с туториалов на сайте Metanit:

Для работы с базой данных MySQL использую бесплатную легковесную программу HeidiSQL. Metanit использует "MySQL Workbench", но Workbench занимает очень много места на жёстком, по-моему, в районе 1 ГБайт и много оперативной памяти, а HeidiSQL занимает на жёстком всего 33.2 МБ и 26.5 МБайт оперативной памяти.
Изображения
 
Вложения
Тип файла: zip squares-from-mysql-webgl10-js.zip (3.5 Кб, 1524 просмотров)
Метки db, mysql
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru