Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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 целиком, тк. это уже тяжело для цпу на луа)
  • обновлены некоторые методы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.