Roblox - 旋转模型

时间:2016-03-05 21:31:08

标签: 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

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

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

所以代码工作,有点......模型确实有点旋转,但只有在它跳到空中并随意落地然后最终在旋转位置沉降之后,尽管它在物理学之后远离精确的45度旋转跳到空中然后安顿下来的效果。

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

谢谢, 安迪

2 个答案:

答案 0 :(得分:4)

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

对于放置建筑物和道具,通常希望该部分是底部的平坦部分,代表建筑物的占地面积。

例如,请考虑以下模型:

ROBLOX Model with a PrimaryPart

在这种情况下,制作主要部分的最佳部分将是底部的部分。如果你的模型没有在几何体中加入一个零件,那么你就可以制作一个看不见的和可以碰撞的假零件作为基础。在下面的示例中,有一个树模型不具有宽基数,但我们希望确保足迹足够大,以至于它不会与其他附近对象重叠:

ROBLOX Model with a translucent PrimaryPart

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

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

local function TransformModel(model, newCFrame)
    model:SetPrimaryPartCFrame(newCFrame)
end 

如果要调用此函数来说明将模型旋转45度:

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

TransformModel(model, rotatedCFrame)

答案 1 :(得分:0)

我相信我找到了一个适用于我的问题的答案,但我不确定这是否是解决问题的最佳方法。我创建了一个额外的部件作为基础,它是模型的精确宽度和高度,然后模型位于新基础部件的顶部,基座锚定。这似乎已经解决了 - 有更好的方法吗?