Adding a Camera Bone to a Viewmodel: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
m (→‎top: clean up, added orphan, deadend tags)
No edit summary
Line 1: Line 1:
{{Multiple issues|
{{Multiple issues|
{{Dead end|date=January 2024}}
{{Orphan|date=January 2024}}
{{Orphan|date=January 2024}}
}}
}}


What are camera bones?
== What are camera bones? ==
 
Camera bones are bones that affect player's view, the in-game camera will copy rotation/transforms from your "camera" bone that you've created in your animation software, allowing animators to create good looking handmade camera effects for animations.
To put it simply camera bones are exactly what the name suggests, bone inside of your viewmodel that affect the camera, the in-game camera will copy rotation/transforms from your "camera" bone that you've created in your animation software, allowing animators to create good looking handmade camera effects for viewmodel animations such as reloads.
 
Adding it is extremely simple, we will start off by going to '''view.cpp:1208'''


== How to do ==
Adding it is extremely simple, go to '''view.cpp:1208'''
Inside of '''void CViewRender::Render( vrect_t *rect )''', scroll down to line 1408 where you should add the following code:
Inside of '''void CViewRender::Render( vrect_t *rect )''', scroll down to line 1408 where you should add the following code:


<source lang=cpp>
<source lang=cpp>
        //--------------------------------
//--------------------------------
// Handle camera anims
// Handle camera anims
//--------------------------------
//--------------------------------
Line 24: Line 22:
if (attachment != -1)
if (attachment != -1)
{
{
int rootBone = pPlayer->GetViewModel(0)->LookupAttachment("camera_root");
int rootBone = pPlayer->GetViewModel(0)->LookupAttachment("camera_root");
Vector cameraOrigin = Vector(0, 0, 0);
Vector cameraOrigin = Vector(0, 0, 0);
Line 48: Line 44:
</source>
</source>


After you've added this code, go and add a new ConVar:
After you've added this code, go and add a new ConVar somewhere on top of that file (or anywhere else):


<source lang=cpp>
<source lang=cpp>
Line 56: Line 52:
With that you are done on the code side.
With that you are done on the code side.


On the asset side, inside of your animation software of choice you will need two bones in the viewmodel that you plan to support this feature. One bone needs to be named '''camera_root''', this bone should NOT move at all and should not be animated, next make a bone named '''camera''', this is the bone we want to animate, when you keyframe and animate it's rotation, it should be reflected in game provided you added the code above, if you want a preview of how the camera effects will look like in game, make the animation software's "Camera" object a child of the '''camera''' bone (make sure to read that twice, a lot of overlapping names).
== Modeling notes ==
 
On the modeling side, inside of your animation software of choice you will need '''two bones''' in the viewmodel that you plan to support this feature.  
* First bone needs to be named <code>camera_root</code>, this bone should NOT move at all and should not be animated,
* Second make a bone named '''camera''', this is the bone we want to animate, when you keyframe and animate it's rotation, it should be reflected in game provided you added the code above, if you want a preview of how the camera effects will look like in game, make the animation software's "Camera" object a child of the '''camera''' bone (make sure to read that twice, a lot of overlapping names).
 
Here is an [https://www.youtube.com/watch?v=WnW0vXmUBp4 example] of what it looks like in action.
 
== See also ==


Here is an example of what it looks like in action: https://www.youtube.com/watch?v=WnW0vXmUBp4
* [[Viewmodel]]
* [[Model Creation Overview]]
* [[ConVar]]


[[Category:Tutorials]]
[[Category:Tutorials]]

Revision as of 06:00, 10 March 2024

Wikipedia - Letter.png
This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages)

What are camera bones?

Camera bones are bones that affect player's view, the in-game camera will copy rotation/transforms from your "camera" bone that you've created in your animation software, allowing animators to create good looking handmade camera effects for animations.

How to do

Adding it is extremely simple, go to view.cpp:1208 Inside of void CViewRender::Render( vrect_t *rect ), scroll down to line 1408 where you should 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();
				}
			}
		}

After you've added this code, go and add a new ConVar somewhere on top of that file (or anywhere else):

ConVar cl_camera_anim_intensity("cl_camera_anim_intensity", "1.0", FCVAR_ARCHIVE, "Intensity of cambone animations");

With that you are done on the code side.

Modeling notes

On the modeling side, inside of your animation software of choice you will need two bones in the viewmodel that you plan to support this feature.

  • First bone needs to be named camera_root, this bone should NOT move at all and should not be animated,
  • Second make a bone named camera, this is the bone we want to animate, when you keyframe and animate it's rotation, it should be reflected in game provided you added the code above, if you want a preview of how the camera effects will look like in game, make the animation software's "Camera" object a child of the camera bone (make sure to read that twice, a lot of overlapping names).

Here is an example of what it looks like in action.

See also