cam.Start3D2D
Açıklama
3D alanda 2D içerik çizmek için model dönüşüm matrisini ayarlar ve yığına (cam.PushModelMatrix) iter.
Matris formülü:
local m = Matrix()
m:SetAngles( angles )
m:SetTranslation( pos )
m:SetScale( Vector( scale, -scale, 1 ) )
Bu, cam.End3D2D ile kapatılmalıdır. Aksi takdirde beklenmedik sorunlar ortaya çıkabilir.
Bloom efektiyle uğraşırken render.SetToneMappingScaleLinear kullanışlı olabilir.
Argümanlar
2 Angle angles
3D2D bağlamının açıları.
2D bağlamındaki +x, açının +x'ine (ileri yönü) karşılık gelir.
2D bağlamındaki +y, açının -y'sine (sağ yönü) karşılık gelir.
Eğer (dx, dy) istediğiniz (+x, +y) birim vektörleriyse, istediğiniz açı dx:AngleEx(dx:Cross(-dy)) olur.
3 number scale
Çizim bağlamının ölçeği.
Eğer ölçek 1 ise, 2D bağlamındaki 1 piksel 3D bağlamındaki 1 birime eşit olacaktır.
Örnek
Her oyuncunun üzerinde, yerel oyuncuya bakan, metin içeren yüzen bir dikdörtgen oluşturur.
surface.CreateFont( "PlayerTagFont", {
font = "Arial",
size = 72,
} )
hook.Add( "PostPlayerDraw", "player_name_tags", function(ply)
-- Oyuncu çok uzakta, uğraşmaya değmez
if ( ply:GetPos():Distance( EyePos() ) > 512 ) then return end
-- Oyuncu, birinci şahıs görünümündeki yerel oyuncu, uğraşmaya değmez
if ( ply == LocalPlayer() ) then return end
-- Oyuncunun pozisyonunu al ve başının üzerine taşı.
local pos = ply:GetPos() + ply:GetUp() * ( ply:OBBMaxs().z + 5 )
-- Hoş bir sallanma animasyonu uygula
pos = pos + Vector( 0, 0, math.cos( CurTime() / 2 ) )
-- Yerel oyuncu ile hedef oyuncu arasındaki açıyı al
local angle = ( pos - EyePos() ):GetNormalized():Angle()
-- Açının sadece Yaw bileşenini kullan
angle = Angle( 0, angle.y, 0 )
-- Açıya biraz animasyon uygula
angle.y = angle.y + math.sin( CurTime() ) * 10
-- Kameraya bakması için açıyı düzelt
-- Bu genellikle Up(), Right() ve Forward() eksenleri kullanılarak deneme yanılma yoluyla yapılır
angle:RotateAroundAxis( angle:Up(), -90 )
angle:RotateAroundAxis( angle:Forward(), 90 )
-- Ölçeğin küçük olduğuna dikkat edin, böylece metin daha net görünür
cam.Start3D2D( pos, angle, 0.05 )
-- Çizmek üzere olduğumuz metnin boyutunu al
surface.SetFont( "PlayerTagFont" )
local tW, tH = surface.GetTextSize( ply:Nick() )
-- Bu, metnin etrafındaki kutu için dolgu miktarını tanımlar
local padX = 20
local padY = 5
-- Bir dikdörtgen çiz. Bu, üst üste binmeyi önlemek için metni çizmeden önce yapılmalıdır
-- Negatif koordinatlarda çizime başladığımıza dikkat edin
-- Bu, 3d2d ekranının pozisyonumuz etrafında sol köşesinden değil, merkezinden dönmesini sağlamak içindir
surface.SetDrawColor( 0, 0, 0, 100 )
surface.DrawRect( -tW / 2 - padX, -padY, tW + padX * 2, tH + padY * 2 )
-- Biraz metin çiz
draw.SimpleText( ply:Nick(), "PlayerTagFont", -tW / 2, 0, color_white )
cam.End3D2D()
end )
Çıktı: 

Örnek
Bir prop'a bağlı bir 3D2D "ekranının" nasıl doğru bir şekilde döndürüleceği ve konumlandırılacağına dair bir örnek.
function ENT:Draw( flags )
self:DrawModel( flags )
local ang = self:GetAngles()
-- Ekranı modeliniz için doğru şekilde döndürmek üzere bu sayıları değiştirin
ang:RotateAroundAxis( self:GetUp(), 90 )
ang:RotateAroundAxis( self:GetRight(), -90 + 4.5 )
ang:RotateAroundAxis( self:GetForward(), 0 )
local pos = self:GetPos()
-- Ekranı modeliniz üzerinde konumlandırmak için bu sayıları değiştirin
pos = pos + self:GetForward() * 11.7
pos = pos + self:GetRight() * 9.69
pos = pos + self:GetUp() * 11.8
-- Değer ne kadar yüksek olursa, çözünürlük o kadar iyi olur
local resolution = 1.1
cam.Start3D2D( pos, ang, 0.05 / resolution )
-- Arka planı boya. Etkili bir şekilde 388x320 piksellik bir ekran
surface.SetDrawColor( 0, 0, 0, 255 )
surface.DrawRect( 0, 0, 388 * resolution, 320 * resolution )
-- İçeriği boya
draw.SimpleText( "Loading GMod BIOS v0.9.....", "Default", 5, 5, color_white )
draw.SimpleText( "Fancy text..", "Default", 5, 16, color_white )
cam.End3D2D()
end
Çıktı: 

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord