我正在开发一款游戏,它允许一些建筑物被放置并按程序旋转。
我找到了下面的循环代码,我正在尝试合并这些代码:
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度旋转。
我不太确定,但我怀疑有一种更好的方法来实现这一点,其中模型平滑地旋转。任何帮助都将不胜感激。
谢谢,安迪
发布于 2016-03-26 02:24:34
GetModelCFrame是一个不推荐使用的方法。建议使用PrimaryPart、GetPrimaryPartCFrame和SetPrimaryPartCFrame。设置主零件将指定模型中的特定零件作为可通过其CFrame四处移动的基础。这种方法的好处是,如果您使用这些方法转换模型的PrimaryPart,模型中的所有其他部分也将进行转换,以保持它们与PrimaryPart的偏移量。
在放置建筑物和支柱时,通常需要使此部分成为底部的平面部分,表示建筑物的迹线。
例如,考虑以下模型:

在这种情况下,制作主要部分的最佳部分将是底部的部分。如果你的模型中没有包含在几何体中的零件,那么你可以制作一个不可见的、不可见的、cancollide错误的零件作为基础。在下面的示例中,有一个树模型,它的基数不是很大,但我们希望确保它足够大,从而不会与附近的其他对象重叠:

在这种情况下,黄色部分应该在运行时完全透明。
因此,就以您想要的方式实际确定模型方向的代码而言,您所要做的就是使用新的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)发布于 2016-03-06 10:13:39
我相信我找到了一个适合我的问题的答案,尽管我不确定这是否是解决它的最好方法。我创建了一个额外的部分作为基础,这是确切的宽度和高度的模型,然后模型坐在新的基础部分的顶部,基础是锚定。这似乎已经解决了它--有没有更好的方法?
https://stackoverflow.com/questions/35820144
复制相似问题