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

Установка

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

  local wGeometry = Imp.import(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.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
38
Bergi_Bear, можешь применить матрицу трансформаций и проверить в сфере))

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

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

Сплайн типа hermite - это пдавный переход между векторами. Можно брать координаты, скажем, камеры и плавно двигать между ракурсами в периоде
33
Кстати если кому интересно, то я разобрался с этими векторами по-нубски, но мне достаточно, вот карта:
Было найдено 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
38
distance * math.cos(yaw) * math.sin(pitch),--Вообще не работало
distance * math.sin(yaw) * math.sin(pitch),-- На синусах
distance * math.cos(pitch)
Вот тут не понял, ты точно yaw pitch делал? yaw = face, pitch = вертикальный взгляд
углы в радианах

destructable пофиксил
33
ScorpioT1000, ну я особо не разбираюсь, мне в дискорде подсказали хорошие люди, делал по их наводке
Вот визуальный пример использования векторов, если это кого-то заинтересует, зачем это вообще
Загруженные файлы
38
Bergi_Bear, круто. Можешь как раз для плавного управления поворотом hermite заюзать. Сейчас у тебя линейно, как я понял.
24
Вот тут не понял, ты точно yaw pitch делал?
В варе в некоторых функциях они вроде местами перепутаны, может в этом дело.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.