cam.Start3D2D

  cam.Start3D2D( Vector pos, Angle angles, number scale )

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

1 Vector pos
3D2D bağlamının başlangıç noktası, yani sol üst köşe, (0, 0).
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