Форум программистов, компьютерный форум, киберфорум
JavaScript: HTML5 Canvas
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
8 / 8 / 1
Регистрация: 01.04.2016
Сообщений: 622

Webgl plane

13.03.2022, 11:32. Показов 1276. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
существует ли возможность создать в webgl плоскость, на которой можно размещать любые html элементы.
но чтобы это была именно плоскость с возможностью текстурирования и перемещения в трехмерном пространстве.
или говоря образнее, этакий div но уже с возможностью трехмерного перемещения
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.03.2022, 11:32
Ответы с готовыми решениями:

WebGL
Подскажите, как можно пустить объект вдоль определенной линии, например землю вокруг солнца.

фрэймворк WebGL
В блоге Sencha 22 февраля был представлен новый фрэймворк под названием PhiloGL. Как утверждает разработчик Nicolas Belmonte работая над...

фотогалерея WebGL
Подскажите пожалуйста! Проблема такая: создаю фото галерею в WebGL в виде крутящегося куба, на котором отображаются фотографии, по 9 на...

5
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,979
Записей в блоге: 235
18.03.2022, 20:07
Цитата Сообщение от Atarion Посмотреть сообщение
существует ли возможность создать в webgl плоскость, на которой можно размещать любые html элементы
WebGL умеет рисовать примитивы: точки, линии, треугольники. Из треугольников можно рисовать любые более сложные объекты: кубы, пирамиды, произвольные объекты из материального мира и т.д. WebGL умеет натягивать рисунки на объекты. Но в WebGL нет никаких возможностей работать с HTML-элементами. Если только вы сами не напишите свой способ отображения элементов, используя параметры HTML-элементов. Например, кнопка, где размеры берутся из HTML-кнопки, а кнопка отображается в виде текстуры.

Единственное, можно использовать дополнительные элементы <canvas> в качестве источников текстур. Например, у вас есть основной элемент <canvas>, который вы используете в контексте "webgl". Вы можете создать другой элемент <canvas>, но в контексте "2d" и нарисовать на нём что угодно, что можно нарисовать с помощью Canvas API. Далее, вы можете использовать этот элемент с Canvas API в качестве текстуры для основного <canvas> на WebGL. По такому принципу реализуется одна из техник отображения текста на WebGL из другого элемента <canvas>, где текст рисуется на Canvas API. Такой пример есть в книге WebGL. Программирование трехмерной графики

https://codepen.io/8Observer8/pen/eYyZZzw

Название: 43b4a9b8e7c7de0153b904ccfe6003dc796c6f10.png
Просмотров: 86

Размер: 14.2 Кб

PHP/HTML
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
    <canvas id="webgl" width="400" height="400">
        Please use a browser that supports "canvas"
    </canvas>
 
    <script type="x-shader/x-vertex" id="VertexShader">
        attribute vec4 a_Position;
        attribute vec2 a_TexCoord;
        varying vec2 v_TexCoord;
 
        void main()
        {
            gl_Position = a_Position;
            v_TexCoord = a_TexCoord;
        }
    </script>
 
    <script type="x-shader/x-fragment" id="FragmentShader">
        precision mediump float;
 
        uniform sampler2D u_Sampler;
        varying vec2 v_TexCoord;
 
        void main()
        {
            gl_FragColor = texture2D(u_Sampler, v_TexCoord);
        }
    </script>
 
    <script src="https://dl.dropboxusercontent.com/s/ylw7v7a44xtrwv0/webgl-utils.js"></script>
    <script src="https://dl.dropboxusercontent.com/s/iz1n21c8xafd76n/webgl-debug.js"></script>
    <script src="https://dl.dropboxusercontent.com/s/subm1yzylxuao8v/cuon-utils.js"></script>
    <script src="https://dl.dropboxusercontent.com/s/jw3p82lq1cjwekg/cuon-matrix.js"></script>
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
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
// TextTexture.js (c) 2012 kanda and matsuda
// This is an example from the book "WebGL Programming Guide"
// by Kouichi Matsuda and Rodger Lea
 
main();
//window.onload = main;
 
