Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Алгоритм
Версия Warcraft:
1.31+
Библиотека геометрии, реализованная на Lua в ООП формате.
Из вкусного:
  • Functions - вспомогательные функции типа обрезки и вычисления разного вида интерполяций
  • Vector3 - класс 3D вектора с перегруженными мат. операторами, поддержкой 3D конверсии из игровых структур и обратно, интерполяциями, применениями сферических оффсетов, проверок нахождения в сфере и ящике, трансформаций матриц и другое
  • Matrix3 - класс 3x3 матрицы с множеством разных конструкторов типа осей вращения и оператором перемножения
  • Matrix4 - класс 4x4 матрицы, он самый простой - с операторами сравнения и перемножения
  • Box - класс для работы с кубоидами, содержащий методы получения объёма, расширения, включения, пересечения с другими фигурами и др.
  • Sphere - класс для работы со сферами, содержащий методы получения объёма, включения, пересечения с другими фигурами и др.
  • Ray - класс для работы с лучами и получение точек пересечения с объектами
  • Camera - класс для хранения данных о камере и возможностью конвертировать оконные координаты и координаты сцены между собой
+ методы toGrid для построения фигур из сетки вершин
Может работать в режиме обычного объекта или в режиме WLPM модуля (определяется автоматически).

Установка

  • Копировать код из /src и использовать глобалку wGeometry
  • ИЛИ используя WLPM и import("wGeometry"):
wlpm install https://github.com/Indaxia/lua-wGeometry

Использование

  local Vector3 = wGeometry.Vector3
  local Matrix3 = wGeometry.Matrix3
  local Matrix4 = wGeometry.Matrix4
  local Box = wGeometry.Box 
  local Sphere = wGeometry.Sphere 
  local Ray = wGeometry.Ray
  local Camera = wGeometry.Camera
  
  local a = Vector3:new(1, -1, 1.1)
  local b = Vector3:new(-1, 1, -1.1)
  print(a + b)
  
  local c = Vector3:copyFromUnit(udg_unit1)
  local d = Vector3:copyFromUnit(udg_unit1)
  
  c:hermite(d, 0.5):applyToUnit(udg_unit1)
  
  
  local m1 = Matrix3:new(
    0.5, 1., 0.5, 
    0.8, 0.2, 0.7, 
    0.9, 1., 0.
  )
  local m2 = Matrix3:newIdentity()
  print(m1 * m2)
  
  
  local m3 = Matrix4:new(
    0.5, 1., 0.5, 
    0.8, 0.2, 0.7, 
    0.9, 1., 0.
  )
  print(m4)

  local b = Box:new(
    Vector3:new(2,2,2),
    Vector3:new(4,6,3)
  )
  print b.containsVector(a)
  
  local s = Sphere:new(Vector3:new(2,2,2), 100)
  local r = Ray:new(Vector3:new(2,2,2), Vector3:new(0.3,0.3,0.4))
  print (r.intersectsSphere(s))
  
  local cam = Camera:new()
  local win = Vector3:new(0.5, 0.5, 1)
  local world = cam:windowToWorld(win)
  local win2 = cam:worldToWindow(world)
  cam:applyCameraToPlayer(Player(0))
См исходный файл для получения детальной документации.
Отдельная благодарность фреймворку monogame и J за DGUI.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
4 года назад
0
А проверка нахождения в элипсоиде возможна?
0
37
4 года назад
Отредактирован ScorpioT1000
0
Bergi_Bear, можешь применить матрицу трансформаций и проверить в сфере))

В целом, коллизии буду делать в либо wPhysics или типа того уже не на ООП, пока не придумал точно архитектуру
1
21
4 года назад
1
ScorpioT1000, очень красивый код. Всегда нравился Ваш стиль. А можете рассказать, чем вы руководствуетесь, когда даёте имена, начинающиеся с прописных или заглавных букв, нижних подчеркиваний или двойных нижних подчёркиваний.
0
32
4 года назад
0
Я чувствую, что полностью готов для этой библиотеки, она точно для меня.. но пока что я без понятия как всем этим пользоваться... Желательно бы карту пример, хот бы с базовым функционалом, я конечно ещё не пробовал мб и разберусь... но пока что, как то пугающе всё выглядит
0
37
4 года назад
Отредактирован ScorpioT1000
0
ScopteRectuS, coding style best practices из разных языков
Хорошие примеры - symfony на php и разные опенсурс вещи на c# типа monogame
Двойное нижнее - оператор в языке (__mul = *), одинарное - имитация приватности

Bergi_Bear, не успел, на пк карта лежит, скину завтра. Коротко - берешь вектор от юнита, например и проделываешь в периоде с ним операции, в конце которых :applyToUnit. Это для движения. Все сущности можно выводить через print

Сплайн типа hermite - это пдавный переход между векторами. Можно брать координаты, скажем, камеры и плавно двигать между ракурсами в периоде
2
28
4 года назад
2
Ура, годнота от скорпа
1
37
4 года назад
Отредактирован ScorpioT1000
1
2
32
4 года назад
2
Кстати если кому интересно, то я разобрался с этими векторами по-нубски, но мне достаточно, вот карта:
Было найдено 2 ошибки в самой библиотеке, а конкретно:
			o.x = GetDestructableX(d)
			o.y = GetDestructableX(d) -- Y
