Вопрос Проблемы с WorldToScreen

Начинающий
Статус
Оффлайн
Регистрация
29 Май 2023
Сообщения
11
Реакции[?]
0
Поинты[?]
0
Да, это не дота, но я не знаю куда еще написать с этим вопросом. Я пытаюсь отрисовать куб точно таким же методом как рисовал в доте, но почему то это не работает. Как будто центр смещен или что-то в этом роде. Иногда оно отрисовывает как надо, что очень странно. Помогите пожалуйста...
WorldToScreen брал отсюда
Пожалуйста, авторизуйтесь для просмотра ссылки.


WorldToScreen:
bool WorldToScreen( const Math::Vector_t< float, 3 >& vecWorld, Math::Vector_t< float, 2 >& vecOutScreen )
    {
        CRenderGameSystem* pRenderGameSystem = *CTX::DOTA->m_ppRenderGameSystem;
        if ( !pRenderGameSystem )
            return false;

        const Math::ViewMatrix_t& matWorldToScreen = pRenderGameSystem->WorldToProjectionMatrix( );
        const float flWidth = matWorldToScreen[ 3 ][ 0 ] * vecWorld[ 0 ] + matWorldToScreen[ 3 ][ 1 ] * vecWorld[ 1 ] + matWorldToScreen[ 3 ][ 2 ] * vecWorld[ 2 ] + matWorldToScreen[ 3 ][ 3 ];

        if ( flWidth < 0.001f )
            return false;

        const float flInverse = 1.0f / flWidth;
        vecOutScreen[ 0 ] = ( matWorldToScreen[ 0 ][ 0 ] * vecWorld[ 0 ] + matWorldToScreen[ 0 ][ 1 ] * vecWorld[ 1 ] + matWorldToScreen[ 0 ][ 2 ] * vecWorld[ 2 ] + matWorldToScreen[ 0 ][ 3 ] ) * flInverse;
        vecOutScreen[ 1 ] = ( matWorldToScreen[ 1 ][ 0 ] * vecWorld[ 0 ] + matWorldToScreen[ 1 ][ 1 ] * vecWorld[ 1 ] + matWorldToScreen[ 1 ][ 2 ] * vecWorld[ 2 ] + matWorldToScreen[ 1 ][ 3 ] ) * flInverse;

        vecOutScreen[ 0 ] = std::floor( ( vecDisplaySize[ 0 ] * 0.5f ) + ( vecOutScreen[ 0 ] * vecDisplaySize[ 0 ] ) * 0.5f );
        vecOutScreen[ 1 ] = std::floor( ( vecDisplaySize[ 1 ] * 0.5f ) - ( vecOutScreen[ 1 ] * vecDisplaySize[ 1 ] ) * 0.5f );
        return true;
    }
1725712782016.png
 
Начинающий
Статус
Оффлайн
Регистрация
29 Май 2023
Сообщения
11
Реакции[?]
0
Поинты[?]
0
Поймал момент когда рисует нормально, и решил сравнить WorldToProjection матрицу.

когда отрисовывает криво:
[0.203738,-0.876878,0.838017,0.837789]
[-0.955949,-0.186886,0.178604,0.178555]
[-2.20446E-08,1.48847,0.516113,0.515973]
[-1786.93,1033.03,-1150.61,-1143.3]

когда отрисовывает нормально:
[0.20426,-0.874393,0.838744,0.838516]
[-0.955838,-0.186855,0.179237,0.179188]
[-2.19847E-08,1.48993,0.51471,0.514571]
[-1787.61,1029.03,-1150.68,-1143.37]

крч видимо дело не в матрице...
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
774
Реакции[?]
330
Поинты[?]
62K
Да, это не дота, но я не знаю куда еще написать с этим вопросом. Я пытаюсь отрисовать куб точно таким же методом как рисовал в доте, но почему то это не работает. Как будто центр смещен или что-то в этом роде. Иногда оно отрисовывает как надо, что очень странно. Помогите пожалуйста...
WorldToScreen брал отсюда
Пожалуйста, авторизуйтесь для просмотра ссылки.


