Ein CFrame , kurz für Koordinaten-Rahmen , ist ein Datentyp, der verwendet wird, um 3D-Objekte zu drehen und zu positionieren. Als Objekt-Eigenschaft oder Standalone-Unit enthält ein CFrame globale x-, y- und z
Einige Beispiele für CFrame Anwendungen in einem Spiel könnten sein:
- Denken Sie an einen entfernten Zielpunkt für ein Projektil, wie die Position eines Feindes, der von einem Spieler:inmit einem Laserblaster anvisiert wird.
- Bewegen der Kamera, damit sie sich auf bestimmte NPCs konzentriert, wenn ein Spieler mit ihnen interagiert.
- Platzieren Sie einen Status-Indikator direkt über dem Kopf eines Spieler:in, um zu zeigen, ob sie paralyzed, boosted, poisoned usw.
CFrame Grundlagen
Einen CFrame positionieren
Du kannst ein leeres CFrame an der Standardposition (0, 0, 0) durch die Verwendung von Datatype.CFrame.new()</
local redBlock = workspace.RedBlock-- Neues CFrame erstellenlocal newCFrame = CFrame.new(-2, 2, 4)-- Überschreiben Sie das aktuelle CFrame von redBlock mit einem neuen CFrameredBlock.CFrame = newCFrame
Alternativ kannst du eine neue Position von Vector3 an CFrame.new() liefern und dieselbe Ergebnis erzielen:
local redBlock = workspace.RedBlock-- Neues CFrame erstellenlocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Überschreiben Sie das aktuelle CFrame von redBlock mit einem neuen CFrameredBlock.CFrame = newCFrame
Drehen eines CFrame
Um einen gedrehten CFrame zu erstellen, verwenden Sie den CFrame.Angles() -Builder, der einen Rotationswinkel in Radian für die gewünschten Achsen bereitstellt. Die Argumente für Datatype.
local redBlock = workspace.RedBlock-- Neues gedrehtes CFrame erstellenlocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- Überschreiben Sie das aktuelle CFrame von redBlock mit einem neuen CFrameredBlock.CFrame = newCFrame
Gesichts Richtung eines Punktes
Sie können CFrame.new() verwenden, um die Vorderseite eines CFrame an einen bestimmten Punkt in der Welt zu zeigen. Im folgenden Beispiel, redBlock TeilePositionen an (0, 3, 0) und zeigen seine Vorderseite, die mit dem weißen Kreis markiert ist, an der 1> blueCube
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- Erstellen Sie einen Vector3 für beide die Startposition und die ZielPositionlocal startPosition = Vector3.new(0, 3, 0)local targetPosition = blueCube.Position-- Setzen Sie den redBlock an 'startPosition' und zeigen Sie seine Vorderseite an 'targetPosition'redBlock.CFrame = CFrame.new(startPosition, targetPosition)
CFrame deaktivieren
Um ein Objekt um eine bestimmte Anzahl von Studs von seiner aktuellen Position abzugleichen, füge oder ziehe ein Vector3 von oder an einem neuen CFrame an der Position
local redBlock = workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
Du kannst die gleiche Technik verwenden, um ein Objekt von der Position eines anderen Objekts zu kompensieren. Im folgenden Beispiel fügt ein Vector3 zu einem neuen CFrame hinzu, der an der blauen Kubus-Position statt an der Blöckeerstellt wurde.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
Dynamische CFrame-Steuerung
Die CFrame.new() und CFrame.Angles() Baumeister positionieren oder drehen ein Objekt in einer bestimmten Ausrichtung innerhalb der Welt, aber Sie können manchmal nicht auf eine feste Weltposition und einen Rotationswinkel verlassen. Zum Beispiel:
- Direkt vor einem Spieler, der vielleicht überall in der Welt steht, mit einer Richtung.
- Bringen Sie einen magischen Genie direkt über dem rechten Schulter eines Spieler:inzu erscheinen.
In diesen Fällen verwenden Sie CFrame Methoden, anstatt Ihrer Konstrukteure.
relative Position
Die Datatype.CFrame:ToWorldSpace() -Funktion transformiert ein Objekts Datatype.CFrame — respektiert seine eigene lokale Ausrichtung — in eine neue Welt-Ausrichtung. Dies macht es ideal für die Offsetierung eines Teils in Bezug auf sich selbst oder ein anderes Objekt, unabhängig davon, wie es derzeit positioniert/gedreht ist.
Im folgenden Beispiel sind die redBlock Teilverschiebungen 2 Studs relativ gegen die Y-Achse des blauen Kubus (der grüne Pfeil durch ihn zeigt) und nicht relativ gegen die globale Y-Achse, die gerade nach oben zeigt.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)
relative Rotation
Sie können auch CFrame:ToWorldSpace() verwenden, um ein Objekt in Bezug auf sich selbst zu drehen. Im folgenden Beispiel dreht sich die redBlock Teil gegen den Uhrzeigersinn auf seiner Y-Achse und 20 Grad gegen den Uhrzeigersinn auf seiner Z-Achse.
local redBlock = workspace.RedBlocklocal rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Befassen Sie sich mit einer bestimmten Oberfläche in Richtung eines Punkts
Du kannst die Vorderseite eines Objekts durch eine Lieferung von einem Vector3 -Punkt als zweiten Parameter von Datatype.CFrame.new() verwenden. Du kannst auch relative Rotation verwenden, um jeden Gesichtspunkt des Objekts zu einem Datatype. Vector3 -Punkt zu drehen. Das folgende Beispiel führt zwei aufeinanderfolgende 2>Datatype.
- Zeigen Sie die Vorderseite -Oberfläche, die mit dem weißen Kreis markiert ist, auf das Ziel.
- Drehen Sie die CFrame , um die oberste Oberfläche, die mit dem schwarzen Kreis markiert ist, auf die Zielperson zu zeigen.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- Erstellen Sie einen Vector3 für die Zielpositionlocal targetPosition = blueCube.Position-- Zeigen Sie die Vorderseite des redBlocks auf 'targetPosition'redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)-- Die Vorderseite des redBlocks (weißer Kreis) zeigt auf den blauen Cube-- Drehen Sie den CFrame von redBlock so, dass seine oberste Oberfläche (nicht die Vorderseite) auf das Ziel zeigtlocal 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)
Einen Punkt zwischen Punkten finden
Du kannst lineare Interpolation oder lerp verwenden, um einen CFrame zwischen zwei Punkten zu platzieren. Im folgenden Beispiel platziert sich die 1> redBlock1> -Teil zwischen dem 4> greenCube
local redBlock = workspace.RedBlocklocal greenCube = workspace.GreenCubelocal cyanCube = workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)