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


    Electr0
    • Сделано

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

     

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

     

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

     

    Flight_dynamics_with_text.png

     

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


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

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



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

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

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

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

    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 сказал:

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

    :(

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

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

    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

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

    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

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

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

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

     

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

     

    Снимок2.JPG

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

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

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

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

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

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

     

    3.png

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

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

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

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

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

    3.png

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

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

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

    Return Value

    Dot product of the two vectors.

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

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

    Снимок.JPG

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

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

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

    20160627132324_1.jpg

     

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

    До

    20160627133150_1.jpg

    после

    20160627133247_1.jpg

     

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

     

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

    20160627133450_1.jpg

    20160627133451_1.jpg

    20160627133452_1.jpg

    20160627133453_1.jpg

     

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

     

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

    20160627134301_1.jpg

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

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

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

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

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




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

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

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

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

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

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

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

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


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

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

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

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

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

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

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