CFRahmen

*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 Koordinatenrahmen , ist ein Daten тип, der verwendet wird, um 3D-Objekte zu drehen und zu positionieren.Als Objekt-Eigenschaft oder als einzelne Einheit enthält ein CFrame globale x-, y- und z-Koordinaten sowie Rotationsdaten für jede Achse.Darüber hinaus enthalten CFrames hilfreiche Funktionen für die Arbeit mit Objekten im Platz.

Einige Beispiele für CFrame Anwendungen in einem Spiel könnten sein:

  • Einen weit entfernten Zielpunkt für ein Projektil finden, wie die Position eines Feindes, der von einem Laserblaster eines Spieler:inanvisiert wird.
  • Bewegen der Kamera, damit sie sich auf bestimmte NPCs konzentriert, wenn ein Spieler mit ihnen interagiert.
  • Platzierung eines Statusindikators direkt über dem Kopf eines Spieler:in, um anzuzeigen, ob sie gelähmt, gestärkt, vergiftet usw. sind

CFRam Grundlagen

Positioniere ein CFrame

Du kannst eine leere CFrame an der Standardposition von (0, 0, 0) erstellen, indem du CFrame.new() verwendest.Um einen CFrame an einem bestimmten Punkt zu positionieren, geben Sie x-, y- und z-Koordinaten als Argumente für CFrame.new() an.Im folgenden Beispiel ändert sich die Eigenschaft der redBlock -Teil CFrame auf newCFrame, wobei sie um (-2, 2, 4) neu positioniert wird.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Neues CFrame erstellen
local newCFrame = CFrame.new(-2, 2, 4)
-- Überschreiben des aktuellen CFrames von redBlock mit neuem CFrame
redBlock.CFrame = newCFrame

Vor
>

Nach
>

Alternativ kannst du eine neue Vector3 Position zu CFrame.new() bereitstellen und dasselbe Ergebnis erzielen:


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Neues CFrame erstellen
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Überschreiben des aktuellen CFrames von redBlock mit neuem CFrame
redBlock.CFrame = newCFrame

Drehe ein CFrame

Um eine gedrehte CFrame zu erstellen, verwende den CFrame.Angles() Konstruktor, der einen Rotationswinkel in Radgraden für die gewünschten Achsen bietet.Die Parameter für CFrame.Angles() sind in Radgraden, nicht in Grad.Wenn Sie Grad bevorzugen, verwenden Sie math.rad(), um Grad in Radiane umzuwandeln.Im folgenden Beispiel dreht sich der Teil redBlock um 45 Grad im Uhrzeigersinn auf seiner Y-Achse.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Neues gedrehtes CFrame erstellen
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- Überschreiben des aktuellen CFrames von redBlock mit neuem CFrame
redBlock.CFrame = newCFrame

Vor
>

Nach
>

Stell dich einem CFrame gegenüber einem Punkt

Du kannst CFrame.new() verwenden, um die Vorderseite einer CFrame an einen bestimmten Punkt der Welt zu richten.Im folgenden Beispiel zeigen redBlock Teilpositionen bei (0, 3, 0) und zeigen ihre Vorderseite, markiert durch den weißen Kreis, auf das blueCube Teil.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
-- Erstellen Sie einen Vector3 für die Startposition und die Zielposition
local startPosition = Vector3.new(0, 3, 0)
local targetPosition = blueCube.Position
-- Stelle den roten Block an 'startPosition' und zeige seine Vorderseite an 'targetPosition'
redBlock.CFrame = CFrame.new(startPosition, targetPosition)

Vor
>

Nach
>

Versetze ein CFrame

Um ein Objekt um eine bestimmte Anzahl von Stollen von seiner aktuellen Position auszugleichen, füge oder subtrahiere ein Vector3 zu oder von einem neuen CFrame an der Position des Objekts hinzu.Um eine ordnungsgemäß formatierte Vector3 Position eines Objekts zu erhalten, die mit CFrame.new() verwendet werden kann, wie hier zu sehen, ist seine Position Eigenschaft ( redBlock.Position ) ein bequemer Tastenkombination.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)

