Viewmodel: Difference between revisions
Jump to navigation
Jump to search
Tip:By default Viewmodels are drawn with a 54° field of view, which approximates a 35mm camera lens. This is considerably lower than the world view's default of 75°. Another thing to be aware of is some programs may use half angles for the FOV so instead of 54° you might have something like 27°.
BasolOrics (talk | contribs) No edit summary |
m (Setting bug notice hidetested=1 param on page where the bug might not need tested in param specified) |
||
(55 intermediate revisions by 25 users not shown) | |||
Line 1: | Line 1: | ||
[ | [[File:Shotgun vm.jpg|thumb|A viewmodel on-screen]] | ||
[[ | [[File:v_shotgun_hlmv.jpg|thumb|Elongation is often employed]] | ||
{{CD|CBaseViewModel|file1=1}} | |||
A '''viewmodel''' is a model | A '''viewmodel''' is a specially-designed [[model]] used to represent the player's active weapon in first-person view (as opposed to the ordinary "[[:Category:World Models|worldmodel]]s" used elsewhere). | ||
Because they appear so prominently on the screen and are only seen from a limited set of angles, viewmodels generally have the following distinguishing features: | |||
# Parts that the player will never see are removed | |||
# Parts that the player does see are very detailed | |||
# The model as a whole is distorted to look its best from the one viewing angle | |||
* | |||
Each player has two [[CBaseViewModel|viewmodel entities]] (to allow for dual wielding etc), the models of which are changed as appropriate. Both entities are, of course, only transmitted to their owner. | |||
:{{bug|hidetested=1|Some viewmodels in {{hl2dm|4}} are missing viewbob.{{fix|Follow [https://www.youtube.com/watch?v{{=}}reVpIiCZi6Q this YouTube guide] to fix the issues in the code.}}}} | |||
The Viewmodel entity is already set up to have [[VGUI on entity|VGUI panel]]s attached. | |||
{{tip|By default Viewmodels are drawn with a 54° field of view, which approximates a 35mm camera lens. This is considerably lower than the world view's default of 75°. Another thing to be aware of is some programs may use half angles for the FOV so instead of 54° you might have something like 27°.}} | |||
== Creating a viewmodel == | |||
Three golden rules: | |||
* You must attach a sequence to the <code>ACT_VM_IDLE</code> [[activity]] before the model will appear. | |||
* You should use [[$origin]] to adjust the location of the model, or it will be drawn in the centre of screen. | |||
* In your modelling package, create a camera at the appropriate position and keep it visible while you work. | |||
If you still can't see your viewmodel, try using the console command <code>thirdperson</code>. It might be facing the wrong way. | |||
=== Basic activities === | |||
<source lang=cpp> | |||
ACT_VM_DRAW, | |||
ACT_VM_HOLSTER, | |||
ACT_VM_IDLE, | |||
ACT_VM_FIDGET, | |||
ACT_VM_PULLBACK, | |||
ACT_VM_PULLBACK_HIGH, | |||
ACT_VM_PULLBACK_LOW, | |||
ACT_VM_THROW, | |||
ACT_VM_PULLPIN, | |||
ACT_VM_PRIMARYATTACK, // fire | |||
ACT_VM_SECONDARYATTACK, // alt. fire | |||
ACT_VM_RELOAD, | |||
ACT_VM_DRYFIRE, // fire with no ammo loaded. | |||
ACT_VM_HITLEFT, // bludgeon, swing to left - hit (primary attk) | |||
ACT_VM_HITLEFT2, // bludgeon, swing to left - hit (secondary attk) | |||
ACT_VM_HITRIGHT, // bludgeon, swing to right - hit (primary attk) | |||
ACT_VM_HITRIGHT2, // bludgeon, swing to right - hit (secondary attk) | |||
ACT_VM_HITCENTER, // bludgeon, swing center - hit (primary attk) | |||
ACT_VM_HITCENTER2, // bludgeon, swing center - hit (secondary attk) | |||
ACT_VM_MISSLEFT, // bludgeon, swing to left - miss (primary attk) | |||
ACT_VM_MISSLEFT2, // bludgeon, swing to left - miss (secondary attk) | |||
ACT_VM_MISSRIGHT, // bludgeon, swing to right - miss (primary attk) | |||
ACT_VM_MISSRIGHT2, // bludgeon, swing to right - miss (secondary attk) | |||
ACT_VM_MISSCENTER, // bludgeon, swing center - miss (primary attk) | |||
ACT_VM_MISSCENTER2, // bludgeon, swing center - miss (secondary attk) | |||
ACT_VM_HAULBACK, // bludgeon, haul the weapon back for a hard strike (secondary attk) | |||
ACT_VM_SWINGHARD, // bludgeon, release the hard strike (secondary attk) | |||
ACT_VM_SWINGMISS, | |||
ACT_VM_SWINGHIT, | |||
ACT_VM_IDLE_TO_LOWERED, | |||
ACT_VM_IDLE_LOWERED, | |||
ACT_VM_LOWERED_TO_IDLE, | |||
ACT_VM_RECOIL1, | |||
ACT_VM_RECOIL2, | |||
ACT_VM_RECOIL3, | |||
ACT_VM_PICKUP, | |||
ACT_VM_RELEASE, | |||
ACT_VM_ATTACH_SILENCER, | |||
ACT_VM_DETACH_SILENCER, | |||
</source> | |||
== Programming == | |||
=== CBaseViewModel === | |||
; <code>void SetWeaponModel( const [[char]]* modelname, [[CBaseCombatWeapon]]* weapon )</code> | |||
: Updates the VM's model. This function is only used during the HL2 suit equip animation. | |||
; <code>void CalcViewModelView()</code> | |||
: Calculates the VM's bob (due to player movement), swing (due to player turning), and shake (due to [[env_shake]] etc) ''on the client only''. This function calls <code>AddViewModelBob()</code> and <code>CalcViewModelLag()</code>. | |||
; <code>[[int]] ViewModelIndex()</code> | |||
: Which of the owner's viewmodels this is. | |||
; <code>void SendViewModelMatchingSequence(int)</code> | |||
: Just changes the animation. The fancy name is probably a holdover. | |||
; <code>[[bool]] ShouldFlipViewModel()</code> | |||
: Whether the VM should be mirrored so that it appears on the other side of the screen. | |||
; <code>bool ShouldReceiveProjectedTextures()</code> | |||
: Whether the VM should receive [[env_projectedtexture|projected textures]]. | |||
=== CBaseCombatWeapon === | |||
; <code>void SetViewModel()</code> | |||
: Updates the owner's VM to this weapon's. | |||
; <code>void SetViewModelIndex([[int]])</code> | |||
: Which of the player's VM entities this weapon uses. | |||
; <code>void SendViewModelAnim(int nSequence)</code> | |||
; <code>[[float]] GetViewModelSequenceDuration()</code> | |||
; <code>[[bool]] IsViewModelSequenceFinished()</code> | |||
: Pass-throughs for standard <code>[[CBaseAnimating]]</code> funcs. | |||
== See also == | == See also == | ||
[[Category: | * [[Viewmodels in XSI]] | ||
* [[Viewmodels in Blender]] | |||
* [[Creating worldmodels from viewmodels]] | |||
* <code>[[CBaseViewModel]]</code> | |||
[[Category:Weapons]] | |||
[[Category:Modeling]] | |||
[[Category:C++]] |
Latest revision as of 07:12, 20 May 2025
![]() |
---|
CBaseViewModel |
![]() |
A viewmodel is a specially-designed model used to represent the player's active weapon in first-person view (as opposed to the ordinary "worldmodels" used elsewhere).
Because they appear so prominently on the screen and are only seen from a limited set of angles, viewmodels generally have the following distinguishing features:
- Parts that the player will never see are removed
- Parts that the player does see are very detailed
- The model as a whole is distorted to look its best from the one viewing angle
Each player has two viewmodel entities (to allow for dual wielding etc), the models of which are changed as appropriate. Both entities are, of course, only transmitted to their owner.
Bug:Some viewmodels in
Half-Life 2: Deathmatch are missing viewbob.
Fix:Follow this YouTube guide to fix the issues in the code.
The Viewmodel entity is already set up to have VGUI panels attached.

Creating a viewmodel
Three golden rules:
- You must attach a sequence to the
ACT_VM_IDLE
activity before the model will appear. - You should use $origin to adjust the location of the model, or it will be drawn in the centre of screen.
- In your modelling package, create a camera at the appropriate position and keep it visible while you work.
If you still can't see your viewmodel, try using the console command thirdperson
. It might be facing the wrong way.
Basic activities
ACT_VM_DRAW,
ACT_VM_HOLSTER,
ACT_VM_IDLE,
ACT_VM_FIDGET,
ACT_VM_PULLBACK,
ACT_VM_PULLBACK_HIGH,
ACT_VM_PULLBACK_LOW,
ACT_VM_THROW,
ACT_VM_PULLPIN,
ACT_VM_PRIMARYATTACK, // fire
ACT_VM_SECONDARYATTACK, // alt. fire
ACT_VM_RELOAD,
ACT_VM_DRYFIRE, // fire with no ammo loaded.
ACT_VM_HITLEFT, // bludgeon, swing to left - hit (primary attk)
ACT_VM_HITLEFT2, // bludgeon, swing to left - hit (secondary attk)
ACT_VM_HITRIGHT, // bludgeon, swing to right - hit (primary attk)
ACT_VM_HITRIGHT2, // bludgeon, swing to right - hit (secondary attk)
ACT_VM_HITCENTER, // bludgeon, swing center - hit (primary attk)
ACT_VM_HITCENTER2, // bludgeon, swing center - hit (secondary attk)
ACT_VM_MISSLEFT, // bludgeon, swing to left - miss (primary attk)
ACT_VM_MISSLEFT2, // bludgeon, swing to left - miss (secondary attk)
ACT_VM_MISSRIGHT, // bludgeon, swing to right - miss (primary attk)
ACT_VM_MISSRIGHT2, // bludgeon, swing to right - miss (secondary attk)
ACT_VM_MISSCENTER, // bludgeon, swing center - miss (primary attk)
ACT_VM_MISSCENTER2, // bludgeon, swing center - miss (secondary attk)
ACT_VM_HAULBACK, // bludgeon, haul the weapon back for a hard strike (secondary attk)
ACT_VM_SWINGHARD, // bludgeon, release the hard strike (secondary attk)
ACT_VM_SWINGMISS,
ACT_VM_SWINGHIT,
ACT_VM_IDLE_TO_LOWERED,
ACT_VM_IDLE_LOWERED,
ACT_VM_LOWERED_TO_IDLE,
ACT_VM_RECOIL1,
ACT_VM_RECOIL2,
ACT_VM_RECOIL3,
ACT_VM_PICKUP,
ACT_VM_RELEASE,
ACT_VM_ATTACH_SILENCER,
ACT_VM_DETACH_SILENCER,
Programming
CBaseViewModel
void SetWeaponModel( const char* modelname, CBaseCombatWeapon* weapon )
- Updates the VM's model. This function is only used during the HL2 suit equip animation.
void CalcViewModelView()
- Calculates the VM's bob (due to player movement), swing (due to player turning), and shake (due to env_shake etc) on the client only. This function calls
AddViewModelBob()
andCalcViewModelLag()
. int ViewModelIndex()
- Which of the owner's viewmodels this is.
void SendViewModelMatchingSequence(int)
- Just changes the animation. The fancy name is probably a holdover.
bool ShouldFlipViewModel()
- Whether the VM should be mirrored so that it appears on the other side of the screen.
bool ShouldReceiveProjectedTextures()
- Whether the VM should receive projected textures.
CBaseCombatWeapon
void SetViewModel()
- Updates the owner's VM to this weapon's.
void SetViewModelIndex(int)
- Which of the player's VM entities this weapon uses.
void SendViewModelAnim(int nSequence)
float GetViewModelSequenceDuration()
bool IsViewModelSequenceFinished()
- Pass-throughs for standard
CBaseAnimating
funcs.