はじめに
モデルを回転させる短いサンプルコードと、設定について書きました。
🪅方法1.PivotTo()
一瞬でモデルを回転させるには、PivotTo() を使います。
Weld の必要はなく、アンカーしていてもしていなくても大丈夫です。
(例)
GetPivot() で モデルの現在の CFrame を取得します。
CFrame.Angles() で、角度(ラジアン)をもとに CFrame を作成します。
現在の CFrame に、回転の CFrame を掛けることで、現在の方向を基準に回転します。
-- ローカルX軸を中心に90度回転
local model = script.Parent
model:PivotTo(model:GetPivot() * CFrame.Angles(math.rad(90), 0, 0))
🔄回転の中心を PrimaryPart にする
モデルの PrimaryPart に設定したパーツは、モデルの回転の中心になります。

🔄回転の中心を モデルのピボットにする
PrimaryPart を設定しない場合は、モデルのピボットが回転の中心になります。
このピボットを編集して、回転の中心を調整します。
ピボット調整前:

実行すると手前に回転しました。

ピボットの調整
画面上部の「ピボット」を選択してピボットを変更できます。
X軸が縦になるように変更しました。

実行すると回転する向きが変わりました。

🪅方法2. TweenService
時間をかけて滑らかにモデルを回転させるには、TweenService を使います。
TweenService:Create() で、 PrimaryPart の CFrame を時間経過で目標の値(回転)まで変化する Tween を作成します。
Tween:Play() によって回転し始めます。
(例)
local TweenService = game:GetService("TweenService")
-- ローカルX軸を中心に、1秒間かけて90度回転
local model = script.Parent
local tweenInfo = TweenInfo.new(1) -- 1秒間かける
-- math.rad(90) は「90度」を「ラジアン」という単位に変換
local goal = {CFrame = model:GetPivot() * CFrame.Angles(math.rad(90), 0, 0)}
local tween = TweenService:Create(model.PrimaryPart, tweenInfo, goal)
tween:Play()
モデルの PrimaryPart を設定して、回転の中心にします。
Weld Constraint を PrimaryPart 以外に追加し、 各パーツと PrimaryPart の相対位置/向きを固定します。apple02 は Union(PrimaryPart)のほかにも、apple01 と Weld してもOKです。
💡ポイント:Weld(溶接)を忘れずに!
TweenService は指定したパーツ(PrimaryPart)の座標だけを動かします。他のパーツを一緒に動かすには、WeldConstraint で PrimaryPart と繋いでおく必要があります。
また、動かしたいパーツの CanCollide はそのままでも良いですが、Anchored は false にしておかないと、物理的に固定されて動けないので注意しましょう。
参考
公式リファレンス