Vor
>

Nach
>

Du kannst die gleiche Technik verwenden, um ein Objekt von der Position eines anderen Objekts aus auszugleichen.Im folgenden Beispiel fügt ein Vector3 einem neuen CFrame hinzu, das an der Position des blauen Würfels erstellt wurde, anstatt an der Position des Blöcke.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)

Vor
>

Nach
>

Dynamische CFrame-Orientierung

Die CFrame.new()- und CFrame.Angles()-Konstruktoren positionieren oder drehen ein Objekt in einer bestimmten Ausrichtung innerhalb der Welt, aber du kannst manchmal nicht auf eine feste Weltposition und Rotationswinkel vertrauen.Zum Beispiel:

  • Platzieren eines schwebenden Schatzes direkt vor einem Spieler, der sich irgendwo auf der Welt befinden und in jede Richtung schauen kann.
  • Einen magischen Genie direkt über der rechten Schulter eines Spieler:inerscheinen lassen.

In diesen Fällen verwende CFrame Methoden statt ihrer Konstruktoren.

Relative Position

Die CFrame:ToWorldSpace()-Funktion transformiert die Orientierung eines Objekts CFrame - respektierend seine eigene lokale Orientierung - in eine neue Weltorientierung .Das macht es ideal, um ein Teil im Verhältnis zu sich selbst oder zu einem anderen Objekt auszugleichen, unabhängig davon, wie es derzeit positioniert/gedreht ist.

Im folgenden Beispiel verschiebt der Teil redBlock den Abstand von 2 Klötzen im Verhältnis zur y-Achse des blauen Würfels (der grüne Pfeil zeigt darauf) und nicht im Verhältnis zur globalen y-Achse, die gerade nach oben zeigt.


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)

Vor
>

Nach
>

Relative Drehung

Du kannst auch CFrame:ToWorldSpace() verwenden, um ein Objekt relativ zu sich selbst zu drehen.Im folgenden Beispiel dreht sich der Teil redBlock um 70 Grad im Uhrzeigersinn auf seiner Y-Achse und um 20 Grad im Uhrzeigersinn auf seiner Z-Achse.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)

Vor
>

Nach
>

Begegne einer bestimmten Oberfläche gegenüber einem Punkt

Du kannst die Vorderseite eines Objekts gegen ein anderes Objekt ausrichten, indem du einen Vector3 Punkt als zweiten Parameter von CFrame.new() lieferst.Du kannst auch eine relative Rotation verwenden, um jedes Gesicht des Objekts auf einen Vector3 Punkt zu lenken.Das folgende Beispiel führt zwei aufeinanderfolgende CFrame Operationen aus:

  1. Zeigen Sie die Vorderseite , markiert durch den weißen Kreis, auf das Ziel.
  2. Drehe das CFrame, um die oberste Oberfläche, die vom schwarzen Kreis markiert ist, auf das Ziel zu richten.

local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
-- Erstellen Sie ein Vector3 für die Zielposition
local targetPosition = blueCube.Position
-- Zeige die Vorderseite des roten Blocks auf 'Zielposition'
redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)
-- Jetzt zeigt die Vorderseite des roten Blocks (weißer Kreis) auf den blauen Kubus
-- Drehe den CFrame von redBlock relativ zu sich selbst, so dass seine obere Oberfläche (nicht vorne) 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)

Vor
>

Nach
>

Finde einen Punkt zwischen Punkten

Du kannst lineare Interpolation oder lerp verwenden, um eine CFrame.Im folgenden Beispiel wird der Teil redBlock zwischen den Teilen greenCube und cyanCube neu positioniert.Der Wert von 0.7 platziert es 70% der Entfernung vom grünen Würfel entfernt.


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)

Vor
>

Nach
>