Roblox - 旋转模型

use*_*700 1 roblox

我正在开发一个游戏,它允许放置和程序旋转一些建筑物。

我找到了以下我试图合并的旋转代码:

function TransformModel(objects, center, new, recurse)
    for _,object in pairs(objects) do
        if object:IsA("BasePart") then
            object.CFrame =     new:toWorldSpace(center:toObjectSpace(object.CFrame))
        end
        if recurse then
            TransformModel(object:GetChildren(), center, new, true)
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

在我的建筑放置脚本中调用如下:

local center = model:GetModelCFrame()
TransformModel( model:GetChildren(), center, center * CFrame.Angles(0,math.rad(45),0), true )
Run Code Online (Sandbox Code Playgroud)

所以代码工作,有点......模型确实有点旋转,但只有在它跳到空中并随意着陆之后才最终稳定在旋转位置,尽管在跳跃的物理效应之后它远非精确的45度旋转在空气中安顿下来。

我不太确定,但我怀疑有更好的方法来实现模型平滑旋转。任何帮助将不胜感激。

谢谢,安迪

Uri*_*rks 5

GetModelCFrame 是一种不推荐使用的方法。这是不是建议利用PrimaryPartGetPrimaryPartCFrameSetPrimaryPartCFrame。设置主要部分指定模型中的特定部分作为基础,您可以通过其 CFrame 移动。这种方法的好处在于,如果您使用这些方法转换模型的 PrimaryPart,模型中的所有其他部分也将转换以保持它们与 PrimaryPart 的偏移。

为了放置建筑物和道具,通常希望这部分是底部的平坦部分,代表建筑物的足迹。

例如,考虑以下模型:

带有主要部件的 ROBLOX 模型

在这种情况下,制作主要零件的最佳零件将是底部的零件。如果您的模型没有包含在几何体中的零件,那么您可以制作一个不可见且可碰撞的假零件作为基础。在下面的示例中,有一个树模型没有宽的基部,但我们要确保足迹足够大,不会与附近的其他对象重叠:

ROBLOX 模型,带有半透明的 PrimaryPart

在这种情况下,黄色部分应该在运行时完全透明。

因此,就按照您想要的方式实际定向模型的代码而言,您所要做的就是SetPrimaryPartCFrame使用新的 CFrame 进行调用。TransformModel 函数简单地变为:

local function TransformModel(model, newCFrame)
    model:SetPrimaryPartCFrame(newCFrame)
end 
Run Code Online (Sandbox Code Playgroud)

当你想调用这个函数说将模型旋转 45 度时:

local model = game.Workspace.Model
model.PrimaryPart = model.Base
local rotatedCFrame = model:GetPrimaryPartCFrame() * CFrame.Angles(0, math.rad(45), 0)

TransformModel(model, rotatedCFrame)
Run Code Online (Sandbox Code Playgroud)