и где то тут
    yawPitchOffset = function(self, distance, yaw, pitch)
      return Vector3:new(
        distance * math.cos(yaw) * math.sin(pitch),--Вообще не работало
        distance * math.sin(yaw) * math.sin(pitch),-- На синусах
        distance * math.cos(pitch)
      )
    end
Исправил на
		yawPitchOffset = function(self, distance, yaw, pitch)
			return Vector3:new(
					distance * math.cos(yaw) * math.cos(pitch),
					distance * math.sin(yaw) * math.cos(pitch),
					distance * math.cos(pitch)
			)
		end
0
37
4 года назад
Отредактирован ScorpioT1000
0
distance * math.cos(yaw) * math.sin(pitch),--Вообще не работало
distance * math.sin(yaw) * math.sin(pitch),-- На синусах
distance * math.cos(pitch)
Вот тут не понял, ты точно yaw pitch делал? yaw = face, pitch = вертикальный взгляд
углы в радианах

destructable пофиксил
2
32
4 года назад
2
ScorpioT1000, ну я особо не разбираюсь, мне в дискорде подсказали хорошие люди, делал по их наводке
Вот визуальный пример использования векторов, если это кого-то заинтересует, зачем это вообще
Загруженные файлы
0
37
4 года назад
0
Bergi_Bear, круто. Можешь как раз для плавного управления поворотом hermite заюзать. Сейчас у тебя линейно, как я понял.
0
24
4 года назад
0
Вот тут не понял, ты точно yaw pitch делал?
В варе в некоторых функциях они вроде местами перепутаны, может в этом дело.
0
32
4 года назад
0
ScorpioT1000, Поворот у меня так и задуман, это казуальный быстрый поворот, он не реалистичен, но при условии что нет движения назад, без него передвижение станет мукой
3
21
4 года назад
Отредактирован scopterectus
3
По поводу YawPitchOffset: если нет вертикального разворота, то синус 0 градусов даст ноль, то есть смещения не будет, а если будет косинус, всё работает правильно, потому что косинус 0 градусов 1.
Точно так же работает и с вертикальным углом в 90, так как при вертикальном угле в 90 градусов смещение должно идти лишь по оси z, a оси x и y не должны меняться.

yawPitchOffset = function(self, distance, yaw, pitch)
  return Vector3:new(
    distance * math.cos(yaw) * math.cos(pitch),
    distance * math.sin(yaw) * math.cos(pitch),
    distance * math.sin(pitch)
  )
end
1
37
4 года назад
Отредактирован ScorpioT1000
1
ScopteRectuS, вот это ближе к правде. Откопал старые либы и там было так же. Обновил, спасибо

Новая версия - добавлен Bounding Box


Сферы и лучи на подходе
3
37
4 года назад
Отредактирован ScorpioT1000
3

Новая версия 0.5

  • добавлены сферы
  • добавлены лучи с поиском точек пересечения с объектами
  • добавлены методы toGrid для построения фигур из сетки вершин (не стал делать mesh целиком, тк. это уже тяжело для цпу на луа)
  • обновлены некоторые методы
1
27
4 года назад
Отредактирован MpW
1
ScorpioT1000, а ты можешь сделать такое же для 2D-деталей. Как в компасе?
эх плюсанул. некоторые вещи понятны. А большая часть нет. Как-то не понятно.
Хорошие примеры - symfony на php и разные опенсурс вещи на c# типа monogame
Наверное это для программистов, шарящих в такое. Эх векторы. это php и опенсурс вещи где их взять и чем их открыть. Если бы на наш язык перевести
Это бы заработало в массы народу если бы были практические применения в игре. Всякие примерные наработки.
0
37
4 года назад
0
Steal nerves, такое же для 2д - просто указывай 0 как третью координату (и вообще ее можно опустить в конструкторе new)
0
23
4 года назад
0
ну а почему тогда не сделал следование?
Vector2 изначально х и y а Vector3 следует наследника Vector2 и добавляет z вот так и должен чтобы они могли его брать. А также добавить zero обоих вектора для стандарта....
0
37
4 года назад
Отредактирован ScorpioT1000
0
pro100master, наследовение убивает производительность. Тем более в lua, где нет родного наследования. Использование строковых индексов .x .y вместо [0] и [1] уже и так сильно нагружает луа. Так это не делается.
Референс как правильно, ещё пример, ещё один
Zero - это :new без аргументов.
0
23
4 года назад
0
ScorpioT1000, не шути с оптимизацией лол!
1
37
4 года назад
Отредактирован ScorpioT1000
1
Версия 0.6: добавлена функция Vector3:isZero()

Версия 0.7: добавлены методы Vector3: to2D(), addToLocation(), addToUnit()

Версия 0.8: фикс методов Vector3 applyToUnit и addToUnit

Версия 0.9: добавлены функции unit facing
0
37
4 года назад
Отредактирован ScorpioT1000
0
Версия 0.10: исправления applyToUnitFacing и applyToUnitFacing
0
9
4 года назад
0
Если я буду каждые 0.3 секунды 500 матриц перемножать, никакие грабли не всплывут? я бы хотел все перемещения в карте на матрицах сделать...
0
32
4 года назад
0
com23, я думаю фпс под просядет, или просто всё застрянет, надо пробовать
Чтобы оставить комментарий, пожалуйста, войдите на сайт.