Improved CFrame support in Studio

Hi Developers!

We are happy to announce that Studio now has improved support for authoring, visualizing, and editing CFrames.

There’s is quite a lot that went into this update, so let’s jump right in:

What’s new?

  • CFrames are now exposed to the Properties window, where you’ll be able to visualize and edit them directly.


  • Attributes of type CFrame can now be added on any instance.

  • The value stored in CFrameValue instances can now be viewed.

  • We’ve refreshed the GUI for all Instance types that were previously displaying information related to CFrames as separate Position and Orientation properties.

Scripting and compatibility

  • We’re not removing any property or changing Lua API, so nothing will change under the hood. You will still be able to do both basepart.CFrame.Position and basepart.Position.

Additional Information

  • Where you previously had two separate Vector3 properties “Position” and “Orientation” for different CFrames, you can now find them grouped under the same widget. You can edit those properties like before, or insert values in the new widget.

  • The new CFrame widget starts expanded so you don’t need any additional click, but can be collapsed if you wish and it will still show all the relevant information.

  • Several types that previously didn’t have a way to modify CFrame properties except via Lua, like Camera or Motor6D, now have that ability exposed in the properties panel.

  • The following Instance types have their Properties panel updated for better consistency and usability: Accessory/Actor/Attachment/Bone/Camera/Model/Part/Tool.

We hope you find this update useful and as always, we welcome your feedback.

Thank you!

EDIT 11/04/2022:

All bugs reported as of November 4th have been fixed and will be available soon in one of the next updates. Namely:

  • searching for “Position” or “Orientation” also shows the respective CFrame property
  • selecting multiple instances and editing just some of the values update only those values and keeps everything else as-is
  • selecting multiple instances correctly shows fields where values differ as “empty”

Thank you for your feedback!


This topic was automatically opened after 10 minutes.

This is too convenient, you guys are gonna have to massively inconvenience us to make up for it soon or else we’ll be spoiled.

I suggest you really mess up BrickColor support for no reason at all, just to keep us in line.


Does this include support for motor.C0 and motor.C1?


Screenshot 2022-10-31 183839_motor


This new update at the Properties tab is quite interesting, but one thing that while analyzing the description makes me think a lot as from what I have understood:

I feel now a bit more confused with putting CFrame above Origin together… It sounds like you are trying to use CFrame as a fake position and/or orientation while the Origin is the true one… I believe the main context I can get of is once modifying its values within a new Vector3 upon scripts.


That’s cool, what about attributes with “Instance” datatype though? I think that a lot of people will agree with me that this addition is very important


Finally, no more hacky serializations needed for CFrame attributes! Now all that’s left are instance value attributes and ValueBases will essentially be obsolete.


Oh my, this is actually great! Thank you so much.


Awesome change! Really glad you can finally see the C0 and C1 properties on joints now.

Also, if you are extending attributes to support more datatypes, why not throw in Instance/Object as an attribute type as well? :eyes:

Also also, is there any reason why the full CFrame does NOT show in properties when its expanded?


I’m not sure I understand the question. The data is the same as before. Previously you had for Models Position + Orientation, as well as Origin Position + Origin Orientation. Now the same data is exposed in the same order, but the first Position+Orientation are grouped under the name “CFrame”, which is the name of the Property, and the latter two under “Origin”. The two are indeed related as you mention and the data shown is the same whenever CFrame and Origin match.


@DudusJestem @Khrrxs yes, that is something we might look into exposing in the future. Thanks for the feedback!


The reason we don’t show the full CFrame when expanded is to avoid clutter, as you would see the same data twice otherwise. The CFrame widget starts out expanded (unlike UDim2) so devs don’t need to input data using curly brackets or click on it to only input position.


Long overdue.

Can we also get the ability to modify the rotation matrix using the Look, Up and Right vectors


Quoting tnavarts (though not exactly)

The reason Instance is not implemented is because the default value of Instance is well, nil. This creates a ton of implementation details that need to be worked through and they only really have one shot at it.

This is unlike ObjectValues where the value index key still “technically” exists even if it’s nil.


I…I have no words. The day has finally come. What a masterpiece of an update this is.


Unsure if it’s a bug or intended behaviour, but having selected multiple parts I’m unable to change their position only in one axis - they all move to the same position once I try doing that. It’s extremely annoying when trying to line parts up in a certain axis.

Additionally, I’d appreciate if you made these sub-properties searchable in the search bar.


I believe this trurly is the peak of mankind.


Believe I got it now, so it just grouped the values of Position+Orientation upon CFrame.


This is such a quality of life improvement.
I like that position and orientations are now just grouped under one property rather than having the properties menu bloated with all that stuff.

I’ve been waiting for something small and simple like this.
It’s nice finally being able to just edit CFrames in the menu.
Now we also no longer need to script to edit the CFrames of welds.