function main()
{
    // Retrieve <canvas> element
    var canvas = document.getElementById("webgl");
 
    // Get the rendering context for WebGL
    var gl = getWebGLContext(canvas);
    if (!gl)
    {
        console.log('Failed to get the rendering context for WebGL');
        return;
    }
 
    // Get shader elements
    var vShaderElement = document.getElementById("VertexShader");
    var fShaderElement = document.getElementById("FragmentShader");
    if (vShaderElement == null)
    {
        console.log("Failed to get the vertex shader element");
        return;
    }
    if (fShaderElement == null)
    {
        console.log("Failed to get the fragment shader element");
        return;
    }
 
    // Get shader sources
    var vShaderSource = vShaderElement.firstChild.textContent;
    var fShaderSource = fShaderElement.firstChild.textContent;
 
    // Initialize shaders
    if (!initShaders(gl, vShaderSource, fShaderSource))
    {
        console.log('Failed to intialize shaders.');
        return;
    }
 
    // Set the vertex information
    if (!initVertexBuffers(gl))
    {
        console.log('Failed to set the vertex information');
        return;
    }
 
    // Set texture
    if (!initTextures(gl))
    {
        console.log('Failed to intialize the texture.');
        return;
    }
 
    draw(gl);
}
 
function initVertexBuffers(gl)
{
    var positions = [
      -0.5, 0.5,
      -0.5, -0.5,
       0.5, 0.5,
       0.5, -0.5
    ];
    var texCoords = [
      0.0, 1.0,
      0.0, 0.0,
      1.0, 1.0,
      1.0, 0.0,
    ];
 
    // Create a buffer object
    var pbuffer = gl.createBuffer();
    var tbuffer = gl.createBuffer();
    if (!pbuffer || !tbuffer)
    {
        console.log('Failed to create buffer object(s)');
        return false;
    }
 
    // Write vertex information to buffer object
    gl.bindBuffer(gl.ARRAY_BUFFER, pbuffer);
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
    var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
    if (a_Position < 0)
    {
        console.log('Failed to get the storage location of a_Position');
        return -1;
    }
    gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
    gl.enableVertexAttribArray(a_Position);
 
    // Set texture coordinates
    gl.bindBuffer(gl.ARRAY_BUFFER, tbuffer);
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(texCoords), gl.STATIC_DRAW);
    var a_TexCoord = gl.getAttribLocation(gl.program, 'a_TexCoord');
    if (a_TexCoord < 0)
    {
        console.log('Failed to get the storage location of a_TexCoord');
        return -1;
    }
    gl.vertexAttribPointer(a_TexCoord, 2, gl.FLOAT, false, 0, 0);
    gl.enableVertexAttribArray(a_TexCoord);
 
    return true;
}
 
function initTextures(gl)
{
    // Get the storage location of u_Sampler
    var samplerLoc = gl.getUniformLocation(gl.program, 'u_Sampler');
    if (!samplerLoc)
    {
        console.log('Failed to get the storage location of u_Sampler');
        return false;
    }
 
    // Create a texture
    var texture = gl.createTexture();
    if (!texture)
    {
        console.log("Failed to create the texture");
        return false;
    }
 
    // Create <canvas> to draw a text
    var textCanvas = document.createElement('canvas');
    if (!textCanvas)
    {
        console.log('Failed to create canvas');
        return false;
    }
 
    // Set the size of <canvas>
    textCanvas.width = 256;
    textCanvas.height = 256;
 
    // Get the rendering context for 2D
    var ctx = textCanvas.getContext('2d');
    if (!ctx)
    {
        console.log('Failed to get rendering context for 2d context');
        return false;
    }
 
    // Clear <canvas> with a white
    ctx.fillStyle = 'rgba(53, 60, 145, 1.0)';
    ctx.fillRect(0, 0, textCanvas.width, textCanvas.height);
 
    // Set text properties
    ctx.font = '42px bold sans-serif';
    ctx.fillStyle = 'rgba(53, 60, 145, 1.0)';
    ctx.textBaseline = 'middle';
 
    ctx.shadowColor = 'rgba(19, 169, 184, 1.0)';
    ctx.shadowOffsetX = 3;
    ctx.shadowOffsetY = 3;
    ctx.shadowBlur = 4;
 
    // Draw a text
    var text = 'WebGL';
    var textWidth = ctx.measureText(text).width;
    ctx.fillText(text, (textCanvas.width - textWidth) / 2, textCanvas.height / 2 - 10);
    text = 'Programming';
    textWidth = ctx.measureText(text).width;
    ctx.fillText(text, (textCanvas.width - textWidth) / 2, textCanvas.height / 2 + 25);
    text = 'Guide';
    textWidth = ctx.measureText(text).width;
    ctx.fillText(text, (textCanvas.width - textWidth) / 2, textCanvas.height / 2 + 60);
    ctx.font = '20px bold sans-serif';
    ctx.fillStyle = 'white';
    ctx.shadowColor = 'rgba(53, 60, 145, 1.0)';
    text = 'matsuda & lea';
    textWidth = ctx.measureText(text).width;
    ctx.fillText(text, (textCanvas.width - textWidth) / 2, textCanvas.height / 2 + 100);
 
    // Load texture
    gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);  // Flip the image Y coordinate
    gl.bindTexture(gl.TEXTURE_2D, texture);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textCanvas);
 
    // Set texture parameters
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
 
    // Pass the texure unit 0 to u_Sampler
    gl.uniform1i(samplerLoc, 0);
 
    return true;
}
 