WorldToScreen:
bool WorldToScreen( const Math::Vector_t< float, 3 >& vecWorld, Math::Vector_t< float, 2 >& vecOutScreen )
    {
        CRenderGameSystem* pRenderGameSystem = *CTX::DOTA->m_ppRenderGameSystem;
        if ( !pRenderGameSystem )
            return false;

        const Math::ViewMatrix_t& matWorldToScreen = pRenderGameSystem->WorldToProjectionMatrix( );
        const float flWidth = matWorldToScreen[ 3 ][ 0 ] * vecWorld[ 0 ] + matWorldToScreen[ 3 ][ 1 ] * vecWorld[ 1 ] + matWorldToScreen[ 3 ][ 2 ] * vecWorld[ 2 ] + matWorldToScreen[ 3 ][ 3 ];

        if ( flWidth < 0.001f )
            return false;

        const float flInverse = 1.0f / flWidth;
        vecOutScreen[ 0 ] = ( matWorldToScreen[ 0 ][ 0 ] * vecWorld[ 0 ] + matWorldToScreen[ 0 ][ 1 ] * vecWorld[ 1 ] + matWorldToScreen[ 0 ][ 2 ] * vecWorld[ 2 ] + matWorldToScreen[ 0 ][ 3 ] ) * flInverse;
        vecOutScreen[ 1 ] = ( matWorldToScreen[ 1 ][ 0 ] * vecWorld[ 0 ] + matWorldToScreen[ 1 ][ 1 ] * vecWorld[ 1 ] + matWorldToScreen[ 1 ][ 2 ] * vecWorld[ 2 ] + matWorldToScreen[ 1 ][ 3 ] ) * flInverse;

        vecOutScreen[ 0 ] = std::floor( ( vecDisplaySize[ 0 ] * 0.5f ) + ( vecOutScreen[ 0 ] * vecDisplaySize[ 0 ] ) * 0.5f );
        vecOutScreen[ 1 ] = std::floor( ( vecDisplaySize[ 1 ] * 0.5f ) - ( vecOutScreen[ 1 ] * vecDisplaySize[ 1 ] ) * 0.5f );
        return true;
    }
Посмотреть вложение 285103
в каждой игре разная ориентация векторного пространства, конфигурация осей разная, формат матриц разный и тд ты не надейся что геометрический код из одной игры будет 1 в 1 без проблем работать в любой другой игре.
для тестов корректности можешь взять конкретную точку в мире(у которой ты знаешь 3д координаты и примерно представляешь где она на экране должна быть), у себя в чите захардкодить координаты и смотреть при каких условиях у тебя нормально рисует, а когда слетает, плюс с разными фовами(угол обзора, в настройках обычно есть, он также меняется когда например прицеливаешься(ну зум любого вида это обычно просто изменение фова)) тестировать
на анноунчитс инфу поищи или ваще погугли про эту игру насчет в2с.
либо сам смотри какая там конфигурация осей(xyz за что отвечают что из них ширина высота глубина и с каким знаком), ориентация(леворукая/праворукая(правый вектор обычно влево направлен у праворуких, либо передний вектор назад направлен, либо верхний вниз направлен), погугли) и переделывай свой код
что за игра?
 
