A CFrame, สั้นสำหรับ เฟรมพิกัด, เป็นชนิดข้อมูลที่ใช้เพื่อหมุนและวางตำแหน่งวัตถุ 3 มิติ ในฐานะที่เป็นคุณสมบัติของวัตถุหรือหน่วยอิสระ, CFrame ประกอบด้วยพิกัด X, Y, และ Z ทั่วไปรวมทั้งข้อมูลการหมุนสำหรับแต่ละแกน นอกจากนี้, CFrames ยังประกอบด้วยฟังก์ชันที่มีประโยชน์สำหรับทำงานกับวัตถุในพื้นที่ 3 มิติ
วางตำแหน่ง CFrame
คุณสามารถสร้าง CFrame ที่ว่างเปล่าที่ตำแหน่งเริ่มต้นของ (0, 0, 0) โดยใช้ CFrame.new() เพื่อวางตำแหน่ง CFrame ที่จุดเฉพาะ, ให้พิกัด X, Y, และ Z เป็นอาร์กิวเมนต์สำหรับ CFrame.new() ในตัวอย่างถัดไป, คุณสมบัติ CFrame ของชิ้นส่วน redBlock จะเปลี่ยนเป็น newCFrame, ทำการย้ายตำแหน่งไปที่ (-2, 2, 4).
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- สร้าง CFrame ใหม่local newCFrame = CFrame.new(-2, 2, 4)-- เขียนทับ CFrame ปัจจุบันของบล็อกสีแดงด้วย CFrame ใหม่redBlock.CFrame = newCFrame


หรือคุณสามารถให้ตำแหน่ง Vector3 ใหม่เป็นพารามิเตอร์สำหรับ CFrame.new() และได้ผลลัพธ์เดียวกัน:
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- สร้าง CFrame ใหม่local newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- เขียนทับ CFrame ปัจจุบันของบล็อกสีแดงด้วย CFrame ใหม่redBlock.CFrame = newCFrame
หมุน CFrame
ในการสร้าง CFrame ที่หมุนแล้ว, ใช้ตัวสร้าง CFrame.fromEulerAnglesXYZ() โดยให้มุมในการหมุนเป็นเรเดียนสำหรับแกนที่ต้องการ พารามิเตอร์สำหรับ CFrame.fromEulerAnglesXYZ() เป็นเรเดียน ไม่ใช่องศา; หากคุณต้องการองศา, ใช้ math.rad() เพื่อแปลงองศาเป็นเรเดียน ในตัวอย่างถัดไป, ชิ้นส่วน redBlock หมุน 45 องศาทวนเข็มนาฬิกาในแกน Y ของมัน
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- สร้าง CFrame ใหม่ที่หมุนlocal newCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(45), 0)-- เขียนทับ CFrame ปัจจุบันของบล็อกสีแดงด้วย CFrame ใหม่redBlock.CFrame = newCFrame


หัน CFrame ไปที่จุดหนึ่ง
คุณสามารถใช้ CFrame.lookAt() เพื่อชี้พื้นผิวด้านหน้าของ CFrame ไปที่จุดเฉพาะในโลก ตัวอย่างถัดไปวาง redBlock ที่ (0, 3, 0) และชี้พื้นผิวด้านหน้าซึ่งถูกทำเครื่องหมายโดยวงกลมสีขาวไปที่ชิ้นส่วน blueCube
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.Position = Vector3.new(0, 3, 0)-- ชี้พื้นผิวด้านหน้าของบล็อกสีแดงไปที่บล็อกสีน้ำเงินredBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)


เปลี่ยนตำแหน่ง CFrame
ในการย้ายวัตถุด้วยจำนวนสตั๊ดที่เฉพาะเจาะจงจากตำแหน่งปัจจุบัน, ให้บวกหรือลบ Vector3 จาก CFrame ใหม่ที่ตำแหน่งของวัตถุ เพื่อให้ได้ตำแหน่ง Vector3 ที่จัดรูปแบบอย่างถูกต้องของวัตถุที่จะใช้กับ CFrame.new() ดังที่เห็นที่นี่, คุณสมบัติ Position (redBlock.Position) ของมันเป็นทางลัดที่สะดวก
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)


คุณสามารถใช้เทคนิคเดียวกันในการย้ายวัตถุจากตำแหน่งของวัตถุอื่น ในตัวอย่างถัดไป, Vector3 จะถูกบวกกับ CFrame ใหม่ที่สร้างขึ้นที่ตำแหน่งของบล็อกสีน้ำเงินแทนที่จะเป็นตำแหน่งของบล็อค
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)


