Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
1

Разбор решения canvas

28.09.2016, 19:50. Показов 1028. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
(function(){
  'use strict';
  
  var tau = Math.PI * 2;
  var width, height;
  var mode;
  var scene, camera, renderer, pointCloud;
  
  THREE.ImageUtils.crossOrigin = '';
  
  var SETTINGS = [{
   
    particleCount: 100000,
    material: new THREE.PointCloudMaterial({ 
      size: 0.1, 
      color: 0xfff,
      transparent: true,
      opacity: 0.5
    }),
    initialize: null,
    spawnBehavior: function(index){
      var x, y, z;
 
      x = (Math.random() * 2000) - 1000;
      y = (Math.random() * 2000) - 1000;
      z = (Math.random() * 2000) - 1000;
      return new THREE.Vector3(x, y, z);
    },
    frameBehavior: null,
    sceneFrameBehavior: function(){
      camera.rotation.x -= 0.000015; 
      camera.rotation.y += 0.00005;
      camera.rotation.z += 0.00005;
      camera.translateZ(-1);
    }
  }]
  
  
  function onDocumentReady(){
    initialize();
  }
  
  function addModeButtons(){
    var buttons = document.getElementById('buttons');
    _.forEach(SETTINGS, function(mode){
      var button = document.createElement('button');
      button.textContent = mode.name;
      
      button.addEventListener('click', function(){
        setMode(mode);
      });
      buttons.appendChild(button);
    });
  }
  
  function initialize(){
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera(120, width / height, 1, 1000);
    renderer = new THREE.WebGLRenderer();
    document.body.appendChild(renderer.domElement);
    window.addEventListener('resize', onWindowResize);
    onWindowResize();
     
    addModeButtons();
    
    scene.fog = new THREE.Fog(0, 1);
    setMode(SETTINGS[SETTINGS.length-1]);
    
    var controls = new THREE.OrbitControls( camera, renderer.domElement );
      controls.enableDamping = true;
      controls.dampingFactor = 0.25;
      controls.enableZoom = false;
 
    
    AnimationController.registerAnimation(render);
  }
  
  function setMode(_mode){
    mode = _mode;
    scene.remove(pointCloud);
    resetCamera();
    
    var points = createPoints(mode.spawnBehavior);
    var material = mode.material;
    
    pointCloud = new THREE.PointCloud(points, material);
    
    if(mode.initialize && typeof mode.initialize === 'function'){
      mode.initialize();
    }
    scene.add(pointCloud);
  }
  
  function createPoints(spawnBehavior){
    var ret = new THREE.Geometry();
    
    _.times(mode.particleCount, function(index){
      ret.vertices.push(spawnBehavior(index));
    })
    
    return ret;
  }
  
  function onWindowResize(){
    width = window.innerWidth;
    height = window.innerHeight;
    updateRendererSize();
  }
  
  function resetCamera(){
    camera.position.x = camera.position.y = camera.position.z = camera.rotation.x = camera.rotation.y = camera.rotation.z = 0;
  }
  
  function updateRendererSize(){
    renderer.setSize(window.innerWidth, window.innerHeight);
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
  }
  
  function updateParticles(){
    if(mode.sceneFrameBehavior && typeof mode.sceneFrameBehavior === 'function'){
      mode.sceneFrameBehavior();
    }
    if(mode.frameBehavior && typeof mode.frameBehavior === 'function'){
      _.forEach(pointCloud.geometry.vertices, mode.frameBehavior);
      pointCloud.geometry.verticesNeedUpdate = true;
      pointCloud.geometry.colorsNeedUpdate = true;
    }
  }
  
  function render(){
    updateParticles();
    renderer.render(scene, camera);
  }
  
  document.addEventListener('DOMContentLoaded', onDocumentReady);
})();
Данный код рисует что то наподобие снега, бесконечно падающего, как при вьюге. Разбираюсь в коде, но не могу найти только одного, как задается элемент, который собственно падает. сейчас они изображены квадратиками. В поиске находил решения с шарами, но рисовались они по другому методу. Кто знаком с этой сферой, помогите плиз.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2016, 19:50
Ответы с готовыми решениями:

