わかりにくいかもしれないけど15度単位の角度に補正されています。

解説も面倒なので答えをぽん
ざっくり、下のコードを使えばいけるぜ!!
CorrectRotation.lua
---角度を15度単位で補正する。第2引数を1から90で指定すればその角度単位で補正する。第2引数は省略可。
---@param subItem ExportTransform
---@param degree number
local function CorrectRotation(subItem,degree)
--degreeが数値で0<degree<=90ならdegreeの値を使う。そうでないなら15を使う。
local localDegree = (type(degree) == "number" and 0 < degree and degree <= 90 ) and degree or 15
--subItemの回転量をx,y,zのeuler角度で取得する。
local subItemEuler = subItem.GetRotation().eulerAngles
--subItemのrotationに補正をかける
subItem.SetRotation(Quaternion.Euler(math.floor(subItemEuler.x / localDegree + 0.5)*localDegree,
math.floor(subItemEuler.y/ localDegree + 0.5)*localDegree,math.floor(subItemEuler.z/ localDegree + 0.5)*localDegree))
end
使用例だよ
local correctSubItemName = "Item"
local correctSubItem = vci.asset.GetSubItem(correctSubItemName)
---角度を15度単位で補正する。第2引数を1から90で指定すればその角度単位で補正する。第2引数は省略可。
---@param subItem ExportTransform
---@param degree number
local function CorrectRotation(subItem,degree)
--degreeが数値で0<degree<=90ならdegreeの値を使う。そうでないなら15を使う。
local localDegree = (type(degree) == "number" and 0 < degree and degree <= 90 ) and degree or 15
--subItemの回転量をx,y,zのeuler角度で取得する。
local subItemEuler = subItem.GetRotation().eulerAngles
--subItemのrotationに補正をかける
subItem.SetRotation(Quaternion.Euler(math.floor(subItemEuler.x / localDegree + 0.5)*localDegree,
math.floor(subItemEuler.y/ localDegree + 0.5)*localDegree,math.floor(subItemEuler.z/ localDegree + 0.5)*localDegree))
end
---[not SubItemの所有権&Grab状態]アイテムをUngrabしたときに呼ばれる。
---@param target string @UngrabされたSubItem名
function onUngrab(target)
if target == correctSubItemName then
CorrectRotation(correctSubItem)
end
end