2016-03-05 172 views
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 

這在我的建築佈局腳本如下調用:

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

所以代碼的工作,有點..雖然它在空中跳躍並沉澱下來的物理效應之後距離45度旋轉很遠,但是它只是在旋轉到空中並隨意着陸之後才最終落在旋轉的位置上。

我不太確定,但我懷疑有一種更好的方式可以在模型順利旋轉的情況下完成此操作。任何幫助將不勝感激。

感謝, 安迪

回答

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) 
+0

這並不提供答案的問題。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/11774220) –

+0

我已經更新了我的答案,所以希望更清楚和有用的東西。 – UristMcSparks

+0

請注意,如果您試圖旋轉其中具有「人形」的模型,則需要將模型的「PrimaryPart」設置爲「HumandoidRootPart」;模型的其他物理部分將不起作用。 – fastmultiplication