찾다
웹 프론트엔드H5 튜토리얼HTML5 고급 프로그래밍 그래픽 왜곡과 그 응용 3(확장)

이 글은 이 시리즈의 세 번째 글입니다. 처음 두 글에서는 HTML5에서 이미지 왜곡 효과를 얻는 원리와 drawtriangles 기능의 자세한 사용법을 소개합니다.

drawtriangles 기능의 확장을 살펴보겠습니다. drawtriangles 기능을 사용하여 회전하는 3D 지구를 구현하면 효과는 다음과 같습니다


lufylegend 버전 1.5.0의 drawtriangles 기능에 버그가 있어서 조용히 lufylegend 버전 1.5.1을 업데이트했습니다. 아래 공식 홈페이지에서 다운로드 받으실 수 있습니다. 주소:

http: //lufylegend.com/lufylegend

실제로 3D 구형 효과를 그리려면 먼저 평면을 그린 다음 평면을 작은 삼각형으로 나눈 다음 이를 사용합니다.

이제 먼저 빈 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 좌표가 계산되지 않았기 때문입니다. 그러나 다음과 같이 특별한 수치가 얻어집니다


다음으로 x의 좌표가 어떻게 계산되는지 살펴보겠습니다. 먼저 반경이 r1인 평면 단면을 꺼냅니다. , 아래와 같이


삼각함수를 이용하여 그래프의 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);
	}
}

인 경우 다음과 같이 완전한 구형 그래픽을 얻을 수 있습니다


다음 단계는 간단합니다. 빈 그림을 지구의 평면도로 바꾸세요. 코드는 다음과 같습니다

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

코드를 다시 실행하면 다음과 같은 3D 그래픽을 얻을 수 있습니다


이제 지구를 회전시킬 차례입니다. 이전 기사에서 언급했듯이 drawtriangles 함수에 전달된 uvtData 배열의 요소는 각 작은 항목의 상대적 위치입니다. 원본 그림의 삼각형은 그림을 그리는 시작 위치를 결정합니다. 0123과 같은 위치 집합이 변경되면 위치는 1230이 되고 계속해서 2301로 변환됩니다. 그런 다음 코드에서는 분할된 배열을 각 열에 따라 이동하기만 하면 됩니다. 매번 첫 번째 열의 두 세트의 삼각형을 마지막 열로 이동하면 됩니다. 두 번째 열의 삼각형 세트가 첫 번째 열이 되므로 지속적인 변형으로 인해 지구가 회전할 수 있습니다

for (i = 0; i <= rows; i++) {
	uvtData.push(uvtData.shift());
	uvtData.push(uvtData.shift());
}

원하는 경우 지구의 크기를 변경하는 것이 LSprite의 scaleX 및 scaleY 속성을 변경하는 것이 더 간단합니다. 개체의 크기를 변경할 수 있습니다.

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


주의사항:

다시 한번 말씀드리지만, 본 글에서 소개하는 내용은 HTML5 오픈소스 버전 1.5.1 이상의 지원이 필요합니다. lufylegend 버전 1.5.1의 출시 주소는 다음과 같습니다


http://lufylegend.com /lufylegend

위는 HTML5 Advanced Program Graphic Distortion의 내용입니다. 및 응용프로그램 III(확장)에 대한 자세한 내용은 PHP 중국어 웹사이트(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 Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경