Перейти к публикации

KOllapsE

Пользователи
  • Публикаций

    201
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    4

Комментарии к Запись, опубликованные пользователем KOllapsE

  1. Только что, Electr0 сказал:

    не очень понимаю что это даст..

    Ну, сейчас же повороты по У всегда осуществляются правильно, как ни крути?) Хотим повернуть по У - и получаем нужный результат. Теперь меняем иерархию на zxy - и поворачиваем по Х всегда правильно. Т.е. опять получаем нужный результат. Используя нужную в зависимости от случая иерархию можно будет всегда получать правильные повороты.

  2. 4 минуты назад, Electr0 сказал:

     мы не относительно, а реально поворачиваем объект по осям X Y Z

    Я имею в виду, что поворот по часовой привязан к системе координат объекта, а не карты. И это можно использовать, раз уж есть такое на руках.

     

    23 минуты назад, Electr0 сказал:

    проблема в том что если хорошенько по заворачивать по осям Y X Z, то потом при поворотах по осям X Z ты не можешь предсказать как повернется предмет, если по оси Y ты точно можешь знать что просто повернется вокруг себя по горизонтали, то в этих случаях нифига).

    Я так понимаю, сейчас при поворотах используется xyz или zyx иерархия. Решение для правильных поворотов по Z и X - менять иерархию в зависимости от того, по какой оси мы хотим поворачивать объекты. Хотим по Х - используем zxy, что будет с остальными осями нам всё равно, мы их не используем в тот момент. Если после этого поворачиваем по Z - используем yzx. Только вот осуществимо ли это сейчас и не распухнет ли плагин ещё в пару-тройку раз? : D

    777.JPG

  3. 47 минут назад, Electr0 сказал:

    попробуй по поворачивать повернутый предмет по осям X Z увидишь что результаты очень разные, в отличие от по Y, даже не знаю можно ли это обойти)

    Не пойму никак - просто брать и поворачивать? Каждому объекту вроде и добавляется угол, как должно.

    Наверно, надо обратить внимание на пункт меню стройки "по часовой". Если остальные повороты просто добавляют заданные значения к углам, то повороты по часовой делают с углами непонятно что на первый взгляд, но объект всегда поворачивается вокруг синей оси и именно на заданный угол. Т.е. они правильно используют http://en.wikipedia.org/wiki/Rotation_matrix#In_three_dimensions относительно XYZ объекта 

    1.jpg

    2.jpg

    3.jpg

     

    Если с проблемой поворотов Х и Z ничего не выгорит, то есть такой вариант: проверить, можно ли будет использовать его не только для поворотов самого объекта, но и другие объекты относительно него поворачивать, а так же сделать поворот типа "по часовой" для красной Х и зелёной У оси. Если да, то можно будет делать так: запомнить и обнулить углы всех, кроме одного, предметов, повернуть относительно какой-либо его оси все предметы, а потом к углам каждого предмета добавить запомненные ранее. Есть минусы - игрокам поворачивать будет менее удобно, потому что оси первого объекта могут быть расположены не параллельно соответствующим осям карты и надо будет сначала поворачивать его; всё ранее сделанное по поворотам будет впустую. Но повороты будут). В общем, на крайний случай вариант.

  4. 9 минут назад, Electr0 сказал:

    ну эксперимент с поворотом по осям X и Z провалился (да предметы располагаются корректно, но вот их углы ведут себя сумазбродно), а вот по просто поворачивать как на скриншотах можно легко

    А они тоже используют rotate YAW, когда поворачиваются после перемещения? Если да, то мб надо использовать повороты как сейчас на стройке - то есть, объект перемещается, используя YAW, а потом поворачивается по старой системе, по какой-нибудь оси. Если нет, то мб и там надо использовать

  5. Ну, @3LoU_BaNaN теперь будет доволен, наверно - можно вытащить своё убежище откуда угодно и расположить как угодно). Да и возможности стройки расширились - можно создавать структуры с круглыми формами, причём довольно ровно и нетрудозатратно, можно быстро создавать симметрию в убежище. В общем, эта пять :  D

  6. 3 минуты назад, Electr0 сказал:

    Return Value

    Dot product of the two vectors.

    но зачем мне один float, когда координата состоит из 3 float'ов

    Сорь, я на алиедмод напрямую попасть не могу - блочит что-то, есть подозрение на провайдера, а мб много плагинов там накачал :D. Через онлайн прокси мне такой вид выдало

    Снимок.JPG

    Не видно, что слева. Я думал, он координаты той точки выдаст, три флоата, как положено :С Или я что-то не понял?

  7. 3 минуты назад, Electr0 сказал:

    Calculates the dot product of two vectors это не дает позицию из трех точек в пространстве

    Она же должна давать точку пересечения двух векторов...

    3.png

    Типа такого, координаты этой точки

  8. 28 минут назад, KOllapsE сказал:

    Что-то не соответствует полученный угол своему вектору. Если совместить начало TempVec:: -53.144775 -174.051757 -0.238098 с осью координат, то до его конца не будут такие углы fTempVecAng:: 0.074962 253.020523 0.000000. Если работать с двумя осями только (Z почти ноль в обоих случаях), то координаты Х относятся к У примерно как 1:3. Ну не может тогда угол по Х быть почти нулём.

     

    3.png

    @Electr0, обрати внимание, пожалуйста. Либо я что-то не так понял, либо угол неправильный. Там точно угол для вектора из точки А в точку Б?

  9. 5 часов назад, Electr0 сказал:

    Вектор между точками А и б  (функция MakeVectorFromPoints. там просто вычитание позиции А из Б):
    fTempVec:: -53.144775 -174.051757 -0.238098

    Угол из вектора между этими точками ( функция GetVectorAngles):
    fTempVecAng:: 0.074962 253.020523 0.000000

    Что-то не соответствует полученный угол своему вектору. Если совместить начало TempVec:: -53.144775 -174.051757 -0.238098 с осью координат, то до его конца не будут такие углы fTempVecAng:: 0.074962 253.020523 0.000000. Если работать с двумя осями только (Z почти ноль в обоих случаях), то координаты Х относятся к У примерно как 1:3. Ну не может тогда угол по Х быть почти нулём.

     

    3.png

  10. 1 час назад, KOllapsE сказал:

    В том отрывке кода просто берут и указывают дистанцию (Float:distance = 50)

    Если можно из точки А 2696.005126 4924.954589 -976.147644  под углом  fTempVecAng:: 0.074962 253.020523 90.00000 сделать дистанцию  181,984718, то это и будет точка С, куда потом второй объект перемещать

    Я вот что подумал: а зачем вообще узнавать, где этот конец вектора АС? Мб можно по вектору АС на расстояние 181,984718 сразу перемещать второй объект? Если нельзя так, то ещё вариант:

     

    Есть вектор АВ - от первого объекта ко второму. Копируем его и оставляем как был (два вектора в одном, так сказать). Далее получаем вектор АС изменением углов одного вектора АВ на сколько нужно. Есть два вектора - АВ от первого объекта ко второму и АС - от первого объекта к точке, где должен оказаться второй. Вычитаем из АС вектор АВ функцией "Subtracts a vector from another vector". ВС = АС - АВ. После этого используем функцию "Calculates the dot product of two vectors" для векторов АС и ВС - получаем ту самую точку С, куда надо переместить второй объект!!!

     

    Снимок2.JPG

  11. Только что, Electr0 сказал:

    пробовал, но там искажение какое-то появляется, в общем длинна конца другая совсем, и сам угол не правильный.

    :(

    А можно скрин посмотреть, что вышло-то? По идее всё правильно ведь

  12. 5 минут назад, Electr0 сказал:

    там не то ><, там просто присваивает указанную ось от объекта по которому выравниваем, а в нашем случае надо как-то узнать позицию конца вектора под углом 90 град, понятия не имею как ее узнать

    В том отрывке кода просто берут и указывают дистанцию (Float:distance = 50)

    45 минут назад, Electr0 сказал:
    
    //---------------------------------------------------------
    // get position just in front of you
    // and the angles you are facing in horizontal
    //---------------------------------------------------------
    GetClientFrontLocationData( client, Float:position[3], Float:angles[3], Float:distance = 50.0 )
    {
    	new player = GetPlayerIndex( client );
    
    	decl Float:_origin[3], Float:_angles[3];
    	GetClientAbsOrigin( player, _origin );
    	GetClientEyeAngles( player, _angles );
    
    	decl Float:direction[3];
    	GetAngleVectors( _angles, direction, NULL_VECTOR, NULL_VECTOR );
    	
    	position[0] = _origin[0] + direction[0] * distance;
    	position[1] = _origin[1] + direction[1] * distance;
    	position[2] = _origin[2];
    	
    	angles[0] = 0.0;
    	angles[1] = _angles[1];
    	angles[2] = 0.0;
    }

     

    Если можно из точки А 2696.005126 4924.954589 -976.147644  под углом  fTempVecAng:: 0.074962 253.020523 90.00000 сделать дистанцию  181,984718, то это и будет точка С, куда потом второй объект перемещать

  13. 1 минуту назад, Electr0 сказал:

    это что ? типа длинна вектора?, а это не равно дистанции между объектом А и объектом Б?

    ну да, это и будет дистанция между А и В

    Надо, чтобы АС сохранил длину АВ для того, чтобы сохранилось расстояние между объектами, затем эта длина нужна. Ну или можно не считать длину, если есть возможность забабахать вектор такой же длины, просто с другим углом. Calculates a vector's length вроде подходит

  14. 1 минуту назад, Electr0 сказал:

    до сих пор не вижу объяснение что за чем там считается

    Берём fTempVec:: -53.144775 -174.051757 -0.23809. и считаем длину вектора АВ

    26 минут назад, KOllapsE сказал:

    КОРЕНЬ(53,144775^2+174,051757^2+0,238098^2)=181,9847189

    Берём fTempVecAng:: 0.074962 253.020523 0.000000 - как повёрнут сейчас АВ. Мы хотим повернуть на 90 градусов вверх (не вдупляю сейчас, по какой оси это будет, но чтобы подвижный конец карандаша повернулся вокруг неподвижного ровно вверх или вниз). Добавляем ему 90 градусов по Z (это же система координат карты, а не объекта, так что всё ок)

    32 минуты назад, KOllapsE сказал:

    fTempVecAng:: 0.074962 253.020523 90.00000

    После этого надо переместить вектор с длиной 181,9847189 и градусами 0.074962 253.020523 90.00000 так, чтобы он исходил из точки А. Его конец и будет точкой, куда надо переместить второй объект, чтобы второй объект повернулся относительно первого на 90 градусов

  15. Только что, Electr0 сказал:

    эм поясни что за чем D

    Ты создашь вектор АС такой же длины, как и АВ, только уже повёрнутый куда надо (на 90 градусов)

    1.JPG2.JPG

    В точку С потом можно будет перемещать второй объект

    3.JPG

  16. 18 минут назад, Electr0 сказал:

    Угол из вектора между этими точками ( функция GetVectorAngles):
    fTempVecAng:: 0.074962 253.020523 0.000000

     

    А что дальше?, 

    Создать повёрнутый вектор, например, fTempVecAng:: 0.074962 253.020523 90.000000 у которого будет длина такая же как у этого fTempVec:: -53.144775 -174.051757 -0.23809.

    КОРЕНЬ(53,144775^2+174,051757^2+0,238098^2)=181,9847189

    Если всё ок, то так и можно поворачивать

    P.S. и поместить этот вектор ту да же, откуда первый был [FS] Позиция: 2696.005126 4924.954589 -976.147644

  17. @Electr0, а можно использовать "Returns angles from a vector" отсюда https://sm.alliedmods.net/new-api/vector , затем добавлять нужный градус в полученные значения, а затем создавать новый вектор с новыми углами? Ну или старому углы поменять

     

  18. @Electr0, слушай, а в саурспауне, или на чём будет там код писаться, есть операции с векторами (векторное вычитание хотя бы)? Я тут пробую математически описать поворот по координатам, векторные операции упростили бы всё.

×
×
  • Создать...