CFrames

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

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.RedBlock
local blueCube = Workspace.BlueCube
redBlock.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.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
ก่อน
หลัง

คุณสามารถใช้เทคนิคเดียวกันในการย้ายวัตถุจากตำแหน่งของวัตถุอื่น ในตัวอย่างถัดไป, Vector3 จะถูกบวกกับ CFrame ใหม่ที่สร้างขึ้นที่ตำแหน่งของบล็อกสีน้ำเงินแทนที่จะเป็นตำแหน่งของบล็อค


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
redBlock.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.RedBlock
local blueCube = Workspace.BlueCube
local 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.RedBlock
local rotatedCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
ก่อน
หลัง

ให้พื้นผิวเฉพาะหันไปที่จุดหนึ่ง

คุณสามารถทำให้ด้านหน้าของวัตถุหันไปที่วัตถุอื่นได้โดยการให้พอยต์ Vector3 เป็นพารามิเตอร์ที่สองของ CFrame.new() คุณยังสามารถใช้การหมุนแบบสัมพัทธ์เพื่อทำให้ด้านใดด้านหนึ่งของวัตถุชี้ไปที่พอยต์ Vector3 ตัวอย่างถัดไปจะดำเนินการตาม CFrame สองรอบติดต่อกัน:

  1. ชี้พื้นผิว ด้านหน้า, โดยทำเครื่องหมายด้วยวงกลมสีขาว, ที่เป้าหมาย
  2. หมุน CFrame เพื่อทำให้พื้นผิว ด้านบน, ที่ทำเครื่องหมายด้วยวงกลมสีดำ, ชี้ไปที่เป้าหมาย

local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local 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.RedBlock
local greenCube = Workspace.GreenCube
local cyanCube = Workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)
ก่อน
หลัง
©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