Jump to content

getElementMatrix


Recommended Posts

getElementMatrix. Сабж

ну вроде бы для тех, кто с матрицами связан эта функция очень понятная, но для меня это пока что единственная непонятная функция (: прошу разъяснить хотя бы какое значение в этой матрице за что отвечает

я сам в 3Д графике - счагол, но если кто-то пояснит, я буду рад

Link to comment

Я чуть ранее читал литературу, где сразу дают понять одну вещь - тригонометрический метод подсчета не такой уж и быстрый. Но это не значит, что он не подойдет в менее быстрых подсчетах, но все-таки. Поэтому я заинтересовался этой функцией.

почитаемсЬ

-- позднее --

копал на форуме.. и нашел переделанный пример из вики

function getPositionFromElementAtOffset ( element, x,y,z ) 
    if not x or not y or not z then  return false  end 
      
    local matrix = getElementMatrix ( element ) 
      
    local offX = x * matrix[1][1] + y * matrix[2][1] + z * matrix[3][1] + matrix[4][1] 
    local offY = x * matrix[1][2] + y * matrix[2][2] + z * matrix[3][2] + matrix[4][2] 
    local offZ = x * matrix[1][3] + y * matrix[2][3] + z * matrix[3][3] + matrix[4][3] 
      
    return offX, offY, offZ 
end 

хотелось бы на примере сразу понять. Какие x,y,z мы тут указываем, и какие offX, offY, offZ получаем на выходе? В параллельной теме человек спрашивал как найти, допустим точку в 3Д мире которая находится в багажнике тачки. Ну или какой-то другой практичный пример, допустим как найти 3Д точку ровно на крыше транспорта.

Link to comment

Не вдаваясь в подробности, x,y,z - оси, проходящие через центр элемента; в центре, соответственно, точка (0,0,0).

На примере автомобиля, если смотреть на него строго сверху вниз, причем морда направлена на север (вверх):

ось x - слева направо, y - снизу вверх, z - из глубины на тебя.

Допустим, что узнать координаты багажника =) указываем Y (навскидку) -2. Прикрепить что-нибудь на крышу: z +1 etc.

Принцип, думаю, понятен.

Не буду тут рассказывать про проекции вектора на оси, но можно отметить, что элементы матрицы [4][1], [4][2] и [4][3] - есть координаты объекта в мире GTA, что удобно в некоторых случаях.

P.S. Пользуясь тем, что тов. lil toady читает эту ветку хочу поинтересоваться: а не планируете добавить setElementMatrix()? Было бы как минимум логично.

Link to comment
P.S. Пользуясь тем, что тов. lil toady читает эту ветку хочу поинтересоваться: а не планируете добавить setElementMatrix()? Было бы как минимум логично.

Все что мы планируем записано в мантисе[/bugs], там можно и и это функцию попросить, видимо просто никто не задумывался.

Link to comment
Не вдаваясь в подробности, x,y,z - оси, проходящие через центр элемента; в центре, соответственно, точка (0,0,0).

На примере автомобиля, если смотреть на него строго сверху вниз, причем морда направлена на север (вверх):

ось x - слева направо, y - снизу вверх, z - из глубины на тебя.

Допустим, что узнать координаты багажника =) указываем Y (навскидку) -2. Прикрепить что-нибудь на крышу: z +1 etc.

Принцип, думаю, понятен.

Не буду тут рассказывать про проекции вектора на оси, но можно отметить, что элементы матрицы [4][1], [4][2] и [4][3] - есть координаты объекта в мире GTA, что удобно в некоторых случаях.

Если автомобиль будет повёрнут на сервер, то я и без getElementMatrix найду координаты багажника. :)

Причём даже не на вскидку -2, а с помощью getElementBoundingBox, т.е. к Y ( X, Y, Z = getElementPosition ) прибавить minY ( minX, minY, minZ, maxX, maxY, maxZ = getElementBoundingBox ). Но всё это при условии, что автомобиль повёрнут на север.. А как получить координаты багажника при условии, что автомобиль может быть повёрнут куда угодно? Тут уже нужны знания геометрии видимо, которых у меня очень мало (почти нет).

Link to comment

функция выше этим и занимается, насколько мое просветление в этой теме мне подсказывает, могу предположить

function getPositionFromElementAtOffset ( element, x,y,z ) 
    if not x or not y or not z then  return false  end 
      
    local matrix = getElementMatrix ( element ) 
      
    local offX = x * matrix[1][1] + y * matrix[2][1] + z * matrix[3][1] + matrix[4][1] 
    local offY = x * matrix[1][2] + y * matrix[2][2] + z * matrix[3][2] + matrix[4][2] 
    local offZ = x * matrix[1][3] + y * matrix[2][3] + z * matrix[3][3] + matrix[4][3] 
      
    return offX, offY, offZ 
end 
  
  
-- ... 
  
  
-- смещение от центра тачки до конца задней части тачки 
local yOffset 
_, yOffset = getElementBoundingBox(car) -- car это какая-то тачка 
  
-- смещение от центра тачки до точки в центре багажника 
yOffset = yOffset - 0.5 
  
-- координаты 3Д мира точки в центре багажника в данный момент времени 
local bootX,bootY,bootZ = getPositionFromElementAtOffset( car, 0,yOffset,0 ) 

нащщет setElementMatrix никто не заморачивался, т.к. получив матрицу, я так понял, можно выставить позицию и углы вращения существующими функциями, вытянув нужные значения из матрицы

хотя бы, приведи парочку жизненно важных способов применения. Многие такими высокими материями графики в скриптинге не занимаются, поэтому хватает функций изменения позиции и углов

Edited by Guest
Link to comment

Дык ведь с помощью той функции, что MX_Master привел в пример. Я лишь вкратце брякнул, чего она делает.

getPositionFromElementAtOffset ( myVehicle, 0,-2,0 ) 

Ну, естественно, насчет (0,-2,0) это я примерно сказал, пристреляться надо.

И будет нам счастье и на север и на юг и вверх тормашками, и к Эйлеру не ходи ;)

P.S. Определи чутка.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...