Перейти к содержанию
  • Поворот группы предметов по вертикали как одного


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

     

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

     

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

     

    Flight_dynamics_with_text.png

     

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


    Обратная связь

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



    KOllapsE

    Опубликовано

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

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

    Есть же выравнивание в стройке и оно работает (по X, Y, или Z)

    Electr0

    Опубликовано

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

    Есть же выравнивание в стройке и оно работает (по X, Y, или Z)

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

    KOllapsE

    Опубликовано

    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, то это и будет точка С, куда потом второй объект перемещать

    Electr0

    Опубликовано

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

    KOllapsE

    Опубликовано

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

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

    :(

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

    KOllapsE

    Опубликовано

    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

    KOllapsE

    Опубликовано

    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

    Electr0

    Опубликовано

    3 часа назад, KOllapsE сказал:

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

     

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

     

    Снимок2.JPG

    а как создать вектор АС если я не знаю точку эту

    KOllapsE

    Опубликовано

    @Electr0 фишка в том, что дублируется АВ (два АВ получается). Потом одному из них изменяется градус. Полученный вектор и будет АС. Это просто повёрнутый АВ

    KOllapsE

    Опубликовано

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

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

     

    3.png

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

    Electr0

    Опубликовано

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

    KOllapsE

    Опубликовано

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

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

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

    3.png

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

    Electr0

    Опубликовано

    Return Value

    Dot product of the two vectors.

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

    KOllapsE

    Опубликовано

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

    Return Value

    Dot product of the two vectors.

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

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

    Снимок.JPG

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

    KOllapsE

    Опубликовано

    1 час назад, Electr0 сказал:

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

    Мб эта штука даст?

    54641.JPG

    Electr0

    Опубликовано

    Вектор не равен позиции на координатной плоскости

    Electr0

    Опубликовано

    Вот так все и не понятно как и тогда когда последний раз пробовал

    Electr0

    Опубликовано

    после добавления поддержки аргументов нарисовал это, нажимая на 45, -45, 90, -90, центральная полоска это оригинальный вектор от точки А к точке Б

    20160627132324_1.jpg

     

    Electr0

    Опубликовано

    До

    20160627133150_1.jpg

    после

    20160627133247_1.jpg

     

    похоже RotateYaw обладает не документированной проблемой D, которую я помню еще по временам когда сам строил, она не знает когда предмет повернут на бок

     

    если не поворачивать предметы на бок то все ок:

    20160627133450_1.jpg

    20160627133451_1.jpg

    20160627133452_1.jpg

    20160627133453_1.jpg

     

    здесь нужен другой метод для поворотов углов ><

     

    если поворачивать на один градус все время можно нарисовать это  :D

    20160627134301_1.jpg

    Electr0

    Опубликовано

    я думаю нужно сделать аналог RotateYAW но по умнее, нужно учитывать повернутости осей, и судя по тому что я вижу на разубежных форумах (3D редакторы, 3D движки, рендеринг) много у кого такая проблема

    Electr0

    Опубликовано

    проблема оказалась менее трагичной и я ее обошел, теперь новая проблема, операция эта очень много затратная, сервер прикуривает нереально сильно




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

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

    Гость
    К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
    Добавить комментарий...

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

      Разрешено использовать не более 75 эмодзи.

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

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

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


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

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

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

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

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

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

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