Задачи и решения к задачам на тему "Грамматический разбор"
Доброго времени суток.Большая просьба, может кто подскажет какие-нибудь задачи и решения к задачам...

Canvas html5, как разместить черный пискель в центре canvas'a?
как разместить черный пискель в центре canvas'a?

Можно ли одной процедурой рисовать на Image.Canvas и Printer.Canvas
Здравствуйте, пожалуйста, подскажите можно ли одной процедурой рисовать на Image.Canvas и...

построить функцию y=kx+b (линейная функция) с помощью Vcart или canvas (form.canvas)
Надо построить функцию y=kx+b (линейная функция) с помощью Vcart или canvas (form.canvas)

18
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
28.09.2016, 20:06 2
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
Данный код рисует что то наподобие снега, бесконечно падающего, как при вьюге.
Вы не могли бы прикрепить архив с проектом? Интересно посмотреть, как это выглядит.
0
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
28.09.2016, 20:13  [ТС] 3
сли можно тут ссылки давать

Добавлено через 16 секунд
http://codepen.io/xhepigerta/pen/YqZKKr
1
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
28.09.2016, 20:37 4
Я никак не могу понять, что за знак подчёркивания в коде:

Javascript
1
2
3
4
5
6
7
8
9
10
11
    function createPoints(spawnBehavior)
    {
        var ret = new THREE.Geometry();
 
        _.times(mode.particleCount, function (index)
        {
            ret.vertices.push(spawnBehavior(index));
        })
 
        return ret;
    }
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
28.09.2016, 21:07 5
В общем, я перенёс код для запуска локально, подключил библиотеку three.js, но при запуске выдаётся сообщение об ошибке:

Uncaught ReferenceError: _ is not defined (app.js:50)
Исходники проекта:
Вложения
Тип файла: zip Snowstorm.zip (122.4 Кб, 7 просмотров)
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
28.09.2016, 21:25 6
Мне сейчас удалось узнать, где посмотреть, что это означает: http://underscorejs.org/#times
0
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
29.09.2016, 08:18  [ТС] 7
<script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/r77/three.min.js'></script>
<script src='http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js'></script>
<script src='http://cdn.rawgit.com/antishow/animation-controller/master/animation-controller.js'></script>
<script src='https://cdn.rawgit.com/mrdoob/three.js/master/examples/js/controls/OrbitControls.js'></script>

ПОдключите в хедере эти файлы
1
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
29.09.2016, 10:01 8
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
<script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/r77/three.min.js'></script>
<script src='http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js'></script>
<script src='http://cdn.rawgit.com/antishow/animation-controller/master/animation-controller.js'></script>
<script src='https://cdn.rawgit.com/mrdoob/three.js/master/examples/js/controls/OrbitControls.js'></script>
ПОдключите в хедере эти файлы
Локально запускается, но если загрузить на свой сайт, то не работает: https://8observer8.github.io/ThreeJS/Snowstorm/

Говорит, что:
Mixed Content: The page at 'https://8observer8.github.io/ThreeJS/Snowstorm/' was loaded over HTTPS, but requested an insecure script 'http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js'. This request has been blocked; the content must be served over HTTPS.
8observer8.github.io/:1

Mixed Content: The page at 'https://8observer8.github.io/ThreeJS/Snowstorm/' was loaded over HTTPS, but requested an insecure script 'http://cdn.rawgit.com/antishow/animation-controller/master/animation-controller.js'. This request has been blocked; the content must be served over HTTPS.
Попробую поискать в чём проблема.

Добавлено через 2 минуты
Ему не нравится, то что соединение http, а не защищённое: https
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
29.09.2016, 10:47 9
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Ему не нравится, то что соединение http, а не защищённое: https
Я решил проблему тем, что я скачал все библиотеки. Теперь запускается: https://8observer8.github.io/ThreeJS/Snowstorm/

Сразу так зимой повеяло. Надо что-то новогоднее делать. Кстати, меня впечатлили демки ThreeJS на оф. сайте

Исходники проекта:
Вложения
Тип файла: zip Snowstorm.zip (159.8 Кб, 0 просмотров)
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
29.09.2016, 11:22 10
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
Разбираюсь в коде, но не могу найти только одного, как задается элемент, который собственно падает. сейчас они изображены квадратиками.
Они задаются в этом коде, можно настраивать:

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
    var SETTINGS = [{
 
        particleCount: 100000,
        material: new THREE.PointCloudMaterial({
            size: 1,
            color: 0xfff,
            transparent: true,
            opacity: 0.5
        }),
        initialize: null,
        spawnBehavior: function (index)
        {
            var x, y, z;
 
            x = (Math.random() * 2000) - 1000;
            y = (Math.random() * 2000) - 1000;
            z = (Math.random() * 2000) - 1000;
            return new THREE.Vector3(x, y, z);
        },
        frameBehavior: null,
        sceneFrameBehavior: function ()
        {
            camera.rotation.x -= 0.002;
            camera.rotation.y += 0.0085;
            camera.rotation.z += 0.00425;
            camera.translateZ(-1);
        }
    }]
Добавлено через 16 минут
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
сейчас они изображены квадратиками
Вы хотите изменить форму элементов?

Добавлено через 14 минут
Судя по всему, как я понял из этих нескольких строк, вместо квадратиков можно загрузить своё изображение с помощью THREE.ImageUtils.loadTexture()
0
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
30.09.2016, 15:09  [ТС] 11
В этом коде непосредственно задается количество квадратиков, размер, цвет, прозрачность, дальность камеры от них и вроде точки появления
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
30.09.2016, 19:59 12
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
и вроде точки появления
Да, но только не понятно, почему в функцию, которая возвращает точку появления передаётся параметр index:

Javascript
1
2
3
4
5
6
7
8
9
        spawnBehavior: function (index)
        {
            var x, y, z;
 
            x = (Math.random() * 2000) - 1000;
            y = (Math.random() * 2000) - 1000;
            z = (Math.random() * 2000) - 1000;
            return new THREE.Vector3(x, y, z);
        }
Math.random() генерирует число от 0 до 1. Если такое число умножить на 2000, то получится число от 0 до 2000. Если от полученного числа отнять 1000, то получится число от -1000 до 1000.

Загружать свои спрайты пока не пробовал.
0
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
01.10.2016, 08:46  [ТС] 13
и кстати на сайте у меня работает с подключением библиотек, а не скачивая их, но все же будет конечно же лучше их скачать, для предотвращения возможных казусов
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
01.10.2016, 14:36 14
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
но все же будет конечно же лучше их скачать, для предотвращения возможных казусов
Да, я скачал и полключил:

Javascript
1
2
3
4
5
    <script src="js/three.min.js"></script>
    <script src="js/underscore-min.js"></script>
    <script src="js/animation-controller.js"></script>
    <script src="js/controls/OrbitControls2.js"></script>
    <script src="js/lodash.min.js"></script>
Вложения
Тип файла: zip Snowstorm.zip (163.8 Кб, 6 просмотров)
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
01.10.2016, 20:42 15
Посмотрите вот этот пример: запустить демку

Я его взял из книги: Learning Three.js – the JavaScript 3D Library for WebGL - Second Edition

Вы можете скачать исходники с официального сайта по этой ссылке

Что вы хотели показывать вместо квадратиков? Снежинки?
0
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
02.10.2016, 11:58  [ТС] 16
Ну вообще шарики, возможно кривые)
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
02.10.2016, 13:17 17
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
Ну вообще шарики, возможно кривые)
Кривые шарики? Это как?

Добавлено через 1 час 2 минуты
Цитата Сообщение от Владислав-2012 Посмотреть сообщение
Ну вообще шарики
Смотрите, в вашем примере используются квадратики. Давайте попробуем заменить их на кружки. Это будут картинки, которые будут всегда ориентированы на пользователя. Они будут выглядеть, как шарики. Это как с приведением из Пакмана.

Тот пример, который я взял выше из книги (приведением из Пакмана), он генерирует текстуру приведения с помощью кривых Безье (и c помощью canvas). Надо подумать, как заменить эту функцию, чтобы генерировались круги:

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
        var getTexture = function () {
            var canvas = document.createElement('canvas');
            canvas.width = 32;
            canvas.height = 32;
 
            var ctx = canvas.getContext('2d');
            // the body
            ctx.translate(-81, -84);
 
            ctx.fillStyle = "orange";
            ctx.beginPath();
            ctx.moveTo(83, 116);
            ctx.lineTo(83, 102);
            ctx.bezierCurveTo(83, 94, 89, 88, 97, 88);
            ctx.bezierCurveTo(105, 88, 111, 94, 111, 102);
            ctx.lineTo(111, 116);
            ctx.lineTo(106.333, 111.333);
            ctx.lineTo(101.666, 116);
            ctx.lineTo(97, 111.333);
            ctx.lineTo(92.333, 116);
            ctx.lineTo(87.666, 111.333);
            ctx.lineTo(83, 116);
            ctx.fill();
 
            // the eyes
            ctx.fillStyle = "white";
            ctx.beginPath();
            ctx.moveTo(91, 96);
            ctx.bezierCurveTo(88, 96, 87, 99, 87, 101);
            ctx.bezierCurveTo(87, 103, 88, 106, 91, 106);
            ctx.bezierCurveTo(94, 106, 95, 103, 95, 101);
            ctx.bezierCurveTo(95, 99, 94, 96, 91, 96);
            ctx.moveTo(103, 96);
            ctx.bezierCurveTo(100, 96, 99, 99, 99, 101);
            ctx.bezierCurveTo(99, 103, 100, 106, 103, 106);
            ctx.bezierCurveTo(106, 106, 107, 103, 107, 101);
            ctx.bezierCurveTo(107, 99, 106, 96, 103, 96);
            ctx.fill();
 
            // the pupils
            ctx.fillStyle = "blue";
            ctx.beginPath();
            ctx.arc(101, 102, 2, 0, Math.PI * 2, true);
            ctx.fill();
            ctx.beginPath();
            ctx.arc(89, 102, 2, 0, Math.PI * 2, true);
            ctx.fill();
 
 
            var texture = new THREE.Texture(canvas);
            texture.needsUpdate = true;
            return texture;
        };
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
04.10.2016, 00:30 18
Я совсем забыл прикрепить исходники этой демки. Вы можете взять из неё генерацию текстуры (функция getTexture сообщением выше) и оставить там только генерацию круга.

Скидываю вам пример в архиве, где в функции getTexture оставьте только это и у вас буду выводится круги:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        var getTexture = function () {
            var canvas = document.createElement('canvas');
            canvas.width = 32;
            canvas.height = 32;
 
            var ctx = canvas.getContext('2d');
            ctx.translate(-81, -84);
 
            ctx.fillStyle = "white";
            ctx.beginPath();
            ctx.arc(101, 102, 2, 0, Math.PI * 2, true);
            ctx.fill();
 
            var texture = new THREE.Texture(canvas);
            texture.needsUpdate = true;
            return texture;
        };
Вложения
Тип файла: zip Blinky.zip (165.7 Кб, 6 просмотров)
0
2 / 2 / 1
Регистрация: 31.01.2012
Сообщений: 321
05.10.2016, 12:12  [ТС] 19
Спасибо, щас попробую)
0
05.10.2016, 12:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2016, 12:12
Помогаю со студенческими работами здесь

Как добиться одинакового размера шрифта при выводе на Image.Canvas и Printer.Canvas
Здравствуйте! Подскажите, пожалуйста, как добиться одинакового размера шрифта при выводе на...

Книга "Конечный автомат 2: Возвращение". Часть 1. Разбор. Глава 8. Имя, проверка строки и разбор до. На том ли я пути?
Наверное, иногда прилюдно выругаться полезно... Стоило мне в предыдущей теме написать...

Canvas привязать к другому Canvas
Здравствуйте. Подскажите пожалуйста, как реализовать следующее: имеются две WPF формы с...

Переместить метку с canvas на canvas
Есть 4 canvas, на каждой - по 3 метки. Нужно реализовать программу по перетаскиванию меток с canvas...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru