this:
normal_vector = normal_vector + face.normal
will not work as expected, if you set normal_vector to reference the integer object 0, because the integer +() method will get called, and it is not likely that it would know how to handle an argument that references a Geom::Vector3d object.
Smarter to create either a unit vector object to start with, or a zero length vector:
normal_vector = Geom::Vector3d.new(0,0,0)
THEN, when you call the +() method using:
normal_vector = normal_vector + face.normal
the special vector addition API method will get called.
In other words your statement is evaluated as if it were written:
normal_vector.=( normal_vector.+( face.normal ) )
This is one of the important things about Ruby... = and + (etc,) are not really operators, they are instance method names.
π