検索
ホームページウェブフロントエンドH5 チュートリアルHTML5 高度なプログラミング グラフィックの歪みとその応用 3 (拡張版)

これはシリーズの 3 番目の記事です。最初の 2 つの記事では、HTML5 で画像の歪み効果を実現する原理と、drawtriangles 関数の詳細な使用法を紹介しました。

drawtriangles関数の拡張。 drawtriangles関数を使って回転な3D地球を実現します。効果は以下の通りです


lufylegend1.5.0バージョンのdrawtriangles関数にバグがあるのでひっそりやってみました。更新された lufylegend1.5.1 バージョンは、公式 Web サイトからダウンロードできます。アドレスは次のとおりです

http://lufylegend.com/lufylegend

実際、3D 球体エフェクトを描画するには、まず平面を描画する必要があります次に、平面を 1 つずつ小さな三角形に分割し、これらの小さな三角形をまとめてボールにします

さて、最初に空の LBitmapData オブジェクトを作成し、このオブジェクトを N 個の小さな三角形に分割します。以下のコードを参照してください

earthBitmapData = new LBitmapData("#ffffff", 0, 0, 500, 300);
var i, j;
vertices = new Array();
for(i=0;i<=cols;i++){
	for(j=0;j<=rows;j++){
		vertices.push(i*15,j*15);
	}
}
indices = new Array();
for (i = 0; i < cols; i++) {
	for (j = 0; j < rows; j++) {
		indices.push(i * (rows + 1) + j, (i + 1) * (rows + 1) + j, i * (rows + 1) + j + 1);
		indices.push((i + 1) * (rows + 1) + j, i * (rows + 1) + j + 1, (i + 1) * (rows + 1) + j + 1);
	}
}
uvtData = new Array();
for (i = 0; i <= cols; i++) {
	for (j = 0; j <= rows; j++) {
		uvtData.push(i / cols, j / rows);
	}
}

次に、drawtriangles 関数を使用して LBitmapData を変換します。オブジェクトが画面上に描画されます

backLayer = new LSprite();
addChild(backLayer);
backLayer.graphics.clear();
backLayer.graphics.beginBitmapFill(earthBitmapData);
backLayer.graphics.drawTriangles(vertices, indices, uvtData, 2);

。その効果は以下のようになります。


この平面を円にプログラムしたい場合は、画像内の各小さな三角形の座標を計算する必要があります。まず、下の画像を見てください。はボールの垂直断面です


三角関数を使用して、図のy座標と、y座標の位置におけるボールの水平断面円の半径r1を計算します

var a = Math.sin(angle);
if((90-180*j/rows)%90==0 && (90-180*j/rows)%180!=0)a=(90-180*j/rows)>0?1:-1;
var y =  -r*a;
var sa = Math.cos(angle);
var r1 =  Math.abs(r*sa);

ので、まず計算されたy座標を頂点配列に入れる

for(i=0;i<=cols;i++){
	for(j=0;j<=rows;j++){
		var angle = (90-180*j/rows)*Math.PI/180;
		var a = Math.sin(angle);
		if((90-180*j/rows)%90==0 && (90-180*j/rows)%180!=0)a=(90-180*j/rows)>0?1:-1;
		if((90-180*j/rows)%180==0)a=0;
		var sy =  -r*a;
		vertices.push(i*15,sy);
	}
}

というのも、

三角関数を使ってグラフ内のx座標を計算する

var b = Math.cos(angle*Math.PI/180);
var x =  r1*b;
この時、計算されたx座標を頂点配列に入れるだけなら
for(i=0;i<=cols;i++){
	for(j=0;j<=rows;j++){
		var sa = Math.cos(angle);
		if((90-180*j/rows)%180==0)sa=1;
		var sr =  Math.abs(r*sa);
		var angle2 = 360*(i+1)/cols;
		var b = Math.cos(angle2*Math.PI/180);
		if(angle2%360==0)b=1;
		else if(angle2%180==0)b=-1;
		var sx =  sr*b;
		vertices.push(sx,j*15);
	}
}

だからY 座標は計算されませんが、次のように非常に興味深いグラフが得られます


計算された X 座標と Y 座標を同時に頂点配列に取り込むと、完全な球体が得られます。次のステップは簡単です。空白の画像を地球の平面図に置き換えます。コードは次のとおりです

for(i=0;i<=cols;i++){
	for(j=0;j<=rows;j++){
		var angle = (90-180*j/rows)*Math.PI/180;
		var a = Math.sin(angle);
		if((90-180*j/rows)%90==0 && (90-180*j/rows)%180!=0)a=(90-180*j/rows)>0?1:-1;
		if((90-180*j/rows)%180==0)a=0;
		var sy =  -r*a;
		var sa = Math.cos(angle);
		if((90-180*j/rows)%180==0)sa=1;
		var sr =  Math.abs(r*sa);
		var angle2 = 360*(i+1)/cols;
		var b = Math.cos(angle2*Math.PI/180);
		if(angle2%360==0)b=1;
		else if(angle2%180==0)b=-1;
		var sx =  sr*b;
		vertices.push(sx, sy);
	}
}

