HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- [Тутор] Кастомный фов для вьюмодели (https://hlfx.ru/forum/showthread.php?threadid=2050)
Отправлено Дядя Миша 07-01-2010 в 13:48:
[Тутор] Кастомный фов для вьюмодели
Ко мне вчера в аську постучалось несколько человек и все вдруг попросили сделать кастомный fov для вьюмодели в халфе.
Наверное это был какой-то праздничный флэшмоб.
Собственно говоря проблема заключается в неправильном отображении вьюмоделек из хл2 где имелся кастомный фов и его можно было крутить.
Так или иначе - я выполнил их просьбу и написал простенький код который делает желаемое.
Постить сюда исходники не буду - смотрите рар-хив.
Собственно код очень простой - мы выбираем проективную матрицу, сохраняем текущую, и загружаем собственную в момент отрисовки вью-модели. А затем восстанавливаем основную.
FOV меняется консольной переменной cl_viewmodel_fov и работает только для OpenGL рендера (ну впрочем как и всегда).
О том, что кастомный FOV включен нас информирует строчка в консоли
CStudioModelRenderer: enable custom fov (в самом верху).
В рар-хиве изменные файлы оригинального сдк+скомпиленная дллка.
Наслаждайтесь 
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено BeFore 07-01-2010 в 14:18:
Дядя Миша
Ага, помню я у тебя тоже спрашивал несколько месяцев назад 
Есть еще другой вариант как сделать viewmodel_fov, но результат один и тот-же.
Отправлено Дядя Миша 07-01-2010 в 16:01:
Цитата:
BeFore писал:
Есть еще другой вариант как сделать viewmodel_fov, но результат один и тот-же.
расскажи что за вариант?
Добавлено 07-01-2010 в 19:01:
А вот вам исправленная и дополненная версия 
В этом коде учитывается текущий fov (например для арбалета), корректируется перспектива для карт с кастомным MaxRange
и положение аттачментов (теперь рисуются правильно).__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Дядя Миша 07-01-2010 в 17:23:
И еще один маленький (последний) фикс - трипмайны на стенках глючили.
Ошибся я малость в коде.
На этом позвольте откланяться - больше я к этому коду не вернусь.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено PoD-Stas 07-01-2010 в 17:37:
Дядя Миша это рассчитывается по формуле
viewer distance = (screenwidth)/(2*tan(FOV/2)) ?
И вопрос в ХЛ2 вроде как не только размещение вью модели меняется, или не так?
Отправлено Дядя Миша 07-01-2010 в 20:28:
Цитата:
PoD-Stas писал:
это рассчитывается по формуле
Что ЭТО ? 
Цитата:
PoD-Stas писал:
И вопрос в ХЛ2 вроде как не только размещение вью модели меняется, или не так?
Понятия не имею как в хл2. Народ говорит что все правильно.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено PLut 07-01-2010 в 20:32:
ААА!! Ты крут! Спасибо! Я долго мучался и делал сам вьюмодел_фов и сделал, БиФор про мой способ говорит. Я в StudioDrawModel выставлял матрицу проекции для вьюмодели и возращал.
У моего способа есть слабость - аттачменты на фове 90 остаются вродь, вообщем маззлфлэш не там где надо 
__________________
Base Defense on Steam, ModDB
Отправлено Дядя Миша 07-01-2010 в 20:42:
Цитата:
PLut писал:
Я в StudioDrawModel выставлял матрицу проекции для вьюмодели и возращал.
А я по твоему как сделал? Вы хоть в исходники загляните сперва, а потом умничайте.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено PLut 07-01-2010 в 20:53:
Да я скачал только что 
__________________
Base Defense on Steam, ModDB
Отправлено XaeroX 07-01-2010 в 21:19:
PLut Ты и первый пост не читал, надо полагать.
Цитата:
Дядя Миша писал:
мы выбираем проективную матрицу, сохраняем текущую, и загружаем собственную в момент отрисовки вью-модели. А затем восстанавливаем основную.
Чукча, как известно, не читатель - ему бы поскорее камент зафигачить 
__________________
Отправлено PLut 07-01-2010 в 23:26:
Да, поторопился
Кстати по поводу фишек из хл2, расскажите пожалуйста о инертном смещении оригина вьюмодели при изменении направления обзора 
Ну или просто: отставание вьюмодели когда вертишь башкой.
Расскажите как сделать это можно и вообще какие способы.
__________________
Base Defense on Steam, ModDB
Отправлено FiEctro 08-01-2010 в 10:00:
PLut
player.h
C++ Source Code:
2 | float posiciondemanos_abajo; |
3 | float posiciondemanos_adentro; |
4 | float posiciondemanos_medio; |
client.cpp - ClientCommand()
C++ Source Code:
1 | else if ( FStrEq(pcmd, "iron" ) ) |
3 | if ( GetClassPtr((CBasePlayer *)pev)->m_bIron ) |
4 | GetClassPtr((CBasePlayer *)pev)->m_bIron = FALSE; |
6 | GetClassPtr((CBasePlayer *)pev)->m_bIron = TRUE; |
player.cpp - Prethink()
C++ Source Code:
2 | pClient = g_engfuncs.pfnPEntityOfEntIndex( 1 ); |
6 | if ( m_Activity == ACT_RELOAD || m_Activity == ACT_HOP ) |
11 | //change weapon's aiment |
12 | posiciondemanos_abajo = -1.0; |
14 | if(posiciondemanos_medio <= 3.4) |
15 | posiciondemanos_medio += 0.12; |
17 | posiciondemanos_adentro = 0.0; |
19 | if(posiciondezoom >= 55.0) |
20 | posiciondezoom -= 1.0; |
23 | g_engfuncs.pfnSetClientMaxspeed( ENT( pev ), 120 ); |
25 | if ( posiciondemanos_abajo >= 0.0 ) |
26 | posiciondemanos_abajo -= 0.1; |
28 | if(posiciondemanos_abajo <= 0.0) |
29 | posiciondemanos_abajo = 0.0; |
31 | if ( posiciondemanos_adentro >= 0.0 ) |
32 | posiciondemanos_adentro -=0.1; |
34 | if(posiciondemanos_adentro <= 0.0) |
35 | posiciondemanos_adentro = 0.0; |
38 | if ( posiciondemanos_medio > 0.0 ) |
39 | posiciondemanos_medio -= 0.1; |
41 | if ( posiciondemanos_medio < 0.0 ) |
42 | posiciondemanos_medio += 0.1; |
44 | if(posiciondezoom < 90)//fix |
47 | CLIENT_COMMAND(pClient, "scr_ofsz %f\n", posiciondemanos_abajo);//down |
48 | CLIENT_COMMAND(pClient, "scr_ofsx %f\n", posiciondemanos_adentro);//back |
49 | CLIENT_COMMAND(pClient, "scr_ofsy %f\n", posiciondemanos_medio);//back |
51 | CLIENT_COMMAND(pClient, "default_fov %f\n", posiciondezoom);//down |
54 | //change weapon's aiment |
55 | posiciondemanos_abajo = -1.0; |
57 | if(posiciondemanos_medio <= 3.4) |
58 | posiciondemanos_medio += 0.12; |
60 | posiciondemanos_adentro = 0.0; |
62 | if(posiciondezoom >= 55.0) |
63 | posiciondezoom -= 1.0; |
66 | g_engfuncs.pfnSetClientMaxspeed( ENT( pev ), 120 ); |
70 | g_engfuncs.pfnSetClientMaxspeed( ENT( pev ), CVAR_GET_FLOAT( "sv_maxspeed") ); |
C++ Source Code:
pEntity = FindEntityForward( this ); |
после
C++ Source Code:
На деле не проверял, так что если не пашет то ой.__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено PLut 08-01-2010 в 10:10:
1. Код из АМ
2. Это код ironsight (прицел с мушки)
3. Здесь не оригин смещается, а сама камера, как я понял...
Вот видео того о чем я говорю: http://www.youtube.com/watch?v=eUiNLldsfW0
Смотреть на вьюмодельку. В хл1 она не отстает от прицела и двигается топорно вместе с камерой, а в хл2 она плавно двигается.
__________________
Base Defense on Steam, ModDB
Отправлено Дядя Миша 08-01-2010 в 10:28:
PLut возьми код из управления раектой редемира.
Она там тоже напарвление не сразу меняет.
Пихни этот код с сервера на клиент и добавляй к углам пушки.
Получится та же самая иррунда. UTIL_ApproachAngle тебе надо или што-то такое.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено PLut 08-01-2010 в 11:09:
Спасибо, сейчас буду разбираться.
__________________
Base Defense on Steam, ModDB
Отправлено (_-=ZhekA=-_) 08-01-2010 в 12:22:
FiEctro
А по подробней можно ? 
__________________
Kiss my ass if you don't like my Ford!
------------------------------------------
Game Area51 Update 1
First Person Shooter Released Jul 24, 2017
The game is a 3d shooter with the elements of the quest.
http://button.moddb.com/download/medium/125531.png
Отправлено Дядя Миша 08-01-2010 в 13:04:
(_-=ZhekA=-_) да ерунда это, а не код.
Тем более он из арранжемента.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено PLut 08-01-2010 в 13:07:
(_-=ZhekA=-_) Куда подробней?
Вот видео демонстрирующее это чудо: http://www.youtube.com/watch?v=hm_630JagxA
Заметте что вьюмоделька двигается подобно хл2. НО! Этот способ убогий, используется пунч из паранойи, когда двигаешь мышкой пунч срабатывает, т.е. там не отстает вьюмоделька.
Кстати пунч серверный, это еще один минус.
__________________
Base Defense on Steam, ModDB
Отправлено Дядя Миша 08-01-2010 в 13:08:
PLut там достаточно крутить углы. Оригин менять не нужно.
В конце концов есть сорцы клиента из хл2 - возьмите код оттуда.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FiEctro 08-01-2010 в 19:31:
PLut
Оказывается не один я посещаю этот форум
.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено BeFore 08-01-2010 в 19:47:
FiEctro
Угу, еще я там иногда лазаю 
Отправлено PLut 08-01-2010 в 20:44:
Перенес аппрочангл, только незнаю как его использовать.
__________________
Base Defense on Steam, ModDB
Отправлено Дядя Миша 08-01-2010 в 21:38:
PLut
што тут думать блин
C++ Source Code:
viewent->v.angles[PITCH] = UTIL_ApproachAngle( pparams->viewangles[PITCH], viewent->v.angles[PITCH], 0.5 ); |
Пишу по памяти, как в ксаше они называются, но думаю общая идея ясна.
Последнее значение - скорость отставания.
Для YAW и ROLL - по аналогии.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено PLut 08-01-2010 в 21:56:
C++ Source Code:
view->angles[PITCH] = UTIL_ApproachAngle( pparams->viewangles[PITCH], view->angles[PITCH], 0.5 ); |
view->angles[YAW] = UTIL_ApproachAngle( pparams->viewangles[YAW], view->angles[YAW], 0.5 ); |
view->angles[ROLL] = UTIL_ApproachAngle( pparams->viewangles[ROLL], view->angles[ROLL], 0.5 ); |
Так сделал, всё так же как и было.__________________
Base Defense on Steam, ModDB
Отправлено Дядя Миша 09-01-2010 в 07:13:
PLut вот ты говоришь - исправь глюки. Да это жы фсъо твои кривые руки! Ты говоришь - сервер повис. Да у вас там явно проблемы с железом, причем тут релиз? (С)
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено PLut 09-01-2010 в 11:10:
Те 3 строки бред и их надо фиксить?
__________________
Base Defense on Steam, ModDB
Отправлено Дядя Миша 09-01-2010 в 11:37:
PLut с последним параметром не судьба поиграться?
0.5 много - так поставь 0.05. Ну што вы нерешительные такие.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено PLut 09-01-2010 в 12:39:
Пробовал, всё так же.
__________________
Base Defense on Steam, ModDB
Отправлено Дядя Миша 09-01-2010 в 14:44:
PLut ну тады - ой. 
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено PLut 09-01-2010 в 20:21:
Дядя Миша Мы с BeFore'ом сделали по-другому, работает хреново, но работает.
Кстати когда продолжишь писать туторы по физике? Или интерес к движку Крэзи не исчез?)
__________________
Base Defense on Steam, ModDB
Отправлено Дядя Миша 09-01-2010 в 21:25:
PLut да все по прежнему, я от своих слов не отказуюсь.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено PLut 10-12-2010 в 14:57:
Прошу прощения за поднятие старой темы, но я исправил неприятный баг со сдвигом аттачментов во время движения, либо когда осматриваешься. На самом деле всё просто: заменил оригин и углы из класса CStudioModelRenderer на глобальные вектора v_origin, v_angles.
Надо в StudioModelRenderer.cpp заменить всю функцию StudioFormatAttachment.
Код ниже. Я немного перелопатил его в ходе выяснения причины бага, смотрел как в хл2бета сделано.
C++ Source Code:
1 | extern vec3_t v_origin, v_angles; |
3 | void CStudioModelRenderer::StudioFormatAttachment( int nAttachment, bool bInverse ) |
5 | float worldx = tan( (float)gHUD.m_iFOV * M_PI / 360.0 ); |
6 | float viewx = tan( m_flViewmodelFov * M_PI / 360.0 ); |
8 | // aspect ratio cancels out, so only need one factor |
9 | // the difference between the screen coordinates of the 2 systems is the ratio |
10 | // of the coefficients of the projection matrices (tan (fov/2) is that coefficient) |
11 | float factor = worldx / viewx; |
13 | vec3_t vForward, vRight, vUp; |
14 | AngleVectors( v_angles, vForward, vRight, vUp ); |
16 | // Get the coordinates in the viewer's space. |
17 | Vector tmp = m_pCurrentEntity->attachment[nAttachment] - v_origin; |
18 | Vector vTransformed( DotProduct( vRight, tmp ), DotProduct( vUp, tmp ), DotProduct( vForward, tmp ) ); |
20 | // Now squash X and Y. |
25 | vTransformed.x /= factor; |
26 | vTransformed.y /= factor; |
30 | vTransformed.x = 0.0f; |
31 | vTransformed.y = 0.0f; |
36 | vTransformed.x *= factor; |
37 | vTransformed.y *= factor; |
40 | // Transform back to world space. |
41 | Vector vOut = (vRight * vTransformed.x) + (vUp * vTransformed.y) + (vForward * vTransformed.z); |
42 | m_pCurrentEntity->attachment[nAttachment] = v_origin + vOut; |
Надеюсь, что помог кому-нибудь 
__________________
Base Defense on Steam, ModDB
Отправлено Дядя Миша 10-12-2010 в 15:26:
Цитата:
PLut писал:
Прошу прощения за поднятие старой темы
если пишешь по делу - извиняться не надо. А наоборот молодец.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'