# cam.Start3D2D

- **Ortam:** İstemci
- **İngilizce aslı:** https://wiki.facepunch.com/gmod/cam.Start3D2D
- **Çeviri tarihi:** 2025-09-08

```lua
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](https://gmod.tr/wiki/cam.PushModelMatrix)) iter.

Matris formülü:

```lua
local m = Matrix()
m:SetAngles( angles )
m:SetTranslation( pos )
m:SetScale( Vector( scale, -scale, 1 ) )
```

> **UYARI:** Bu, [cam.End3D2D](https://gmod.tr/wiki/cam.End3D2D) ile kapatılmalıdır. Aksi takdirde beklenmedik sorunlar ortaya çıkabilir.

Bloom efektiyle uğraşırken [render.SetToneMappingScaleLinear](https://gmod.tr/wiki/render.SetToneMappingScaleLinear) kullanışlı olabilir.

## Argümanlar

1. [Vector](https://gmod.tr/wiki/Vector) **pos**: 3D2D bağlamının başlangıç noktası, yani sol üst köşe, (0, 0).
2. [Angle](https://gmod.tr/wiki/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](https://gmod.tr/wiki/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.

```lua
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ı:** ![](https://gmod.tr/api/uploads/wiki/b3a49713b9f9873066cf.png)

### Ö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.

```lua
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ı:** ![](https://gmod.tr/api/uploads/wiki/7cd32cab102759a95ec0.png)

- [GMod Wiki ana sayfası](https://gmod.tr/wiki)

---

[Tüm sunucular](https://gmod.tr/) · [GmodTR Launcher](https://gmod.tr/launcher) · [Rehber](https://gmod.tr/rehber) · [GMod Wiki](https://gmod.tr/wiki) · [GmodTR nedir?](https://gmod.tr/hakkinda) · [Sunucu ekle](https://gmod.tr/sunucu-ekle) · [Discord](https://discord.gg/gmodtr)

Kaynak: https://gmod.tr/wiki/cam.Start3D2D