コードを再度実行すると、次の 3D グラフィックが得られます

さて、前回の記事で紹介した内容に従って、アップロードします。drawtriangles関数に入力されるuvtData配列の要素は、元の画像内の各小さな三角形の相対位置です。描画の開始位置を決定します。たとえば、0123 のような一連の位置を変換すると、その位置は 1230 になり、さらに 2301 まで変換されます。このように連続的に位置が変化すると、視覚的には実際に回転したことになります。達成したら、コード内で各列に従って分割された配列を移動し、そのたびに最初の列の 2 つのグループを移動するだけです。三角形を最後の列に移動して、2 番目の列に 2 つの三角形のセットが配置されるようにします。この一定の変換により地球を回転させることができます

earthBitmapData = new LBitmapData(imglist["earth"]);

地球のサイズを変更したい場合は、LSprite オブジェクトのscaleX プロパティとscaleY プロパティを変更することで、さらに簡単にサイズを変更できます。効果をテストするには、下のリンクをクリックしてください

http://lufy.netne.net/lufylegend-js/3dearth/index.html


注:

で紹介した内容をもう一度、この記事では、HTML5 オープンソース エンジン lufylegend のバージョン 1.5.1 以降のサポートが必要です。lufylegend バージョン 1.5.1 のリリース アドレスは次のとおりです

http://lufylegend.com/lufylegend

上記はHTML5 Advanced Programming Graphic Distortion and its Application III (Extension) の内容 詳細については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
html5的div一行可以放两个吗html5的div一行可以放两个吗Apr 25, 2022 pm 05:32 PM

html5的div元素默认一行不可以放两个。div是一个块级元素,一个元素会独占一行,两个div默认无法在同一行显示;但可以通过给div元素添加“display:inline;”样式,将其转为行内元素,就可以实现多个div在同一行显示了。

html5中列表和表格的区别是什么html5中列表和表格的区别是什么Apr 28, 2022 pm 01:58 PM

html5中列表和表格的区别:1、表格主要是用于显示数据的,而列表主要是用于给数据进行布局;2、表格是使用table标签配合tr、td、th等标签进行定义的,列表是利用li标签配合ol、ul等标签进行定义的。

html5怎么让头和尾固定不动html5怎么让头和尾固定不动Apr 25, 2022 pm 02:30 PM

固定方法:1、使用header标签定义文档头部内容,并添加“position:fixed;top:0;”样式让其固定不动;2、使用footer标签定义尾部内容,并添加“position: fixed;bottom: 0;”样式让其固定不动。

html5中不支持的标签有哪些html5中不支持的标签有哪些Mar 17, 2022 pm 05:43 PM

html5中不支持的标签有:1、acronym,用于定义首字母缩写,可用abbr替代;2、basefont,可利用css样式替代;3、applet,可用object替代;4、dir,定义目录列表,可用ul替代;5、big,定义大号文本等等。

HTML5中画布标签是什么HTML5中画布标签是什么May 18, 2022 pm 04:55 PM

HTML5中画布标签是“<canvas>”。canvas标签用于图形的绘制,它只是一个矩形的图形容器,绘制图形必须通过脚本(通常是JavaScript)来完成;开发者可利用多种js方法来在canvas中绘制路径、盒、圆、字符以及添加图像等。

html5废弃了哪个列表标签html5废弃了哪个列表标签Jun 01, 2022 pm 06:32 PM

html5废弃了dir列表标签。dir标签被用来定义目录列表,一般和li标签配合使用,在dir标签对中通过li标签来设置列表项,语法“<dir><li>列表项值</li>...</dir>”。HTML5已经不支持dir,可使用ul标签取代。

Html5怎么取消td边框Html5怎么取消td边框May 18, 2022 pm 06:57 PM

3种取消方法:1、给td元素添加“border:none”无边框样式即可,语法“td{border:none}”。2、给td元素添加“border:0”样式,语法“td{border:0;}”,将td边框的宽度设置为0即可。3、给td元素添加“border:transparent”样式,语法“td{border:transparent;}”,将td边框的颜色设置为透明即可。

html5为什么只需要写doctypehtml5为什么只需要写doctypeJun 07, 2022 pm 05:15 PM

因为html5不基于SGML(标准通用置标语言),不需要对DTD进行引用,但是需要doctype来规范浏览器的行为,也即按照正常的方式来运行,因此html5只需要写doctype即可。“!DOCTYPE”是一种标准通用标记语言的文档类型声明,用于告诉浏览器编写页面所用的标记的版本。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン