cam.PushModelMatrix
Açıklama
Belirtilen matrisleri gösterim matrisi yığınına gönderir. cam. PopModelMatrix.
Kullanıldığında: PANEL:Paint, Eğer panelin sol üst pozisyonuna güvenmek istiyorsanız, kullanmalısınız VMatrix:Translate panelin ekrana göre (0, 0) konumuyla.
Eğer onunla kullanmaya çalışıyorsan... cam. Start3D2D, set multiply ...ya da trueÇünkü... cam. Start3D2D Kendi model matrisini itiyor.
Argümanlar
2. Boolean çoğaltmak = yanlış
Eğer ayarlanırsa, verilen matrisin şu anda aktif olan (cam. GetModelMatrixİtmeden önce.
Örnek
Basit function to çevirilmiş ve/veya ölçeklendirilmiş metin çiz.
local vector_one = Vector( 1, 1, 1 )
function draw.RotatedText( text, font, x, y, color, ang, scale )
render.PushFilterMag( TEXFILTER.ANISOTROPIC )
render.PushFilterMin( TEXFILTER.ANISOTROPIC )
local m = Matrix()
m:Translate( Vector( x, y, 0 ) )
m:Rotate( Angle( 0, ang, 0 ) )
m:Scale( vector_one * ( scale or 1 ) )
surface.SetFont( font )
local w, h = surface.GetTextSize( text )
m:Translate( Vector( -w / 2, -h / 2, 0 ) )
cam.PushModelMatrix( m, true )
draw.DrawText( text, font, 0, 0, color )
cam.PopModelMatrix()
render.PopFilterMag()
render.PopFilterMin()
end
hook.Add("HUDPaint", "2d rotation test", function()
local w, h = ScrW(), ScrH()
local ang = RealTime() * 50
local scale = ( math.sin( ang / 10 ) + 2 ) * 0.5
draw.RotatedText( "My fancy Rotating Text", "DermaLarge", w / 2, h / 2, color_white, ang, scale )
end)
Çıkış:
Örnek
Bir kutuyu dönerken, matris pozisyonunu panele göre tutar.
concommand.Add("test_matrix", function()
local menu = vgui.Create( "DFrame" )
menu:SetSize( 200, 200 )
menu:SetTitle("Matrix rotation example")
menu:SetPos( 200, 200 )
local panel = menu:Add( "DPanel" )
panel:SetSize( 100, 100 )
panel:Center()
local grin = Material("icon16/emoticon_evilgrin.png", "smooth noclamp")
local angle = 0
function panel:Paint(w, h)
draw.RoundedBox( 8, 0, 0, w, h, color_white )
- matrisimizi çizme zamanı.
local m = Matrix()
- matrisin ekranla ilişkisini korumak için, onun merkezini ekrana göre elde ediyoruz.
local x, y = self:LocalToScreen( w / 2, h / 2 )
local center = Vector( x, y, 0 )
m:Translate( center )
m:Rotate( Angle( 0, angle, 0 ) )
m:Translate( -center )
-- bir dahaki sefere çizimden sonra açıyı döndürün.
angle = angle + FrameTime() * 60
- Hırıltılılığı gidermek için bir filtre makinesine basın
render.PushFilterMag( TEXFILTER.ANISOTROPIC )
render.PushFilterMin( TEXFILTER.ANISOTROPIC )
cam.PushModelMatrix( m )
draw.RoundedBox( 8, 0, 0, w, h, color_black )
surface.SetDrawColor( 255, 255, 255, 255 )
surface.SetMaterial( grin )
surface.DrawTexturedRect( w/2-16, h/2-16, 32, 32 )
cam.PopModelMatrix()
render.PopFilterMag()
render.PopFilterMin()
end
end)
Çıkış: 

Örnek
local player'un baktığı yere bir ağ çizer, her çerçeveyi yeniden oluşturmadan.
local mat = Material( "models/shadertest/shader5" ) - Malzeme.
local mat2 = Material( "models/wireframe" ) -- Malzeme (bir tel çerçeve)
local segCount = 18
local radius = 100
-- Basit trigonometri kullanarak bir daire ağı için zirveleri oluşturun.
- Ayrıca örgülerin dokusu için UV koordinatlarını da hesaplıyoruz.
local center = { pos = Vector( 0, 0, 0 ), u = 0.5, v = 0.5 }
local verts = {}
for j = 1, segCount do
local angle1 = ( ( j - 1 ) / segCount ) * math.pi * -2
local angle2 = ( j / segCount ) * math.pi * -2
local v1 = {
pos = Vector( math.cos( angle1 ) * radius, math.sin( angle1 ) * radius, 0 ),
u = math.cos( angle1 ) * 0.5 + 0.5, v = math.sin( angle1 ) * 0.5 + 0.5
}
local v2 = {
pos = Vector( math.cos( angle2 ) * radius, math.sin( angle2 ) * radius, 0 ),
u = math.cos( angle2 ) * 0.5 + 0.5, v = math.sin( angle2 ) * 0.5 + 0.5
}
verts[#verts + 1] = center
verts[#verts + 1] = v1
verts[#verts + 1] = v2
end
local obj = Mesh() -- IMesh nesnesini oluştur
mesh.Begin( obj, MATERIAL_TRIANGLES, segCount ) -- Statik ağ yazmaya başlayın.
for i = 1, #verts do
mesh.Position( verts[i].pos ) -- Konumu ayarla.
mesh.TexCoord( 0, verts[i].u, verts[i].v ) -- doku UV koordinatlarını ayarlayın
mesh.AdvanceVertex() -- Zirveyi yazın.
end
mesh.End() -- IMesh'e yazmayı bitirin.
hook.Add( "PostDrawOpaqueRenderables", "MeshLibTest", function()
render.UpdateRefractTexture()
render.SetMaterial( mat )
local playerTrace = LocalPlayer():GetEyeTrace()
local m = Matrix()
m:Translate( playerTrace.HitPos + playerTrace.HitNormal * 10 )
m:Rotate( playerTrace.HitNormal:Angle() )
m:Rotate( Angle( 0, -90, -90 ) )
render.ResetModelLighting( 1, 1, 1 )
cam.PushModelMatrix( m )
obj:Draw() Çizgiyi çekin.
cam.PopModelMatrix()
end )
Çıkış: 

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