การตั้งค่า CFrame แบบไดนามิก
ตัวสร้าง CFrame.new() และ CFrame.fromEulerAnglesXYZ() จะย้ายหรือหมุนวัตถุที่ตำแหน่งเฉพาะภายในโลก, แต่บางครั้งคุณไม่สามารถเชื่อถือได้ในตำแหน่งและมุมการหมุนในโลกที่ตายตัว ตัวอย่างเช่น:
- การวางสมบัติที่ลอยอยู่ตรงหน้าผู้เล่นที่อาจยืนอยู่ที่ไหนสักแห่งในโลก, หันหน้าไปทางทิศทางใดก็ได้
- การทำให้ยักษ์วิเศษปรากฏอยู่เหนือไหล่ขวาของผู้เล่น
ในกรณีเหล่านี้, ให้ใช้เมธอดของ CFrame แทนที่จะใช้ตัวสร้างของมัน
ตำแหน่งสัมพัทธ์
ฟังก์ชัน CFrame:ToWorldSpace() จะเปลี่ยน CFrame ของวัตถุ — โดยเคารพการตั้งค่าในท้องถิ่น — ให้เป็นรูปแบบ โลก ใหม่ ซึ่งทำให้เหมาะสำหรับการเลื่อนชิ้นส่วนสัมพัทธ์ต่อตนเองหรือวัตถุอื่น โดยไม่คำนึงถึงตำแหน่ง/มุมที่กำลังอยู่ในขณะนี้
ในตัวอย่างถัดไป, ชิ้นส่วน redBlock จะถูกเลื่อน 2 สตั๊ดตามแกน Y ของบล็อกสีน้ำเงิน (ลูกศรสีเขียวที่ชี้ผ่านมัน) และ ไม่ ตามแกน Y ทั่วไปที่ชี้ตรงขึ้น
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)


การหมุนแบบสัมพัทธ์
คุณสามารถใช้ CFrame:ToWorldSpace() เพื่อหมุนวัตถุสัมพัทธ์ต่อตนเอง ในตัวอย่างถัดไป, ชิ้นส่วน redBlock จะหมุน 70 องศาทวนเข็มนาฬิกาในแกน Y และ 20 องศาหมุนตามเข็มนาฬิกาในแกน Z
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal rotatedCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)


ให้พื้นผิวเฉพาะหันไปที่จุดหนึ่ง
คุณสามารถทำให้ด้านหน้าของวัตถุหันไปที่วัตถุอื่นได้โดยการให้พอยต์ Vector3 เป็นพารามิเตอร์ที่สองของ CFrame.new() คุณยังสามารถใช้การหมุนแบบสัมพัทธ์เพื่อทำให้ด้านใดด้านหนึ่งของวัตถุชี้ไปที่พอยต์ Vector3 ตัวอย่างถัดไปจะดำเนินการตาม CFrame สองรอบติดต่อกัน:
- ชี้พื้นผิว ด้านหน้า, โดยทำเครื่องหมายด้วยวงกลมสีขาว, ที่เป้าหมาย
- หมุน CFrame เพื่อทำให้พื้นผิว ด้านบน, ที่ทำเครื่องหมายด้วยวงกลมสีดำ, ชี้ไปที่เป้าหมาย
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- ชี้พื้นผิวด้านหน้าของบล็อกสีแดงไปที่บล็อกสีน้ำเงินredBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)-- หมุน CFrame สัมพัทธ์ต่อตัวเองเพื่อให้พื้นผิวด้านบน (ไม่ใช่ด้านหน้า) ชี้ไปที่บล็อกสีน้ำเงินlocal rotatedCFrame = CFrame.fromEulerAnglesXYZ(math.rad(-90), 0, 0)redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)


ค้นหาจุดระหว่างจุด
คุณสามารถใช้ การเปรียบเทียบเชิงเส้น, หรือ lerp, เพื่อวางตำแหน่ง CFrame ระหว่างสองจุด ในตัวอย่างถัดไป, ชิ้นส่วน redBlock จะถูกเคลื่อนที่ระหว่างชิ้นส่วน greenCube และ cyanCube ค่า 0.7 จะทำให้มันอยู่ห่างจากบล็อกสีเขียว 70%
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal greenCube = Workspace.GreenCubelocal cyanCube = Workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

