Adding a Camera Bone to a Viewmodel

From Valve Developer Community
Jump to: navigation, search

a camera bone is a bone inside of your ViewModel which can be animated to control the movement of the camera with animations. You can have cool results like a camera shake when reloading.

adding it is super easy all you will need to do is go inside of view.cpp

and right underneath this section of code inside of the void CViewRender::Render( vrect_t *rect ) function

        int flags = 0;
		if( eEye == STEREO_EYE_MONO || eEye == STEREO_EYE_LEFT || ( g_ClientVirtualReality.ShouldRenderHUDInWorld() ) )
	    if ( drawViewModel )
		if( eEye == STEREO_EYE_RIGHT )
			// we should use the monitor view from the left eye for both eyes

add the following code

		// Handle camera anims

		if (!UseVR() && pPlayer && cl_camera_anim_intensity.GetFloat() > 0)
			if (pPlayer->GetViewModel(0))
				int attachment = pPlayer->GetViewModel(0)->LookupAttachment("camera");
				if (attachment != -1)

					int rootBone = pPlayer->GetViewModel(0)->LookupAttachment("camera_root");
					Vector cameraOrigin = Vector(0, 0, 0);
					QAngle cameraAngles = QAngle(0, 0, 0);
					Vector rootOrigin = Vector(0, 0, 0);
					QAngle rootAngles = QAngle(0, 0, 0);

					pPlayer->GetViewModel(0)->GetAttachmentLocal(attachment, cameraOrigin, cameraAngles);
					if (rootBone != -1)
						pPlayer->GetViewModel(0)->GetAttachmentLocal(rootBone, rootOrigin, rootAngles);
						cameraOrigin -= rootOrigin;
						cameraAngles -= rootAngles;

						DevMsg("camera attachment found\n");
					view.angles += cameraAngles * cl_camera_anim_intensity.GetFloat();
					view.origin += cameraOrigin * cl_camera_anim_intensity.GetFloat();

next to fix the cl_camera_anim_intensity go to ConVar zoom_sensitivity_ratio inside of view.cpp

and add the following below it

ConVar cl_camera_anim_intensity("cl_camera_anim_intensity", "1.0", FCVAR_ARCHIVE, "intensity of the cammera animation");

and you are done!

please remember that you need to have 2 camera bones inside of your ViewModel one is stationary the other is the one you will animate the one that's stationary you will need to make an attachment inside of the ViewModel called "camera_root" and attach it to the stationary bone.

the other that you are going to animate should have an attachment called "camera".

remember that the bones should be at the center of the ViewModel where the player is supposed to see the ViewModel with his camera

here is an example of what it looks like in action:

have fun!