Перейти к публикации
  • Поворот группы предметов по вертикали как одного


    Electr0
    • Сделано

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

     

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

     

    Даже если мы корректно реализуем поворот позиций относительно координатной плоскости мира, нужно поворачивать каждый предмет по YAW:

     

    Flight_dynamics_with_text.png

     

    может кто с мозгами дружит лучше подскажет чего?)


    Отзывы пользователей

    Рекомендованные комментарии



    Ссылка на комментарий
    Поделиться на других сайтах

    У каждого объекта же есть свои координаты, я так понимаю, что это точка, где три оси объекта пересекаются. Пусть они и будут отправными точками. Допустим, имеем карандаш (красный объект) и другой предмет (жёлтый объект).1.JPG

    Создадим новую систему координат и совместим её начало с  неподвижным концом карандаша (или можно переместить все объекты, сохраняя относительное положение, к началу координат карты).

    2.JPG

    После этого создадим отрезок из точки первого объекта к точке второго - АВ.

    3.JPG

    Повернём его по уже существующей системе на -45 градусов вокруг Z (или 45 ПО оси Y, как это в стройке сейчас называется)

    4.JPG

    Затем переместим точку второго объекта в точку В (в системе стройки уже существует выравнивание, по ходу его и можно использовать)

    5.JPG

    Затем повернём оба объекта на тот же градус и по той же оси, что и АВ до этого 

    6.JPG

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

    Ссылка на комментарий
    Поделиться на других сайтах

    Нет, с созданием новой системы координат я погорячился. Надо при создании вектора АВ добавлять в одну из точек (А, например) три оси, как у объектов. Т.е., АВ станет как бы объектом. После этого и так всё правильно будет - АВ будет поворачиваться относительно неподвижного конца карандаша.

    Ссылка на комментарий
    Поделиться на других сайтах

    @Electr0 ну так всё же уже есть, попробуй создать отрезок со своими осями только. А насчёт " Если же движение не из центра, как в случае если мы взяли в руки карандаш за один конец и повернули его в пространстве " - пункт в строительстве "Повернуть по часовой" обыгрывает это, я заметил, как бы ни были расположены оси объекта, он всегда поворачивает зелёную ось к красной с сохранением положения синей, то есть происходит поворот вокруг Z.

    Ссылка на комментарий
    Поделиться на других сайтах

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

    Блин сложно :vk_imp_9:, учитывая что объектов сотни, и их нужно вокруг чего-то поворачивать

    Пусть поворачиваются вокруг точки первого предмета (можно узнавать наименьший вектор до отправных точек для каждого объекта, пусть будет первым), Можно даже сымитировать новую систему координат - брать координаты точки первого объекта, допустим (100; 150; 300), а потом, при дальнейших поворотах, если использовать координаты, везде вычитать 100 с Х, 150 с Y и 300 c Z.

    Ссылка на комментарий
    Поделиться на других сайтах

    Ладно берем стек помеченных предметов, беру первый помещенный в качестве отправной точки. 

     

    Я знаю как сделать вектор между позициями центров предметов, а дальше не знаю, как я понял я должен каким-то образом повернуть этот вектор на величину равную углу на который будем поворачивать, дальше узнать положение крайней точки вектора в пространстве. Насчет rotate yaw, тоже есть вопрос ведь те объекты которые близко к точке поворота их нужно больше поворачивать чём те что дальше (не факт но что-то такое возможно есть) и это все для каждого предмета по отдельности. Каждый раз относительно первого предмета. 

    Ссылка на комментарий
    Поделиться на других сайтах

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

    повернуть этот вектор на величину равную углу на который будем поворачивать

    Ну, можно ли сделать так: вот есть у нас вектор

    100.JPG

    и ему присобачиваем собственные оси, как у предметов

    101.JPG

    Если можно, то потом его как объект можно будет поворачивать и всё будет правильно. Главное, чтобы эти оси исходили из точки А и были параллельны соответствующим осям координат карты

    Ссылка на комментарий
    Поделиться на других сайтах

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

    Ссылка на комментарий
    Поделиться на других сайтах

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

     

    Ссылка на комментарий
    Поделиться на других сайтах

    ну, вот я создал вектор из точки А (первый предмет в цикле помеченных ) до точки Б (следующий после первого)

    Получилось вот что:

    Объект А:
    [FS] Углы: 360.842529 270.000000 0.000000
    [FS] Позиция: 2696.005126 4924.954589 -976.147644

    Объект Б:
    [FS] Углы: 360.716156 0.000000 0.000000
    [FS] Позиция: 2642.860351 4750.902832 -976.385742
    Вектор между точками А и б  (функция MakeVectorFromPoints. там просто вычитание позиции А из Б):
    fTempVec:: -53.144775 -174.051757 -0.238098

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

     

    Дальше нужно как-то повернуть вектор на нужные нам углы, и узнать конечную точку повернутого вектора, это и есть будущая позиция после поворота

    Ссылка на комментарий
    Поделиться на других сайтах

    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

    Ссылка на комментарий
    Поделиться на других сайтах

    //---------------------------------------------------------
    // 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;
    }

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

    Ссылка на комментарий
    Поделиться на других сайтах

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

    Создать повёрнутый вектор, например, 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

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

    Ссылка на комментарий
    Поделиться на других сайтах

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

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

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

    1.JPG2.JPG

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

    3.JPG

    Ссылка на комментарий
    Поделиться на других сайтах

    давай проще, вот смотри я имею угол вектора между точками А и Б, так, я должен прибавить к ним угол на который будем поворачивать, допустим 90 градусов, окей из fTempVecAng:: 0.074962 253.020523 0.000000 стало fTempVecAng:: 0.074962 343.020523 0.000000, дальше я не понял..

    Ссылка на комментарий
    Поделиться на других сайтах

    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 градусов

    Ссылка на комментарий
    Поделиться на других сайтах

    А потом оба объекта повернуть по той же оси, что и вектор АВ до этого и получится, что были повёрнуты два объекта с сохранением расстояния друг до друга и правильно повёрнутыми осями

    Ссылка на комментарий
    Поделиться на других сайтах

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

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

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

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

    Ссылка на комментарий
    Поделиться на других сайтах

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

    fTempVecAng:: 0.074962 253.020523 90.00000

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

    если бы я еще знал как это правильно сделать

    Ссылка на комментарий
    Поделиться на других сайтах




    Присоединяйтесь к обсуждению

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

    Гость
    Добавить комментарий...

    ×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

      Разрешено не более 75 эмодзи.

    ×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

    ×   Ваш предыдущий контент был восстановлен.   Очистить редактор

    ×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.


  • Обозначения статусов

    В обработке = Мы работаем над вашим отзывом.

    Будет сделано = Ваша идея добавлена к плану будущих изменений.

    Тестируется = Изменения внесены, но требуют тестирования.

    Сделано = Ваша идея реализована!

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

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