Начинающий
Статус
Оффлайн
Регистрация
29 Май 2023
Сообщения
11
Реакции[?]
0
Поинты[?]
0
в каждой игре разная ориентация векторного пространства, конфигурация осей разная, формат матриц разный и тд ты не надейся что геометрический код из одной игры будет 1 в 1 без проблем работать в любой другой игре.
для тестов корректности можешь взять конкретную точку в мире(у которой ты знаешь 3д координаты и примерно представляешь где она на экране должна быть), у себя в чите захардкодить координаты и смотреть при каких условиях у тебя нормально рисует, а когда слетает, плюс с разными фовами(угол обзора, в настройках обычно есть, он также меняется когда например прицеливаешься(ну зум любого вида это обычно просто изменение фова)) тестировать
на анноунчитс инфу поищи или ваще погугли про эту игру насчет в2с.
либо сам смотри какая там конфигурация осей(xyz за что отвечают что из них ширина высота глубина и с каким знаком), ориентация(леворукая/праворукая(правый вектор обычно влево направлен у праворуких, либо передний вектор назад направлен, либо верхний вниз направлен), погугли) и переделывай свой код
что за игра?
игра - deadlock. ну я подумал раз движок один и тот же, то похожи будут(у них даже индекс worldtoprojection один и тот же). я искал по юц что либо про w2s но ничего не нашел, весь тред по дедлоку просмотрел.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
774
Реакции[?]
330
Поинты[?]
62K
игра - deadlock. ну я подумал раз движок один и тот же, то похожи будут(у них даже индекс worldtoprojection один и тот же). я искал по юц что либо про w2s но ничего не нашел, весь тред по дедлоку просмотрел.
ну если движок один и тот же то все одинаково впринципе должно быть(нахуя им систему координат менять) мб ты прост чето не то вытворяешь?
ты тестировал просто с одной точкой а не кубом?
почитай еще раз внимательнее анноунчитс попробуй оттуда матрицу возьми
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Начинающий
Статус
Оффлайн
Регистрация
29 Май 2023
Сообщения
11
Реакции[?]
0
Поинты[?]
0
ну если движок один и тот же то все одинаково впринципе должно быть(нахуя им систему координат менять) мб ты прост чето не то вытворяешь?
ты тестировал просто с одной точкой а не кубом?
почитай еще раз внимательнее анноунчитс попробуй оттуда матрицу возьми
Пожалуйста, авторизуйтесь для просмотра ссылки.
крч, я отрисовываю кубик и вообще всё с помощью directx tool kit, и видимо это какой то ее закидон, worldtoscreen работает правильно, там типа directxtk рисует (0,0) не в (0,0) а в (190,190). правда я так и не понял почему это происходит и почему это иногда не происходит...
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
774
Реакции[?]
330
Поинты[?]
62K
крч, я отрисовываю кубик и вообще всё с помощью directx tool kit, и видимо это какой то ее закидон, worldtoscreen работает правильно, там типа directxtk рисует (0,0) не в (0,0) а в (190,190). правда я так и не понял почему это происходит и почему это иногда не происходит...
там у директикса всякие стейты объекты таргеты есть(ну настройки девайса кароче если можно так выразиться), там надо их сбрасывать(и свои выставлять) когда рисуешь. мб в этом проблема? они как раз "нестабильны"(игра разные настройки ставит когда надо).
попробуй имгуи для теста какой-нибудь возьми и посмотри есть ли проблема с ним, если нет смотри че он там юзает/выставляет
 
Начинающий
Статус
Оффлайн
Регистрация
29 Май 2023
Сообщения
11
Реакции[?]
0
Поинты[?]
0
там у директикса всякие стейты объекты таргеты есть(ну настройки девайса кароче если можно так выразиться), там надо их сбрасывать(и свои выставлять) когда рисуешь. мб в этом проблема? они как раз "нестабильны"(игра разные настройки ставит когда надо).
попробуй имгуи для теста какой-нибудь возьми и посмотри есть ли проблема с ним, если нет смотри че он там юзает/выставляет
о, как раз с имгуи проблем нет, щас пойду проверять, спасибо за наводку
там у директикса всякие стейты объекты таргеты есть(ну настройки девайса кароче если можно так выразиться), там надо их сбрасывать(и свои выставлять) когда рисуешь. мб в этом проблема? они как раз "нестабильны"(игра разные настройки ставит когда надо).
попробуй имгуи для теста какой-нибудь возьми и посмотри есть ли проблема с ним, если нет смотри че он там юзает/выставляет
капес, как я не додумался заглянуть в имгуи, он ведь отлично работает! помогло добавление вот этих строк

C++:
 D3D11_VIEWPORT vp;
 memset(&vp, 0, sizeof(D3D11_VIEWPORT));
 vp.Width = 1920.f;
 vp.Height = 1080.f;
 vp.MinDepth = 0.0f;
 vp.MaxDepth = 1.0f;
 vp.TopLeftX = vp.TopLeftY = 0;
 context->RSSetViewports(1, &vp);
всё магия, если не знать directx(видимо придется чтото почитать)
огромное спасибо, Liberalist.
 
Последнее редактирование:
Сверху Снизу