<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 prazan
var 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đaje
shape.on('click', function(evt){
// do stuff
});
shape.on('mousedown mouseover', function(evt){
// do something
});
detectionType: 'pixel'
(svojstvo konfiguracije objekta)saveData() metoduclearData() metodom
var image = new Kinetic.Image({
detectionType: 'pixel'
});
image.saveData(); // save image data
image.clearData(); // clear image data
draggable postaviti u true (istinito) kod inicijalizacije objekta
var 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 trajati
shape.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 canvasa
var 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);