3D空间坐标以及3D图形的制作

本文深入探讨3D空间坐标系的原理,详细解释如何构建和操作3D图形。从基本的3D坐标轴到复杂的变换矩阵,通过实例解析如何在计算机中实现3D图形的绘制,为读者提供全面的3D图形制作指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3D图形制作的一般流程是:

1.动态创建多个“块级”元素

2.在css中给创建的块级元素添加背景图,或者给块级元素设置文字

3.把整体的3D图形进行“拆分”,分成“多层”(3D图形由“无限层”构成),每层又由多个的元素所构成

4.给动态创建的每个元素添加自定义属性,用来设置元素在三位空间的位置(x,y,z), 偏转角度等

5.用js给每个创建的元素添加css的3d样式transform;

下面是一些实例:

1.球坐标:

在编程思维里,三维坐标的x,y,z轴的公式如下:

x=r*sinθ*sinφ

y=r*cosθ

z=r*sinθ*cosφ

window.οnlοad=function(){
	
	var oScene=document.getElementById("scene");
	var oBox=document.getElementById("box");
	var oUl=oBox.getElementsByClassName("ring")[0];
	var aLi=oUl.getElementsByTagName("li");
	
	//首先定义一个数组,用来确定球体上有多少层(类似于地球仪上的纬度圈数,还是对称的)
	//而且数组中的元素值代表每一层拥有的文字个数
	//var arr=[1,3,5,7,9,11,9,7,5,3,1]; //一共有11层
	//生成li,有多少个文字,就有多少个li
	
	//根据输入的文字的“个数”来动态生成arr数组
	var s="等会睡觉咯哈客人户而悔恨和腿还是你解决额如何退我我我回头 就可能和空姐然后年来看你饥渴啊龟儿哈就那就快点离开感觉饿接电话经济后果热哦历史的记录今日哦价格是打开就会如何能看呵呵上课了快捷回复日回会内科教授人海曙科黑日期控件";
	var textNum=-1;
	var layer=0;
	var num=0;
	var temp=[];
	//根据输入的文字,确定层数.在这里,最小4层,最大12层(输入的文字不超过350个)
	for(var i=4;i<13;i++){
		num=i*i+(i+1)*(i+1);  //所有层上文字的总和
		if(num>=s.length){
			layer=(i-1)*2+1;
			break;
		}
		layer=(i-1)*2+1;
	}
	//根据上面的层数,确定一个数组
	for(var i=0;i<layer;i++){
		//计算每层的文字个数
		if(i<(layer+1)/2){
			textNum+=2;   //-1+2=1     
		}else{
			textNum+=-2;
		}
		temp.push(textNum);
	}
	
	var theta=Math.PI/(temp.length-1);
	var phi=0;
	var r=150;
	var index=0;//从字符串s的第一个字符开始取值
	for(var i=0;i<temp.length;i++){
		
		phi=2*Math.PI/temp[i];
		for(var j=0;j<temp[i];j++){
			
			var oLi=document.createElement("li");
			oLi.innerHTML=s[index];
			index++;
			//给每个li添加一些属性,用来控制每个文字(即li)在球上的位置
			fnLiPosition(oLi,theta,phi,150,i,j);
			oUl.appendChild(oLi);
		}
	}
	
	//改变每个li在3d上的位置
	for(var i=0;i<aLi.length;i++){
		aLi[i].style.transform='translate3D('+aLi[i].X+'px,'+aLi[i].Y+'px,'+aLi[i].Z+'px) rotateY('+aLi[i].degPhi+'rad) rotateX('+aLi[i].degTheta+'rad)';
	}
	
	//旋转scene
	var angle=0;
	setInterval(function(){
		angle++;
		oBox.style.transform='rotateX('+angle+'deg) rotateY('+angle+'deg)';
	},60);

	//第i层的角度是theta*i,第i层第j个li的phi角度是:phi*j
	function fnLiPosition(obj,theta,phi,r,i,j){
		obj.X=r*Math.sin(theta*i)*Math.sin(phi*j)+200;//加200是为了让其在scene的中间显示
		obj.Y=-r*Math.cos(theta*i)+200;  //加负号是为了让其从上往下看,否则是从下往上
		obj.Z=r*Math.sin(theta*i)*Math.cos(phi*j);
		//每个li的偏转角度
		obj.degTheta=-Math.PI/2+theta*(temp.length-i);//让其从i到0
		obj.degPhi=phi*j;
	};
}


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值