CFrames

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

A CFrame , สั้นสำหรับ โค้ดเฟรมของแนวคิด คือไทป์ข้อมูลที่ใช้สำหรับการหมุนและตําแหน่ง 3D อ

บางตัวอย่างของ CFrame แอปในเกมอาจเป็น:

  • การค้นหาจุดเป้าหมายที่ไกลออกไปสำหรับโครงการที่เป็นเหยื่อโดยเลเซอร์ของผู้เล่น
  • ย้ายกล้องให้มุ่งเน้นไปที่ NPC ที่เฉพาะเจาะจงเมื่อผู้เล่นใช้งานกับพวกเขา
  • วางตัวชี้วัดสถานะโดยตรงเหนือหัวของผู้เล่นเพื่อแสดงว่าพวกเขาติดสถานะพิการ เพิ่มความเร็ว พิษ ฯลฯ

CFrame พื้นฐาน

การตำแหน่ง CFrame

คุณสามารถสร้าง CFrame ที่ว่างเปล่าได้ที่ตำแหน่


local redBlock = workspace.RedBlock
-- สร้าง CFrame ใหม่
local newCFrame = CFrame.new(-2, 2, 4)
-- เขียน CFrame ปัจจุบันของ redBlock ด้วย CFrame ใหม่
redBlock.CFrame = newCFrame
ก่อน
หลังจากนี้

นอกจากนี้คุณยังสามารถให้ตำแหน่งใหม่ของ Vector3 ให้กับ CFrame.new() ผลการค้นหา:


local redBlock = workspace.RedBlock
-- สร้าง CFrame ใหม่
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- เขียน CFrame ปัจจุบันของ redBlock ด้วย CFrame ใหม่
redBlock.CFrame = newCFrame

หมุน CFrame

เพื่อสร้าง CFrame ที่หมุน ใช้ CFrame.Angles() ผู้สร้าง โดยให้มุมหมุนในองศา


local redBlock = workspace.RedBlock
-- สร้าง CFrame หมุนใหม่
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- เขียน CFrame ปัจจุบันของ redBlock ด้วย CFrame ใหม่
redBlock.CFrame = newCFrame
ก่อน
หลังจากนี้

หน้าต่อจุด

คุณสามารถใช้ CFrame.new() เพื่อชี้ผิวหน้าของ CFrame ไปยังจุดที่ตรงกันในโลก In the following example, redBlock ตำแหน่งชิ้นส่วน ที่ (0,


local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- สร้าง Vector3 สำหรับตำแหน่งเริ่มต้นและตำแหน่งเป้าหมาย
local startPosition = Vector3.new(0, 3, 0)
local targetPosition = blueCube.Position
-- วางบล็อกสีแดงที่ 'ตําแหน่งเริ่ม' และชี้ให้เห็นด้านหน้าของมันที่ 'ตําแหน่งเป้าหมาย'
redBlock.CFrame = CFrame.new(startPosition, targetPosition)
ก่อน
หลังจากนี้

การปิดการใช้งาน CFrame

เพื่อลดอัตราส่วนต่อรองของวัตถุโดยการเพิ่มหรือลบ Vector3 จากตำแหน่งปั


local redBlock = workspace.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
ก่อน
หลังจากนี้

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


local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
ก่อน
หลังจากนี้

การจัดเรียง Dynamic CFrame

ผู้สร้าง CFrame.new() และ CFrame.Angles() จะย้ายตำแหน่งหรือหมุนวัตถุในองศาที่ตรงในโลก แต่คุณบางครั้งก็ไม่สามารถพึ่งพาตำแหน่งและมุมหมุนของโลกที่ติดตั้งไว้ได้

  • วางสมบัติที่ลอยตรงหน้าผู้เล่นที่อาจอยู่ที่ไหนก็ได้ในโลก หน้าใดก็ได้
  • สร้างเจ้าเวทมนตร์ปรากฏขึ้นเหนือหัวของผู้เล่นโดยตรง

ในกรณีเหล่านี้ใช้วิธีการ CFrame แทนผู้สร้าง

ตําแหน่งสัมพันธ์

การเรียกใช้ CFrame:ToWorldSpace() ส่วนประกอบของวัตถุ CFrame ที่เคารพความเป็นเอกของตัวเอง เครื่องเทศ ใหม่ในการเรียกใช้ สิ่งนี้ทำให้เ

ในตัวอย่างต่อไปนี้, redBlock ส่วนลดพิเศษ 2 ช่อง เมื่อเป็นสัดเขตกับเครื่องมือสีน้ำเงิน (ลูกศรสีเขียวกำลังชี้ไปที่มัน) และ not เมื่อเป็นสัดเขตกับเครื่องมือสีตัวน้ำขึ


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 องศาต่อนาฬิกาทางยแ


local redBlock = workspace.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
ก่อน
หลังจากนี้

ต้องเผชิญกับพื้นผิวที่เฉพาะเป็น

คุณสามารถทำให้ด้านหน้าของวัตถุเป็นอีกวัตถุโดยการจัดหาจุด Vector3 เป็นประจำที่สองของ CFrame.new() คุณยังสามารถใช้กา

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

local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- สร้าง Vector3 สำหรับตำแหน่งเป้าหมาย
local targetPosition = blueCube.Position
-- ชี้ให้เห็นพื้นผิวหน้าของ redBlock ที่ 'targetPosition'
redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)
-- ตอนนี้พื้นผิวหน้าของ redBlock (วงกลมสีขาว) กำลังชี้ไปที่ blueCube
-- หมุน CFrame ของ redBlock ให้เป็นสัดส่วนกับตัวเองเพื่อให้พื้นผิวด้านบน (ไม่ใช่ด้านหน้า) ของมันชี้ไปที่เป้าหมาย
local rotatedCFrame = CFrame.Angles(math.rad(-90), 0, 0)
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
-- Now the redBlock's top surface (black circle) is pointing towards the blueCube (as seen in After below)
ก่อน
หลังจากนี้

การหาจุดระหว่างจุด

คุณสามารถใช้ การแปลงเชิงเส้น หรือ lerp เพื่อวาง Datatype.CFrame ระหว่างสองจุด ในตัวอย่า


local redBlock = workspace.RedBlock
local greenCube = workspace.GreenCube
local cyanCube = workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)
ก่อน
หลังจากนี้