CFrames

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

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 erstellen
local newCFrame = CFrame.new(-2, 2, 4)
-- Überschreiben Sie das aktuelle CFrame von redBlock mit einem neuen CFrame
redBlock.CFrame = newCFrame
Vorher
Nach

Alternativ kannst du eine neue Position von Vector3 an CFrame.new() liefern und dieselbe Ergebnis erzielen:


local redBlock = workspace.RedBlock
-- Neues CFrame erstellen
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Überschreiben Sie das aktuelle CFrame von redBlock mit einem neuen CFrame
redBlock.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 erstellen
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- Überschreiben Sie das aktuelle CFrame von redBlock mit einem neuen CFrame
redBlock.CFrame = newCFrame
Vorher
Nach

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.RedBlock
local blueCube = workspace.BlueCube
-- Erstellen Sie einen Vector3 für beide die Startposition und die ZielPosition
local 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)
Vorher
Nach

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.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
Vorher
Nach

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.RedBlock
local blueCube = workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
Vorher
Nach

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.RedBlock
local blueCube = workspace.BlueCube
local offsetCFrame = CFrame.new(0, 2, 0)
redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)
Vorher
Nach

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.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Vorher
Nach

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.

  1. Zeigen Sie die Vorderseite -Oberfläche, die mit dem weißen Kreis markiert ist, auf das Ziel.
  2. Drehen Sie die CFrame , um die oberste Oberfläche, die mit dem schwarzen Kreis markiert ist, auf die Zielperson zu zeigen.

local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- Erstellen Sie einen Vector3 für die Zielposition
local 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 zeigt
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)
Vorher
Nach

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.RedBlock
local greenCube = workspace.GreenCube
local cyanCube = workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)
Vorher
Nach