function draw(gl)
{
    gl.clearColor(0.0, 0.0, 0.0, 1.0);
    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
}
1
8 / 8 / 1
Регистрация: 01.04.2016
Сообщений: 622
19.03.2022, 08:42  [ТС]
секундочку, а разве на самом canvas нельзя распологать элементы средствами обычного html?
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,979
Записей в блоге: 235
19.03.2022, 11:18
Лучший ответ Сообщение было отмечено Atarion как решение

Решение

Цитата Сообщение от Atarion Посмотреть сообщение
а разве на самом canvas нельзя распологать элементы средствами обычного html?
Я нагуглил, что напрямую нет, но есть библиотеки для эмуляции: https://stackoverflow.com/ques... -to-canvas Поэтому можно сначала на Canvas API, а потом использовать <canvas> как текстуру и нарисовать эту текстуру на прямоугольнике на WebGL.

Перевёл первый ответ с помощью Translate Google:

В настоящее время вы не получите реальный HTML-рендеринг в <canvas> как таковой, потому что контекст холста не имеет функций для рендеринга HTML-элементов.

Есть эмуляции:

проект html2canvas http://html2canvas.hertzen.com/index.html (в основном попытка визуализации HTML, построенная на Javascript + canvas)

HTML в SVG в <canvas> может быть возможен в зависимости от вашего варианта использования:

https://github.com/miohtama/Kr... 2canvas.js

Кроме того, если вы используете Firefox, вы можете взломать некоторые расширенные разрешения, а затем отобразить окно DOM в <canvas>

https://developer.mozilla.org/... o_A_Canvas
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
20.03.2022, 23:54
Цитата Сообщение от Atarion Посмотреть сообщение
этакий div но уже с возможностью трехмерного перемещения
Для этого не нужен WebGL CSS3 3D-трансформации
2
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,979
Записей в блоге: 235
21.03.2022, 15:24
В Babylon.js есть готовое 3D GUI на WebGL: https://doc.babylonjs.com/divingDeeper/gui/gui3D
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.03.2022, 15:24
Помогаю со студенческими работами здесь

WEBGL и Blender
Подскажите пожалуйста, как из Blender'а экспортировать массив вершин и индексов, которые можно использовать в webgl? Добавлено через...

Матрицы и webgl
Здравствуйте, уважаемые программисты! Помогите разобраться с матрицами( как их создавать, изменять, вставлять в программу). Пробовал...

Alpha blending в webgl
Здравствуйте, программисты. Есть проблема с прозрачностью объектов в webgl. код, который добавляет прозрачность: ...

Мощная презентация WebGL
Разработчики Blend4Web одновременно с релизом опубликовали новую, крутую презентацию. Это виртуальный завод молочной промышленности с очень...

Оптимизировать WebGL useProgram
Я оптимизировал в WebGL уже все что мог, у меня динамические объекты, обновляются с помощью requestAnimationFrame, но когда наделал много...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru