|
Математика Методы математического моделлирования, программирование математических концепций, роль математики в создании игр |
17.01.2014, 04:05
|
#1
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
[js] Vec2 (двумерный вектор)
Двумерный Вектор ( Vec2), на JavaScript.
Весьма "грубое" решение расширить Float32Array, т.к. IE9 не держит их, лечиться правда очень просто - условием что если Float32Array нету, присваиваем к нему Array, и всё работает даже на древних платформах.
Исходники: https://gist.github.com/Maksims/8464888
Список поддерживаемых методов:
new, delete, clone equal, equalS, equalXY, set, setS, setR, setXY, add, addS, addXY, lerp, lerpS, lerpXY, sub, subS, subXY, mul, mulS, mulXY, div, divS, divXY, len, dist, distXY, dot, dotXY, norm, radians, rot, rotR, rotXY, sat, floor, round, ceil
Метод без приставки обычно принимает другой вектор.
Приставка S - метод принимает один аргумент - число.
Приставка R - принимает один аргумент - угол в radians.
Приставка XY - принимает два аргумента, x и y.
Вот пример реализации 2д камеры pick (координаты экрана курсора преобразуем в координаты мира), с учётом - позиции, поворота и приближения камеры:
Camera.prototype.pick = function(viewport, v) { return v.clone() // копируем точку клика .sub(viewport.middle) // централизуем на центр области обзора .rotS(-this.rotation.radians()) // поворачиваем .divS(this.zoom) // приближаем .mulXY(1, -1) // реверсия Y координаты .add(this.position) // сдвигаем };
// ...
var pointInWorld = camera.pick(Vec2.new(mouseX, mouseY));
Бенчмарк с glMatrix (больше - лучше), как видим с кешем мы в 11 раз шустрее, без кеша почти вдвое.
Последний раз редактировалось moka, 18.01.2014 в 21:43.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
17.01.2014, 06:28
|
#2
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: [js] Vec2 (двумерный вектор)
Изобрёл велосипед, не поискав готовых решений.
http://glmatrix.net/docs/2.2.0/
mat2
mat2d
mat3
mat4
quat
vec2
vec3
vec4
Уже давно есть и работает везде.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.01.2014, 01:49
|
#3
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: [js] Vec2 (двумерный вектор)
Я давно вкурсе про glMatrix ещё до имплементации данной библиотеки.
Но если ты работал с glMatrix, то ты отметишь для себя что данная библиотека не поддерживает chaining, а имеено то что я указал в примере, т.к. классы (по факту объекты) - лишь имеют функции а не методы над данными (не прототип над массивом).
Следственно твой аргумент не уместен по причине отличия решений, и по факту невозможность chain'ить мат. выражения - является первопричиной разработки своей библиотеки.
Также не имеет никакого "прозрачного" кеша для тебя, что прийдётся расширять библиотеку и переписывать методы копирования, инициализации и т.п.
Моё решение решает только одну задачу: vec2, то что мне требуется.
Да и моя библиотека рвёт glMatrix по производительности в клочья.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
18.01.2014, 11:37
|
#4
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: [js] Vec2 (двумерный вектор)
Сообщение от moka
Да и моя библиотека рвёт glMatrix по производительности в клочья.
|
Проводились тесты?
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.01.2014, 21:39
|
#5
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: [js] Vec2 (двумерный вектор)
Коментарии излишни...
(больше - лучше)
http://jsperf.com/glmatrix-vec2-vs-vec2
Даже без кеша, выийгрывает почти вдвое, с кешем, выйгрывает в 11+ раз.
Я уже не говорю о разнице того как код выглядит...
glMatrix:
Camera_g.prototype.pick = function(point) { point = vec2.clone(point); vec2.sub(point, point, this.middle); // there is no rotate vector methods in glMatrix vec2, // alternative would be to use matrix for such operation, // but that would be overkill, and would reduce performance even more var rotVec = vec2.clone(this.rotation); vec2.normalize(rotVec, rotVec); var t = point[0] * rotVec[0] - point[1] * rotVec[1]; point[1] = point[1] * rotVec[0] + point[0] * rotVec[1]; point[0] = t;
vec2.div(point, point, vec2.fromValues(this.zoom, this.zoom));
point[1] *= -1;
vec2.add(point, point, this.position);
return point; };
Моё решение:
Camera.prototype.pick = function(point) { return point.clone() .sub(this.middle) .rot(this.rotation) .divS(this.zoom) .mulXY(1, -1) .add(this.position) };
Далее, я использую уже библиотеку не в первом проекте, следственно она доказала свою стабильность и удобство на самом деле реально выше в разы.
Честно сказать это было и до тестов очевидно, если ты заглядывал в то как glMatrix работает и в моё решение, а не задавал бы подобных вопросов.
И ещё факт того что я написал данную либу - позволило мне изучить как на самом деле работает математика каждой функции при работе с 2D векторами, и я считаю это огромный бенефит.
Последний раз редактировалось moka, 18.01.2014 в 23:56.
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
28.02.2014, 21:17
|
#6
|
Легенда
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений (для 568 пользователей)
|
Ответ: [js] Vec2 (двумерный вектор)
что понимается под кэшированием вектора?
|
(Offline)
|
|
28.02.2014, 23:15
|
#7
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: [js] Vec2 (двумерный вектор)
не хватает сравнения с кешироваными матрицами.
__________________
|
(Offline)
|
|
28.02.2014, 23:44
|
#8
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: [js] Vec2 (двумерный вектор)
Сообщение от johnk
что понимается под кэшированием вектора?
|
В JS есть свой сборщик мусора, но стоимость создания Float32Array - обычно более 50% всей стоимости работы с векторами. Следственно заместо отдачи вектора на сборку мусорщиком, мы храним уже не использованный вектор в отдельном массиве (cache), и когда создаём новый вектор, проверяем если в кеше есть не используемый вектор, если есть, переиспользуем.
Тем самым мы экономим огромное количество производительности.
SBJoker, угу, там разница была бы ещё в разы круче. Но данная библиотека имплиментирует только 2ух мерный вектор, и матриц в ней нету.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:30.
|