OP, what is the purpose of this class? Even from the brief snippit you posted, it seems to perform different unrelated functions. On one hand, it exposes an interface to manipulate a transform matrix via its individual components (position, rotation, scale). Then it also handles the relationship between global and local transforms? Ok not terrible... But then it also handles the physics of moving the object. Then there is "m_IsAlive". If this represents whether "UpdateMatrix" is doing anything or not (so you can set the object to inactive and save some matrix operations), then fine. But if it has to do with some sort of gameplay state, that's very bad. Hopefully there's not graphics-related code in there too...
So you have 1 class handling maintaining transform matrices, performing rudimentary physics simulation, and probably some gameplay functions as well. That's 3 different classes right there.
EDIT: Then there is also the smelliness of those UpdateMatrix calls. I understand wanting to keep the underlying matrices in sync. Still, you're pumping your game loop every frame. You're probably already touching every (active) instance of this class every frame. IME it's better to have an update function called every frame, than to recompute those matrices multiple (who knows how many?) times per frame. Then you just make sure that that update function is called before the renderer needs the matrix. Or you don't, and you let the renderer be a frame behind the physics, not usually a big deal unless it's an FPS.
EDIT2: Here I'll take a stab: class PhysicsEntity {
D3DXVECTOR3 position;
D3DXVECTOR3 rotation;
D3DXVECTOR3 velocity;
D3DXVECTOR3 angularVelocity;
public:
void Update(const D3DXVECTOR3& position, const D3DXVECTOR3& rotation) {
// your UpdateMatrix stuff here
// also updating children and whatnot if it's a full scene graph
};
};
public:
void Update(float dt) {
if (isAlive) {
D3DXVECTOR3 v = // calculate velocity from angle and moveSpeed and whether a move command has been issued
sim.SetVelocity(v);
sim.Update(dt);
draw.Update(sim.GetPosition(), sim.GetRotation());
}
};
};