<img>
-
još uvijek ostaje najčešći oblik prikaza slikaotvaraju mogućnosti izrade naprednih grafičkih aplikacija bez potrebe dodatnih priključaka
<canvas>
oznaka u HTML dokument-> Sada imamo prazan „papir“ za crtanje
<canvas id="canvas" width="300" height="300"></canvas>
<canvas>
= fiksna površina za crtanje canvas
je inicijalno prazanvar canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d');
var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); ctx.fillStyle = "rgb(4,113,196)"; ctx.fillRect (10, 10, 55, 50); ctx.fillStyle = "rgba(196, 4, 4, 0.5)"; ctx.fillRect (30, 30, 55, 50);
fillRect(x,y,width,height)
: crta ispunjeni
strokeRect(x,y,width,height)
: crta obrub
clearRect(x,y,width,height)
: obriše područje
omogućuje crtanje kompleksnijih oblika
beginPath()
: započinje novu stazu lineTo(x, y)
: crta ravnu linijumoveTo(x, y)
: pomiče početnu točku stazearc(x, y, radius, startAngle, endAngle, anticlockwise)
: crta lukove i krugovequadraticCurveTo(cp1x, cp1y, x, y)
: kvadratna krivulja bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
: bezierova krivuljarect(x, y, width, height)
: dodaje pravokutnu stazu u listu stazaclosePath()
: zatvara stazu stroke()
: crta obrub fill()
: crta puni oblik fillStyle, strokeStyle, lineWidth, lineJoin
su dio trenutno grafičkog stanja (eng. graphics state)save()
i restore()
- metode za spremanje i vraćanje canvas stanjasave
metoda, gura trenutno stanje na vrh stoga)strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap,
lineJoin, miterLimit, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor,
globalCompositeOperation
translate(x, y)
rotate(angle)
scale(x, y)
transform(a, b, c, d, e, f)
- metoda za direktno modificiranje transformacijske matriceKineticJS je HTML5 Canvas JavaScript biblioteka koja proširuje 2D kontekst omogućujući canvas interaktivnost za desktop i mobilne aplikacije
Rezultat je mješavina korisničkih slojeva.
Korisnički slojevi su slojevi koje programeri mogu koristiti kako god hoće. KineticJS aplikacije zahtijevaju barem jedan sloj.
Sloj iza pozornice je skriveni sloj koji koristi prilagođeni canvas kontekst za crtanje nevidljivih oblika radi visokih performansi detekcija staza i izvršavanje rukovatelja događaja oblika.
Sloj spremnika je skriveni sloj koji se koristi za detekciju slikovnih elemenata i canvas kompozicije.
var stage = new Kinetic.Stage({ container: "container", width: 578, height: 200 }); var layer = new Kinetic.Layer(); stage.add(layer);
Svi oblici se zadaju na sličan način: instanciranje željenog objekt sa željenim svojstvima (konfiguracija objekta).
var rect = new Kinetic.Rect({ x: 20, y: 50, width: 100, height: 50, fill: "#00D2FF", stroke: "black", strokeWidth: 4 }); layer.add(rect); // dodaj objekt sloju
on()
metoda koja veže rukovatelj događaja s objektom oblikamouseover, mouseout,
mousemove, mousedown, mouseup, click, dblclick, dragstart, i dragend
desktop događajeshape.on('click', function(evt){ // do stuff });
shape.on('mousedown mouseover', function(evt){ // do something });
detectionType: 'pixel'
(svojstvo konfiguracije objekta)saveData()
metoduclearData()
metodomvar image = new Kinetic.Image({ detectionType: 'pixel' }); image.saveData(); // save image data image.clearData(); // clear image data
draggable
postaviti u true
(istinito) kod inicijalizacije objektavar shape = new Kinetic.Circle({ draggable: true; }); shape.draggable(true);
transitionTo()
metodax,y,rotacija,visina, duljina,
radijus, debljina crte, alfa vrijednost, veličina
itd.transitionTo()
metodi mora imati određenu duljinu u sek koja definira koliko dugo prijelaz mora trajatishape.transitionTo({ x: 100, duration: 1 });
linear, ease-in, ease-out, ease-in-out, back-ease-in, back-ease-out,
back-ease-in-out, elastic-ease-in, elastic-ease-out, elastic-ease-in-out, bounce-ease-in,
bounce-ease-out, bounce-ease-in-out, strong-ease-in, strong-ease-out, i strong-ease-in-out
shape.transitionTo({ x: 100, duration: 1, easing: 'bounce-ease-out' });
stop()
i resume()
metodama
trans.stop(); // stop transition trans.resume(); // resume transition
start()
za inicijalizaciju canvasavar canvas; var gl; function start() { canvas = document.getElementById("glcanvas"); initWebGL(canvas); // inicijalizacija GL konteksta // nastavlja se samo ako je WebGL dostupan i radi if (gl) { gl.clearColor(0.0, 0.0, 0.0, 1.0); // Postavi boju za brisanje gl.clearDepth(1.0); // Čisti kontekst gl.enable(gl.DEPTH_TEST); // Omogućiti testianje dubine gl.depthFunc(gl.LEQUAL); // Bliže stvari skrivaju dalje } }
function initWebGL(canvas) { gl = null; try { gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl"); } catch(e) {} if (!gl) { alert("Neuspješnja inicijalizacija WebGL."); } }
Crtamo u 3D prostoru -> potrebno je postaviti programe za sjenčanje koji govore WebGL-u gdje treba crtati i što
Inicijalizacija programa za sjenčanje:function initBuffers() { // spremnik vrhova squareVerticesBuffer = gl.createBuffer(); // vezanje spremnika za kontekst gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer); var vertices = [ 1.0, 1.0, 0.0, -1.0, 1.0, 0.0, 1.0, -1.0, 0.0, -1.0, -1.0, 0.0 ]; gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); }
function drawScene() { // brisanje konteksta gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); // perspektiva kamere (pogled na scenu) // vidno polje od 45° s omjerom širine i visine 640/480 // crtamo predmete između 0.1 i 100 jedinica perspectiveMatrix = makePerspective(45, 640.0/480.0, 0.1, 100.0); // postavljanje pozicije objekta loadIdentity(); // mvMatrix = Matrix.I(4); mvTranslate([-0.0, 0.0, -6.0]); gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer); gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0); setMatrixUniforms(); gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); // crta 0bjekt }
var colors = [ 1.0, 1.0, 1.0, 1.0, // bijela 1.0, 0.0, 0.0, 1.0, // crvena 0.0, 1.0, 0.0, 1.0, // zelena 0.0, 0.0, 1.0, 1.0 // plava ]; squareVerticesColorBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesColorBuffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
var renderer = new THREE.WebGLRenderer({antialias: true}); renderer.setSize(document.body.clientWidth, document.body.clientHeight);
document.body.appendChild(renderer.domElement);
// new THREE.PerspectiveCamera( FOV, viewAspectRatio, zNear, zFar ); var camera = new THREE.PerspectiveCamera(45, width/height, 1, 10000); camera.position.z = 300;
var scene = new THREE.Scene(); var sphere = new THREE.Mesh(new THREE.SphereGeometry(50, 16, 16), new THREE.MeshLambertMaterial({color: 0xCC0000})); scene.add(sphere);
renderer.render(scene, camera);
var light = new THREE.SpotLight(); light.position.set( 10, 50, 130 ); scene.add(light);
// omogućiti sijene za prikaz scene renderer.shadowMapEnabled = true; // omogućiti sjene za svijetlo light.castShadow = true; // omogućiti sjene za objekt sphere.castShadow = true; sphere.receiveShadow = true;
var projector = new THREE.Projector(); window.addEventListener('mousedown', function (ev){ if (ev.target == renderer.domElement) { var x = ev.clientX; var y = ev.clientY; var v = new THREE.Vector3((x/width)*2-1, -(y/height)*2+1, 0.5); projector.unprojectVector(v, camera); var ray = new THREE.Ray(camera.position, v.subSelf(camera.position).normalize()); var intersects = ray.intersectObjects(controller.objects); if (intersects.length > 0) { controller.setCurrent(intersects[0].object); } } }, false);