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.RedBlocklocal 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.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
คุณสามารถใช้เทคนิคเดียวกันเพื่อลดตำแหน่งของวัตถุจากตำแหน่งของวัตถุอื่น ในตัวอย่างต่อไปนี้ Vector3 เพิ่มไปยัง CFrame ใหม่ที่สร้างขึ้นที่ตำแหน่งลูกบ
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCuberedBlock.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.RedBlocklocal blueCube = workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)
การหมุนที่เกี่ยวข้อง
คุณยังสามารถใช้ CFrame:ToWorldSpace() เพื่อหมุนวัตถุให้เป็นรูปสี่เหลี่ยมมุมโดยสัดส่วนกับตัวเอง ในตัวอย่างต่อไปนี้ส่วน redBlock จะหมุน 70 องศาต่อนาฬิกาทางยแ
local redBlock = workspace.RedBlocklocal rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
ต้องเผชิญกับพื้นผิวที่เฉพาะเป็น
คุณสามารถทำให้ด้านหน้าของวัตถุเป็นอีกวัตถุโดยการจัดหาจุด Vector3 เป็นประจำที่สองของ CFrame.new() คุณยังสามารถใช้กา
- ชี้ผิวด้านหน้า ข้างหน้า ที่มีเครื่องหมายด้วยวงกลมสีขาวบนเป้าหมาย
- หมุน CFrame เพื่อให้พื้นผิวด้านบน เป็นสีดำ และชี้ไปที่เป้าหมาย
local redBlock = workspace.RedBlocklocal 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.RedBlocklocal greenCube = workspace.GreenCubelocal cyanCube = workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)