Professional Documents
Culture Documents
CHIP Workshop
Klasörü’nü
ayraçlar›yla
birlikte siparifl
CHIP WORKSHOP’da BU AY
edebilir ve
Web Programc›l›¤› kendi arflivinizi
3DHTML ile 3D oluflturabilirsiniz.
dünyas›na ilk ad›m
Boyutlu uygulamalar her zaman için ilgi çekici olmufllard›r. 1. Koordinat sistemi
3D Transformasyonlar›
Rotation: Rotasyon (herhangi bir eksen etraf›nda dönüfl)
Scaling: Ölçeklenme (herhangi bir eksen do¤rultusundaki boyutun
de¤iflmesi)
Translation: Yer de¤ifltirme (herhangi bir eksen do¤rultusunda pozis- A = [[1,0,0,0],[0,Math.cos(a),-Math.sin(a),0],[0,Math.sin(a), ➞
yon de¤ifltirme) Math.cos(a),0],[0,0,0,1]];
// X-ekseni etraf›nda rotasyonu temsil eden 4x4 matris
Matris nedir?
Matrisler belli bir formu ve kural- Matris çarp›m› için oluflturulmufl haz›r bir fonksiyon kodunu kul-
lar› olan tabela fleklinde iki boyut- lanmak programlardaki kodlar› çok daha sade ve anlafl›l›r hale getire-
lu dizilerdir. Sat›rlardan ve sütun- cektir.
lardan oluflurlar. 3D matemati-
¤inde 4x4 (4 sat›rl› ve 4 sütunlu) function matrixMultiply(A,B) {
matrislerden faydalan›l›r. var retVal = [0,0,0];
Matrisler (koordinatlar gibi) for(var i=0;i<4;i++) {
pozisyon ya da (transformasyon- retVal[i] = 0;
lar gibi) hareket bilgilerini içerebi- for(var j=0;j<4;j++)
lirler. Bir matris yüzlerce farkl› retVal[i] += A[j] * B[i][j]
transformasyonun bilgisini tafl›- }
yabilir. Hesaplamada transfor- return retVal;
masyonlar matrislerin çarp›m›yla elde edilir. ‹ki matrisin çarp›m› afla- }
¤›daki gibidir.
Bir deneme
Basit bir transformasyonla matrislerin nas›l kullan›ld›¤›n› görelim. ‹lk
fleklimizde görülen top (1,1,1) pozisyonunda bulunuyor.
Topumuzu x-ekseni etraf›nda 90 derece döndürelim. Bu durumda
ikinci fleklimize bakarak topun yeni koordinatlar›n›n (1,-1,1) oldu¤unu
Örne¤in basitli¤i için 4x4 yerine 2x2 matrislerin çarp›m›n› verdik. 4x4 söyleyebiliriz. Bunu matrisleri kullanarak hesaplayal›m ve gerçekten
için de kural ayn›d›r. Matris çarp›m›nda yer de¤ifltirme özelli¤i yoktur. do¤ru olup olmad›¤›n› test edelim.
A.B ile B.A matris çarp›mlar› birbirlerine eflit de¤ildir.
A.B =/= B.A
3. Projeksiyon
Projeksiyonun amac› 3D ortam›nda transformasyon sonras› elde edi-
len yeni de¤erleri 2D ortam› olan ekrana yans›tmakt›r. Ekran sahnede
viewport ad› verilen sanal yüzeyle temsil edilir. Belli koordinatlar›
olan ve istenirse de¤ifltirilebilen bu yüzeyi (vp) sinema perdesi gibi dü-
flünebilirsiniz. Kamera olarak adland›r›lan izleme noktas› ile 3 boyutlu
bofllukta bulunan her hangi bir cismin (A) aras›na bir çizgi çekilecek
Matrisleri program kodlar›na nas›l uyarlayabiliriz? olursa, bu çizginin perdeye temas etti¤i nokta (A’), cismin perde üze-
Programc›l›kta matrisler çok boyutlu dizelerle ifade edilebilirler rinde görünece¤i noktad›r. Bir baflka ifadeyle, bu nokta fleklin ekranda
// 3D birim tan›m›
function Nokta(x,y,z) {
this.x = x;
görünmesi gerekti¤i noktad›r. Düflünecek olursan›z cisim perdenin ar- this.y = y;
kas›nda sonsuza do¤ru uzaklaflt›¤›nda görünece¤i nokta da ekran›n this.z = z;
ortas›na do¤ru yaklafl›r. return this;
Bize düflen, cismi 2 boyutlu ekranda da 3 boyutluymufl gibi göste- }
rebilmek için perdedeki izdüflümünün (A’) koordinatlar›n› hesapla-
makt›r. Bu konuda afla¤›daki fleklimizde yard›mc› çizgilerle olufltura- // 3D vektör tan›m› A(x,y,z) -> B(x,y,z)
ca¤›m›z benzer üçgenler bize yard›mc› oluyor. function Vektor(a,b) {
‹ki benzer üçgenden faydalan›larak oluflturulan denklemde bilin- this.a = a;
meyen olarak A’.x’in yani A’ noktas›n›n x koordinat›n›n de¤eri flu fle- this.b = b;
kildedir. return this;
Dikkat ederseniz denklemde }
A’.x d›fl›ndaki tüm elemanlar (ki
bunlar perdenin, A noktas›n›n ve // Perde, 3D birimlerin üzerine projeksiyon yap›ld›¤› 2D yüzey
kamera’n›n koordinatlar›d›r) bili- var perde = new Vektor(new Nokta(-150,-150,100),new ➞
nen de¤erlere sahip. X ekseni için Nokta(150,150,100));
geçerli olan denklem Y ekseni için
de geçerlidir. A’.x için elde edilen // Kamera'n›n pozisyonu
de¤erlerde x yerine y koyarak A’.y var kamera = new Nokta(0,0,-150);
de elde edilebilir.
NOT: Dergimizin CD’sinde, // Birimleri ekranda pozisyonland›ran ve boyutland›ran fonksiyon
bu ayki StudioWeb+ bölü- function ekranaDiz(isim, poz) {
münde projeksiyon hesap-
lamas›n›n nas›l yap›ld›¤›n› obj = parent.document.getElementById(isim);
gösteren bir animasyon css = parent.document.getElementById(isim).style;
bulabilirsiniz.
Bu denklemleri kullana- f = perde.a.z - kamera.z; // Odak uzakl›¤›
rak oluflturulacak kodlar ci-
simlerin 3 boyutlu koordi- // Noktalar›n kameraya göre pozisyonlar›
natlar› ne olursa olsun ekranda do¤ru noktada konumland›racaklar- Nx = (poz.x-kamera.x) * f / (poz.z-kamera.z);
d›r. Bunlara ilaveten sahnede uzak olan cismin boyutunun küçülmesi Ny = (poz.y-kamera.y) * f / (poz.z-kamera.z);
ve yak›n olan cismin uzak olan›n üzerinde yer almas› gerekir.
// Noktalar›n perdeye göre pozisyonlar›
3 boyutlu küp Vx = parseInt(kamera.x + Nx - perde.a.x);
fiimdi bir örnekle bütün bu teorilerin pratikte nas›l uygulanabilece¤i- Vy = parseInt(kamera.y + Ny - perde.a.y);
ni görelim. Kulland›¤›m›z teknik, program dili olarak JavaScript’i, ko-
numland›rma içinse CSS’i kullan›yor. Oluflturaca¤›m›z flekil her bir kö- if(poz.z > kamera.z && Vx > 0 && Vy > perde.a.y && Vy < perde.b.y - ➞
flesinde ve bir tane de merkezinde olmak üzere toplam 9 adet nokta- perde.a.y && Vx < perde.b.x - perde.a.x) {
dan oluflan bir küp. css.visibility = "visible";
boyut = maxBoyut-poz.z/perspektif;
<html> if(boyut<1) boyut=1;
<head> css.width = boyut;
<title></title> css.height = boyut;
<meta http-equiv="Content-Type" content="text/html; charset= ➞ css.left = Vx - boyut/2;
windows-1254"> css.top = Vy - boyut/2;
<style type="text/css"> css.zIndex = (100 - poz.z) + 1000;
div {font-family:Verdana; font-size:11px; font-weight:bold; ➞ } else {
color:#ffa800; text-decoration: none;} css.visibility = "hidden";
a {font-family:Verdana; font-size:11px; font-weight:bold; ➞ //Perdenin üzerine düflmeyen ya da kameran›n arkas›nda kalan ➞
color:#ffa800; text-decoration: underline;} birimleri gösterme
a:hover {font-family:Verdana; font-size:11px; font-weight:bold; ➞ }
✂
} kamera.y += trans;
kamera.z += trans;
// Sahneyi oluflturan birimler ve pozisyonlar›
var noktalar = new Array(9); }
for(i=1; i<=9;i++)
noktalar[i] = { isim: "katmanNokta" + i, x: 0, y: 0, z: 0, a: 45 } // Bu birimleri ekrana diz
noktalar[1].x = 30; noktalar[1].y = -30; noktalar[1].z = -30; ekranaDiz(noktalar[i].isim, noktalar[i]);
noktalar[2].x = -30; noktalar[2].y = -30; noktalar[2].z = -30; }
noktalar[3].x = -30; noktalar[3].y = -30; noktalar[3].z = 30;
noktalar[4].x = 30; noktalar[4].y = -30; noktalar[4].z = 30; setTimeout(basla,30); // Sahneyi güncelle
noktalar[5].x = 30; noktalar[5].y = 30; noktalar[5].z = -30; }
noktalar[6].x = -30; noktalar[6].y = 30; noktalar[6].z = -30;
noktalar[7].x = -30; noktalar[7].y = 30; noktalar[7].z = 30; function derRad(x) { return ( x/(360/(2*Math.PI)) ); }
noktalar[8].x = 30; noktalar[8].y = 30; noktalar[8].z = 30;
noktalar[9].x = 0; noktalar[9].y = 0; noktalar[9].z = 0; // Matrix çarp›m fonksiyonu
function matrixCarp(A,B) {
var aci=5; // her ad›mdaki de¤iflim aç›s› var taban = [0,0,0];
var zoom = 0; for(var i=0;i<4;i++) {
var trans = 0; taban[i] = 0;
var rotX = false; var rotY = false; var rotZ = false; for(var j=0;j<4;j++)
taban[i] += A[j] * B[i][j]
function basla() { }
ofsetEksen=0; // Dönüfl ekseni için ofset return taban;
for(i=1;i<=9;i++) { }
// A = [ x,y,z,w ];
if(aci>360) aci-=360; // B = [ [ a,b,c,boyut ],
// [ e,f,g,h ],
mat = [noktalar[i].x,noktalar[i].y,noktalar[i].z-ofsetEksen,1]; // [ i,j,k,l ],
// her bir noktan›n koordinatlar›n› içeren matrixi (x y z w) // [ m,n,o,p ] ];
a = derRad(aci);
matRotX = [[1,0,0,0],[0,Math.cos(a),-Math.sin(a),0], ➞ function degis(x) {
[0,Math.sin(a),Math.cos(a),0],[0,0,0,1]]; if(x==0) rotX = !rotX;
// RotX matrixi, bununla çarp›nca x ekseni etraf›nda rotasyon olufluyor if(x==1) rotY = !rotY;
matRotY = [[Math.cos(a),0,Math.sin(a),0],[0,1,0,0], ➞ if(x==2) rotZ = !rotZ;
[-Math.sin(a),0,Math.cos(a),0],[0,0,0,1]]; }
// " Y
matRotZ = [[Math.cos(a),-Math.sin(a),0,0], ➞ </script>
[Math.sin(a),Math.cos(a),0,0],[0,0,1,0],[0,0,0,1]];
// " Z </head>
// Noktalar›n kameraya göre pozisyonlar› var aci=5; // her ad›mdaki de¤iflim aç›s›
Nx = (poz.x-kamera.x) * f / (poz.z-kamera.z); var zoom = 0; //bafllang›ç de¤eri 0. Zoom yok
Ny = (poz.y-kamera.y) * f / (poz.z-kamera.z); var trans = 0; //bafllang›ç de¤eri 0. Yer de¤ifltirme yok
// Noktalar›n perdeye göre pozisyonlar› Script’imiz çal›fl›r çal›flmaz en temel ifllemleri yerine getiren bir
Vx = parseInt(kamera.x + Nx - perde.a.x); fonksiyon hemen ça¤r›l›yor ve bu ça¤›rma ifllemi fonksiyonun her bir
Vy = parseInt(kamera.y + Ny - perde.a.y); 30 ms’de bir kendisini ça¤›rmas›yla devam ediyor. Sahnenin her 30
ms’de bir güncel tutulmas›n› sa¤layan fonksiyon basla().
Kamera sahneye çok yak›n oldu¤u zamanlarda baz› noktalar›n ko-
ordinatlar› kameran›n arkas›na düflebilir. Bu durumda bu noktalar› setTimeout(basla,30); // Sahneyi güncelle
ekranda görmememiz gerekir.
Bu bak›mdan ekrandaki birimler hareket etmeseler bile bilgisaya-
if(poz.z > kamera.z && Vx > 0 && Vy > perde.a.y && Vy < perde.b.y - ➞ r›n CPU’su sürekli bir hesaplama içinde olacakt›r. Birimlerin öntan›ml›
perde.a.y && Vx < perde.b.x - perde.a.x) { olarak, yani sayfa aç›l›r aç›lmaz hareket etmemeleri ise kodlar içinde
css.visibility = "visible"; bafllang›ç olarak öyle istedi¤imizden kaynaklan›yor.
...
} var rotX = false; var rotY = false; var rotZ = false;
else {
✂
Sub Form1Ac()
UserForm1.Show
End Sub
fiekil 5
Sub Form2Ac()
fiekil3
UserForm2.Show
End Sub 14. Ayn› menünün son k›sm›nda bulunan
Menü Çubu¤unda yeni bir menü olufl- Makro Ata… (Assign Macro…) komutuna
5. Görünüm (View) / Araç Çubuklar› turduk. fiimdi s›ra bu yeni menünün, yani t›klay›n.
(Toolbars) / Özellefltir (Customize) Cari Hesap menüsünün alt›ndaki komutlar› 15. Aç›lan Makro Ata penceresinden “Form-
komutunu t›klay›n. olufltural›m. Bunun için yukar›da modül içe- 1Ac” makrosunu seçin ve Tamam dü¤-
6. Aç›lan Özellefltir (Customize) risine yazd›¤›m›z makro komutlar›n› kulla- mesine t›klay›n.
penceresinden Komutlar (Commands) naca¤›z. Dikkat ederseniz “Form1Ac” yorda-
sayfa sekmesini seçin. m› UserForm1’i çal›flt›r›yor. “Form2Ac” yor-
7. Kategoriler (Categories) listesinden Yeni dam› ise UserForm2’yi çal›flt›r›yor. fiimdi biz
Menü (New menu) seçene¤ine t›klay›n. bu yordam bafll›klar›n› kullanaca¤›z. Ancak
8. Hemen sa¤ taraftaki Komutlar önce alt komutlar› olufltural›m.
(Commands) listesinde Yeni Menü 11. Özellefltir penceresindeki Komutlar say-
(New Menu) ad›nda bir seçenek fa sekmesinde bulunan Kategoriler liste-
belirecektir. sinden bu defa Makrolar (Macros) seçe-
9. Farenin sol tuflunu bas›l› tutarak bu yeni
fiekil 6
fiekil1
M. Temel Korkmaz
temelkorkmaz@excel.gen.tr
fiekil2 fiekil 4
PHOTOSHOP’UN TEMELLER‹
Çay pofleti
Önce 300x300’lük bir dosya aç›n ve yandaki flekil-
deki gibi 4 dikey ve 2 de yatay rehber çizgi olufltu-
run. Bu çizgileri cetvellere t›klay›p fareyi sürükleyerek
oluflturabilirsiniz. Daha sonra yeni bir katman(layer) ek-
leyin ve dikdörtgen seçim arac› ile orta bölümü seçip
tercih etti¤iniz aç›k bir renk ile orta bölümü doldurun.
fiimdi yeni bir katman daha oluflturun ve “kenar” diye
adland›r›n. Bu sefer de iki yanda kalan bölümleri seçip
beyaz ile doldurun.
PHOTOSHOP’UN TEMELLER‹
Matrix Efekti
Önce beyaz arka planl› 200x200 boyutlar›nda yeni
bir dosya oluflturun. Daha sonra siyah ve beyaz
renkler seçili iken Filter / Render / Clouds filtresi yard›-
m›yla yandakine benzer bir flekil oluflturun. Hemen ar-
d›ndan Filter / Texture / Grain filtresini Intensity=58,
Contrast=34 ve Vertical=3 de¤erleri ile uygulay›n.
[CTRL]+[U] tufllar›na bas›n ve aç›lacak olan pencerede
Hue de¤erini 103, Saturation’› 56, Lightness’› 0 olarak
seçin ve Colorize seçene¤ini de yes yap›n.
KISA KISA
» Photoshop Temelleri
Bir katman üzerinde yaratm›fl simgeye sa¤ tufl ile t›klay›n.
oldu¤unuz Layer Style, siz kat- Daha sonra da menünün en
man› yeniden boyutland›rd›- alt›nda yer alan Scale Ef-
¤›n›zda eski boyutunda kala- fects...’i seçin. Aç›lacak olan
cak ve her fley bofla gidecektir. pencerede daha önce nesneyi
E¤er bunun böyle olmas›n› is- boyutland›rd›¤›n›z de¤er ile
temiyorsan›z çok küçük bir ayn› de¤eri uygulay›n. Ok tu-
ayr›nt›ya dikkat etmeniz ge- fluna t›klad›¤›n›zda yaratm›fl
rekir. Düzeltmek için önce La- oldu¤unuz layer style’›n art›k
yers penceresine gidin ve ora- nesne ile uyum sa¤lad›¤›n›
daki “f” harfine benzeyen göreceksiniz.