Dies ist ein weiteres 3D-Animationsmeisterwerk, das auf HTML5 Canvas basiert. Es handelt sich um einen 3D-Kleiderschaukel-Spezialeffekt, der im Wind flattern kann, was sehr realistisch ist. Wenn wir mit der Maus über die Kleidung fahren, schwankt die Kleidung. Wenn wir mit der Maus klicken, schwingt die Kleidung heftiger.
Online-Demo Quellcode-Download
HTML-Code
XML/HTML-CodeInhalt in die Zwischenablage kopieren
- <div style="width:500px;margin :10px auto">
-
<Leinwand id="cv" Breite="480" Höhe="300">Leinwand>
-
<p>Demo „3D auf 2D-Leinwand“< /p>
-
<p>Cursor zum Schwenken bewegen / klicken zum Schwenken< ;/p>
-
div>
JS-Code der P3D-Bibliothek, der hauptsächlich zur Verarbeitung von 3D-Effekten verwendet wird
JavaScript-CodeInhalt in die Zwischenablage kopieren
- window.P3D = {
-
Textur: null,
-
g: null
- };
-
-
P3D.clear = Funktion(f, w, h) {
-
var g = this.g;
- g.beginPath();
- g.fillStyle = f;
- g.fillRect(0, 0, w, h);
-
- }
-
-
P3D.num_cmp = Funktion(a,b){return a-b;}
-
-
P3D.drawTriangle = function(poss, uvs, shade_clr) {
-
var w = this.texture.width;
-
var h = this.texture.height;
-
-
var g = this.g;
-
-
var vAd = [ poss[1].x - poss[0].x , poss[1].y - poss[0].y ] ;
-
var vBd = [ poss[2].x - poss[0].x , poss[2].y - poss[0].y ] ;
-
-
var vA = [ uvs[1].u - uvs[0].u , uvs[1].v - uvs[0].v ] ;
-
var vB = [ uvs[2].u - uvs[0].u , uvs[2].v - uvs[0].v ] ;
-
- vA[0] *= w;
- vA[1] *= h;
-
- vB[0] *= w;
- vB[1] *= h;
-
-
var m = neu M22();
- m._11 = vA[0];
- m._12 = vA[1];
- m._21 = vB[0];
- m._22 = vB[1];
-
-
var im = m.getInvert();
-
if (!im) return false;
-
-
var a = im._11 * vAd[0] im._12 * vBd[0];
-
var b = im._21 * vAd[0] im._22 * vBd[0];
-
-
var c = im._11 * vAd[1] im._12 * vBd[1];
-
var d = im._21 * vAd[1] im._22 * vBd[1];
-
-
var wu = uvs[0].u * w;
-
var hv = uvs[0].v * h;
-
var du = wu * a hv * b;
-
var dv = wu * c hv * d;
-
- g.save();
-
- g.beginPath();
- g.moveTo(poss[0].x, poss[0].y);
- g.lineTo(poss[1].x, poss[1].y);
- g.lineTo(poss[2].x, poss[2].y);
- g.clip();
-
- g.transform(a, c, b, d, poss[0].x - du, poss[0].y - dv);
-
-
-
var bx = [wu, wu vA[0], wu vB[0]];
-
var by = [hv, hv vA[1], hv vB[1]];
-
- bx.sort(P3D.num_cmp);
- by.sort(P3D.num_cmp);
-
-
var bw = bx[2] - bx[0];
-
var bh = by[2] - by[0];
-
-
if ((bx[0] bw) <= (w-1)) bw ;
- if ((by[0] bh) <= (h-1)) bh ;
- if (bx[0] >= 1) {bx[0]--; bw ;}
-
if (by[0] >= 1) {by[0]--; bh ;}
-
-
g.drawImage(this.texture, bx[0], by[0], bw, bh, bx[0], by[0], bw, bh);
-
-
if (shade_clr) {
- g.fillStyle = shade_clr;
- g.fillRect(bx[0], by[0], bw, bh);
- }
-
- g.restore();
-
-
zurück wahr;
- }
-
-
P3D.drawTestByIndexBuffer = function(pos_buf, ix_buf, culling) {
-
var g = this.g;
-
-
if ((ix_buf.length%3) != 0)
-
throw "ungültige Indexpufferlänge!";
-
-
var len = ix_buf.length/3;
-
-
var i, ibase, vbase;
-
var poss = [{},{},{}];
- g.StrokeWidth = 1;
-
for (i = 0, ibase = 0;i < len; i)
- {
- vbase = ix_buf[ibase ] << 2;
- poss[0].x = pos_buf[vbase ];
- poss[0].y = pos_buf[vbase ];
-
- vbase = ix_buf[ibase ] << 2;
- poss[1].x = pos_buf[vbase ];
- poss[1].y = pos_buf[vbase ];
-
- vbase = ix_buf[ibase ] << 2;
- poss[2].x = pos_buf[vbase ];
- poss[2].y = pos_buf[vbase ];
-
-
-
- var Ax = poss[1].x - poss[0].x;
- var Ay = poss[1].y - poss[0].y;
- var Cx = poss[2].x - poss[1].x;
- var Cy = poss[2].y - poss[1].y;
-
- var cull = ( (((Ax * Cy) - (Ay * Cx))*culling) < 0);
-
- g.beginPath();
- g.strokeStyle = cull ? "#592" : "#0f0";
- g.moveTo(poss[0].x, poss[0].y);
- g.lineTo(poss[1].x, poss[1].y);
- g.lineTo(poss[2].x, poss[2].y);
- g.lineTo(poss[0].x, poss[0].y);
- g.stroke();
- }
- }
-
- P3D.drawByIndexBuffer = function(pos_buf, ix_buf, tx_buf, culling, z_clip) {
- var w, h;
- var color_polygon = !this.texture;
- if (this.texture) {
- w = this.texture.width;
- h = this.texture.height;
- }
-
- var g = this.g;
- var m = neu M22();
-
- if (!culling) culling = 0;
-
- if ((ix_buf.length%3) != 0)
- throw "ungültige Indexpufferlänge!";
-
- var i, ibase, vbase, tbase, poss = [{},{},{}];
- var len = ix_buf.length/3;
- var uv_0u, uv_0v, uv_1u, uv_1v, uv_2u, uv_2v;
-
- for (i = 0, ibase = 0;i < len; i)
- {
- tbase = ix_buf[ibase ] << 1
- vbase = tbase << 1;
- poss[0].x = pos_buf[vbase ]; uv_0u = tx_buf[tbase ];
- poss[0].y = pos_buf[vbase ]; uv_0v = tx_buf[tbase];
- if (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) {ibase = 2; weiter;}
-
-
tbase = ix_buf[ibase ] << 1
- vbase = tbase << 1;
- poss[1].x = pos_buf[vbase ]; uv_1u = tx_buf[tbase ];
- poss[1].y = pos_buf[vbase ]; uv_1v = tx_buf[tbase];
- if (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) { ibase; weiter;}
-
-
tbase = ix_buf[ibase ] << 1
- vbase = tbase << 1;
- poss[2].x = pos_buf[vbase ]; uv_2u = tx_buf[tbase ];
- poss[2].y = pos_buf[vbase ]; uv_2v = tx_buf[tbase];
- if (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) {continue;}
-
-
var vAd = [ poss[1].x - poss[0].x , poss[1].y - poss[0].y ] ;
-
var vBd = [ poss[2].x - poss[0].x , poss[2].y - poss[0].y ] ;
-
-
var vCd = [ poss[2].x - poss[1].x , poss[2].y - poss[1].y ] ;
-
-
- if( (((vAd[0] * vCd[1]) - (vAd[1] * vCd[0]))*culling) < ; 0)
- weiter;
-
- if (color_polygon) {
- g.fillStyle = uv_0u;
-
- g.beginPath();
- g.moveTo(poss[0].x, poss[0].y);
- g.lineTo(poss[1].x, poss[1].y);
- g.lineTo(poss[2].x, poss[2].y);
- g.fill();
- weiter;
- }
-
- var vA = [ uv_1u - uv_0u , uv_1v - uv_0v ];
- var vB = [ uv_2u - uv_0u , uv_2v - uv_0v ];
-
- vA[0] *= w;
- vA[1] *= h;
-
- vB[0] *= w;
- vB[1] *= h;
-
- m._11 = vA[0];
- m._12 = vA[1];
- m._21 = vB[0];
- m._22 = vB[1];
-
- var im = m.getInvert();
- if (!im) { continue;}
-
- var a = im._11 * vAd[0] im._12 * vBd[0];
- var b = im._21 * vAd[0] im._22 * vBd[0];
-
- var c = im._11 * vAd[1] im._12 * vBd[1];
- var d = im._21 * vAd[1] im._22 * vBd[1];
-
- var wu = uv_0u * w;
- var hv = uv_0v * h;
- var du = wu * a hv * b;
- var dv = wu * c hv * d;
-
- g.save();
-
- g.beginPath();
- g.moveTo(poss[0].x, poss[0].y);
- g.lineTo(poss[1].x, poss[1].y);
- g.lineTo(poss[2].x, poss[2].y);
- g.clip();
- g.transform(a, c, b, d, poss[0].x - du, poss[0].y - dv);
-
-
- var bx = [wu, wu vA[0], wu vB[0]];
- var by = [hv, hv vA[1], hv vB[1]];
-
- bx.sort(P3D.num_cmp);
- by.sort(P3D.num_cmp);
-
- var bw = bx[2] - bx[0];
- var bra = by[2] - by[0];
-
- if ((bx[0] bw) <= (w-1)) bw ;
- if ((by[0] bra) <= (h-1)) bra ;
- if (bx[0] >= 1) {bx[0]--; bw ;}
-
if (by[0] >= 1) {by[0]--; BH ;}
-
-
g.drawImage(this.texture, bx[0], by[0], bw, bh, bx[0], by[0], bw, bh);
-
-
-
-
-
-
- g.restore();
-
- }
-
- }
-
-
Funktion Vec3(_x, _y, _z)
- {
-
dieses.x = _x || 0;
-
dieses.y = _y || 0;
-
dieses.z = _z || 0;
- }
-
- Vec3.prototype = {
-
Null: Funktion() {
-
dieses.x = dieses.y = dieses.z = 0;
- },
-
-
sub: Funktion(v) {
-
dieses.x -= v.x;
-
dieses.y -= v.y;
-
dieses.z -= v.z;
-
-
zurückgeben dies;
- },
-
-
hinzufügen: Funktion(v) {
-
dieses.x = v.x;
-
dieses.y = v.y;
-
dieses.z = v.z;
-
-
zurückgeben dies;
- },
-
-
copyFrom: function(v) {
-
dieses.x = v.x;
-
dieses.y = v.y;
-
dieses.z = v.z;
-
-
zurückgeben dies;
- },
-
-
norm:Funktion() {
-
return Math.sqrt(this.x*this.x dieses.y*dieses.y dieses.z *dies.z);
- },
-
-
normalisieren: Funktion() {
-
var nrm = Math.sqrt(this.x*this.x dieses.y*dieses.y dieses .z*dies.z);
-
if (nrm != 0)
- {
-
dieses.x /= nrm;
-
dieses.y /= nrm;
-
dieses.z /= nrm;
- }
-
zurückgeben dies;
- },
-
-
smul: Funktion(k) {
-
dieses.x *= k;
-
dieses.y *= k;
-
dieses.z *= k;
-
-
zurückgeben dies;
- },
-
-
dpWith: function(v) {
-
zurückgeben dieses.x*v.x dieses. y*v.y dies.z*v.z;
- },
-
-
cp: Funktion(v, w) {
-
dies.x = (w.y * v.z) - (w.z * v.y);
-
dies.y = (w.z * v.x) - (w.x * v.z);
-
dies.z = (w.x * v.y) - (w.y * v.x);
-
-
zurückgeben dies;
- },
-
-
toString: function() {
-
zurück dies.x ", " dieses.y "," dieses.z;
- }
- }
-
-
Funktion M44(cpy)
- {
-
if (cpy)
-
dieses.copyFrom(cpy);
-
sonst {
-
dieses.ident();
- }
- }
-
- M44.prototype = {
-
ident: function() {
-
dieses._12 = dieses._13 = dieses._14 = 0;
-
dieses._21 = dieses._23 = dieses._24 = 0;
-
dieses._31 = dieses._32 = dieses._34 = 0;
-
dieses._41 = dieses._42 = dieses._43 = 0;
-
-
dieses._11 = dieses._22 = dieses._33 = dieses._44 = 1;
-
-
zurückgeben dies;
- },
-
-
copyFrom: function(m) {
-
dieses._11 = m._11;
-
dieses._12 = m._12;
-
dieses._13 = m._13;
-
dieses._14 = m._14;
-
-
dieses._21 = m._21;
-
dieses._22 = m._22;
-
dieses._23 = m._23;
-
dieses._24 = m._24;
-
-
dieses._31 = m._31;
-
dieses._32 = m._32;
-
dieses._33 = m._33;
-
dieses._34 = m._34;
-
-
dieses._41 = m._41;
-
dieses._42 = m._42;
-
dieses._43 = m._43;
-
dieses._44 = m._44;
-
-
zurückgeben dies;
- },
-
-
transVec3: Funktion(out, x, y, z) {
-
out[0] = x * dieses._11 y * dieses._21 z * dieses._31 dieses._41;
-
out[1] = x * dieses._12 y * dieses._22 z * dieses._32 dieses._42;
-
out[2] = x * dieses._13 y * dieses._23 z * dieses._33 dieses._43;
-
out[3] = x * dieses._14 y * dieses._24 z * dieses._34 dieses._44;
- },
-
-
transVec3Rot: Funktion(out, x, y, z) {
-
out[0] = x * dieses._11 y * dieses._21 z * dieses._31;
-
out[1] = x * dieses._12 y * dieses._22 z * dieses._32;
-
out[2] = x * dieses._13 y * dieses._23 z * dieses._33;
- },
-
-
PerspektiveLH: Funktion(vw, vh, z_near, z_far) {
-
dieses._11 = 2.0*z_near/vw;
-
dieses._12 = 0;
-
dieses._13 = 0;
-
dieses._14 = 0;
-
-
dieses._21 = 0;
-
dies._22 = 2*z_near/vh;
-
dieses._23 = 0;
-
dieses._24 = 0;
-
-
dieses._31 = 0;
-
dieses._32 = 0;
-
dies._33 = z_far/(z_far-z_near);
-
dieses._34 = 1;
-
-
dieses._41 = 0;
-
dieses._42 = 0;
-
dies._43 = z_near*z_far/(z_near-z_far);
-
dieses._44 = 0;
-
-
zurückgeben dies;
- },
-
-
lookAtLH: function(aUp, aFrom, aAt) {
-
var aX = neu Vec3();
-
var aY = neu Vec3();
-
-
var aZ = neu Vec3(aAt.x, aAt.y, aAt.z);
- aZ.sub(aFrom).normalize();
-
- aX.cp(aUp, aZ).normalize();
- aY.cp(aZ, aX);
-
-
dieses._11 = aX.x; dies._12 = aY.x; dieses._13 = aZ.x; dieses._14 = 0;
-
dieses._21 = aX.y; dieses._22 = aY.y; dies._23 = aZ.y; dieses._24 = 0;
-
dieses._31 = aX.z; dies._32 = aY.z; dieses._33 = aZ.z; dieses._34 = 0;
-
-
dies._41 = -aFrom.dpWith(aX);
-
dies._42 = -aFrom.dpWith(aY);
-
dies._43 = -aFrom.dpWith(aZ);
-
dieses._44 = 1;
-
-
zurückgeben dies;
- },
-
-
mul: Funktion(A, B) {
-
dieses._11 = A._11*B._11 A._12*B._21 A._13*B._31 A._14*B._41 ;
-
dies._12 = A._11*B._12 A._12*B._22 A._13*B._32 A._14*B._42 ;
-
dies._13 = A._11*B._13 A._12*B._23 A._13*B._33 A._14*B._43 ;
-
dies._14 = A._11*B._14 A._12*B._24 A._13*B._34 A._14*B._44 ;
-
-
dies._21 = A._21*B._11 A._22*B._21 A._23*B._31 A._24*B._41 ;
-
dies._22 = A._21*B._12 A._22*B._22 A._23*B._32 A._24*B._42 ;
-
dies._23 = A._21*B._13 A._22*B._23 A._23*B._33 A._24*B._43 ;
-
dies._24 = A._21*B._14 A._22*B._24 A._23*B._34 A._24*B._44 ;
-
-
dies._31 = A._31*B._11 A._32*B._21 A._33*B._31 A._34*B._41 ;
-
dieses._32 = A._31*B._12 A._32*B._22 A._33*B._32 A._34*B._42 ;
-
dies._33 = A._31*B._13 A._32*B._23 A._33*B._33 A._34*B._43 ;
-
dies._34 = A._31*B._14 A._32*B._24 A._33*B._34 A._34*B._44 ;
-
-
dies._41 = A._41*B._11 A._42*B._21 A._43*B._31 A._44*B._41 ;
-
dies._42 = A._41*B._12 A._42*B._22 A._43*B._32 A._44*B._42 ;
-
dies._43 = A._41*B._13 A._42*B._23 A._43*B._33 A._44*B._43 ;
-
dieses._44 = A._41*B._14 A._42*B._24 A._43*B._34 A._44*B._44 ;
-
-
zurückgeben dies;
- },
-
-
traduire : fonction(x, y, z) {
-
ceci._11 = 1 ; ce._12 = 0 ; ce._13 = 0 ; ce._14 = 0;
-
ceci._21 = 0 ; ce._22 = 1 ; ce._23 = 0 ; ce._24 = 0 ;
-
ce._31 = 0 ; ce._32 = 0; ce._33 = 1 ; ce._34 = 0;
-
-
ce._41 = x; ce._42 = y ; ce._43 = z ; ce._44 = 1 ;
-
retourner ceci ;
- },
-
-
transpose33 : fonction() {
-
var t;
-
-
t = ce._12;
-
ce._12 = ce._21;
-
ce._21 = t ;
-
-
t = ce._13;
-
ce._13 = ce._31;
-
ceci._31 = t ;
-
-
t = ce._23;
-
ce._23 = ce._32;
-
ceci._32 = t;
-
-
retourner ceci ;
- },
-
-
-
glRotate : fonction(angle, x, y, z) {
-
var s = Math.sin( angle );
-
var c = Math.cos( angle );
-
-
var xx = x * x;
-
var yy = y * y;
-
var zz = z * z;
-
var xy = x * y;
-
var yz = y * z;
-
var zx = z * x;
-
var xs = x * s;
-
var ys = y * s;
-
var zs = z * s;
-
var one_c = 1.0 - c;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-