I have a simple scene. One object is only a single vert and another object is an empty. The single vert is just used as place holder, it could be any object with geometry/mesh. A geometry node modifier is applied to it and it is generating some procedural geometry with the cone node, set position node and noise node (it could be generating any other procedural geonodes geometry). Inside the geometry node editor I use an object info node to get location, rotation, scale and geometry data from the empty object. The empty object has an animation on its z axis that goes from 0 to 360 degrees. I add a view node to the node tree and plug the rotation output from the object info node into the viewer node's value input. I also plug the object info node's geometry output into the viewer node's geometry input. I expect to see rotation values in the spreadsheet editor but I don't. If I click the eye icon on the viewer node all of the procedural geometry disappears from the viewport and the spreadsheet shows no values for the viewer node in the spreadsheet editor. How is the viewer node supposed to be used when you want to read out data that is changing over time? I have supplied it with geometry data and some value data yet it doesn't return information anywhere in the user interface. If I supply the object info node with a simple mesh, like a plane (instead of the empty), with the same 360 degree animation, then the viewer node supplies the spreadsheet editor with the position data for each vertex but no rotation values of that object. Also the plane's vertex position data aren't changing over time even though the plane is rotating 360 degrees on its z axis. I have used the "Value to String node and then String to Curves node pair technique" to read the rotation value in the viewport but this seems like an unnecessary work around. With this work around I can view the z axis rotation data changing in real time. When the z rotation goes from 0 to ~180 degrees it reads out as incrementing from 0 to 1. Then from ~180 to 360 degrees it jumps to -1 and decrements to -0 until, at the final animation frame, it jumps back to +0. This rotation data from the object info node is a vector. How can these 0 to 1 and then -1 to -0 be understood?
1 Answer
Why are the vertex position values of my Plane object not changing even though it's rotating?
My guess is that your Object Info
node is in the Original mode, which only takes into account the tranform changes made in the Geometry Nodes setup itself. If you switch to Relative mode, you should start seeing the object-level transform information:
Why doesn't an Empty display any values on the Spreadsheet?
When you plug in a geometry into a Viewer
's green Geometry socket, it will display the attributes that are currently stored on that geometry. However, an Empty does not have any geometry—hence the name—so Geometry Nodes doesn't have anything to store values on. Look at the domains listed on the left side of your Spreadsheet: Vertex, Edge, Face Corner, Control Point, Spline, Point, Volume, Instances... There is no "Empty". However, you might notice that the Object Info
node has a switch at the bottom that turns the selected object into an instance. When you turn that on, and select the Instances domain on the left, you should now be able to read its values:
Except not. The Empty is recognized as an Instance (it says $1$), but there's still no "Viewer" column. Why not?
Why does the Spreadsheet not have any Viewer column?
The culprit is the default dropdown option on the Viewer
: Auto. When you link something to the Viewer, Auto mode is supposed to choose the relevant domain to display the attributes it finds on the linked geometry—unfortunately, it's not very good at it. By default, it falls back to the Point domain, so when your geometry is not a mesh and your domain selection is at its default place at the top (Vertex), you need to switch it to the appropriate mode manually:
A side note: Geometry Nodes needs geometry to write attributes on so it can display them in the Spreadsheet, but it doesn't actually care which geometry is used. You don't have to use the same geometry you're displaying the values from. Here's an example where I'm displaying the Rotation values from the Empty, storing them on a mesh (a Plane), in the Point domain. Notice that the Empty is not even made into an Instance—we only needed that so we could write on it and since we're using another mesh to do that, we don't have to:
Alright then. We can see the rotation information of our Empty. It reads $2.865$. What is that supposed to mean?
Why is the rotation information shown in some random float value, instead of degrees?
Under the hood, when it comes to rotation values, Blender works with radians, not degrees. A $180^\circ$ rotation is equivalent to $3.141592...$, that is, $pi (\pi)$. To see this value in degrees, you could employ a Math
node in To Degrees mode and see that it reads a more familiar $54.712^\circ$
But wait, the rotation Z value of our Empty actually reads $164^\circ$ on the Transform panel. Google also tells me that $2.865$ radians is $164^\circ$. Why is that?
Why is my rotation displayed as much smaller than the actual value in the Spreadsheet?
As you've noted in your question, the rotation value is a vector—it is comprised of 3 values. However, unlike their dedicated purple Vector Math
cousins, the light-blue themed Math
nodes use singular float values. When you feed a float node with vector information, it tries to cram those three values into a single one, by taking the average. Our rotation values are: $(0, 0, 2.865)$. When you add them all up and divide by three, you get: $2.865\div 3=0.955$, which is indeed the radians value for $54.717^\circ$. That's cumbersome, but there's an easy(-ish) way to display the full rotation value without a calculator. Separate one of the three vector values from the others before feeding it to the Math
node:
Finally! Now you can see the rotation values of your Empty in the Spreadsheet in real time! Except, not...
Why does the Spreadsheet not update in real time?
For performance reasons, I presume. Values update only when the animation stops. What can you do then? I'd suggest... using the "Value to String node and then String to Curves node pair technique". You thought that was an unnecessary workaround—maybe after this wall of text, you'll look at it differently.